2016-02-13 2 views
0

Я пытаюсь сказать, сталкиваются ли два rectangles. У меня нет проблем, если прямоугольники не вращаются, но у меня возникают некоторые проблемы в моей логике, когда они вращаются. Вот мой метод я в настоящее время с помощью:обнаружение столкновения java между двумя вращающимися прямоугольниками

public static void car_on_ai_collision(AI ai, Entity e){ 

     //rotation of each rectangle in radians 
     double ai_rot = ai.getAIEntity().getRotation().y; 
     double car_rot = e.getRotation().y; 

     //stores the center point of the rectangles 
     Vector3f ai_loc = ai.getAIEntity().getLocation(); 
     Vector3f car_loc = e.getLocation(); 

     //here i am lining the square for my car up to a axis by making it have no rotation 
     ai_rot -= car_rot; 
     car_rot = 0; 

     //creating rectangles with the size of the car 
     Rectangle car = new Rectangle(175, 70); 
     Rectangle ai_rec = new Rectangle(175, 70); 


     car.translate((int) ((int) car_loc.x-87.5), (int) car_loc.z-35); 

     //rotation for rectangle 
     AffineTransform aiAT = new AffineTransform(); 
     aiAT.translate((int) ai_loc.x - 87.5, (int) ai_loc.z-35); 
     aiAT.rotate(Math.toDegrees(ai_rot), ai_loc.x, ai_loc.z); 

     Area a = new Area(ai_rec); 
     a.transform(aiAT); 

     //testing for collision 
     if(a.getBounds2D().intersects(car)){ 
      System.out.println("Collision!"); 
     } 
    } 

Обнаружение столкновения не кажется, что где-нибудь близко к правой, от моего понимания один из оси должны быть выровнены. Я пытаюсь выровнять одну из оси, а затем проверить на столкновение с a AffineTransform, но я видел, что в Интернете что-то о повороте более 90 градусов вызывает проблему. Как я могу исправить эту проблему, чтобы проверить наличие столкновения между двумя вращающимися прямоугольниками? Любая помощь приветствуется.

+1

Вы имеете в виду что-то вроде [этого] (http://stackoverflow.com/questions/20927189/detecting-collision-of-two-sprites-that-can-rotate/20928531#20928531) – MadProgrammer

+0

Спасибо, после некоторых возиться i смог понять это, используя пути, подобные вашему примеру. я натолкнулся на вас вверх, не совсем так, как вам нужно :). Благодарю. – Ryan

+0

Рад, что это могло бы помочь;) – MadProgrammer

ответ

2

Столкновение Обнаружение просто только в двух случаях:

  • между кругами
  • между выровненными прямоугольниками

SmashCode объяснено, как обнаружить столкновения между кругами. Выровненные прямоугольники еще проще, вам нужно сравнить только максимальные и минимальные координаты прямоугольников.

К сожалению, ваш случай не существует. Эти прямоугольники имеют разные системы координат и из-за того, что их края вращения одного из прямоугольников могут быть перпендикулярными или параллельными оси второго, и с ними нельзя обращаться так.

Одним из способов является использование ограничивающих коробок, как вы делали здесь:

if(a.getBounds2D().intersects(car)){ 
    System.out.println("Collision!"); 
} 

Вызова a.getBounds2D() создает прямоугольник, выровненный к системе координат и охватывает всю форму. Но ограничивающая рамка также покрывает некоторое пространство, не занятое формой.Так проверка столкновения между выравненным прямоугольником и ограничивающей коробкой повернутых один быстро и легко, но может привести к ложным срабатываниям, как показано на drawing of rectangles and bounding box of rotated one.

Чтобы точно и полно проверить столкновения вам нужно использовать некоторые более сложные методы, такие как SAT, которые используют литье (проецирование) многоугольников на разные оси. Факт, что вы работаете только с прямоугольниками, означает, что вам понадобятся только две оси, и вы уже знаете их направления.

PS. Использование ограничительной рамки не является неправильным, это простой способ проверить, не сталкиваются ли две цифры (если ограничивающие поля не сталкиваются с цифрами, они не могут столкнуться), вы все равно можете использовать их как более быструю предварительную проверку, чтобы устранить очевидные случаи.

1
I will tell the logic instead of code here follow these works. 

Пусть поворачиваетс вы вращающиеся быть (x1, y1) и для второго прямоугольника поворота быть (х2, у2)

1.Create круга с шарниром вы вращающиеся и langth прямоугольника, как радиус (пусть радиус будет г1)

2.Do то же самое для второго прямоугольника (радиус будет г2)

3.mark д, как расстояние между центрами 2 кругов. расстояние между двумя точками: a = Math.pow ((x2-x1), 2) b = ((y2-y1), 2) расстояние = Math.sqrt (a + b)

4.Частировать r1 + r2

5.if R1 + R2> = расстояние, то оба прямоугольника пересекаются в точке

6.Else они пересекают didnot

Иам обеспечивая ссылку здесь link, где они пересекаются Автошоу существует 1 или 2 балла в соответствии к условиям 1, если (r1 + r2) = расстояние и 2, если (r1 + r2)> расстояние

Смежные вопросы