2016-05-09 4 views
0

Я создаю два моделирования 2D, и мне нужно определить, будут ли пересекаться 2 движущихся объекта A и B. A перемещается с постоянной скоростью Va и B с Vb.2D-перемещение движущегося объекта

Я могу определить точку, где путь объекта пересекается , но я не могу понять, будут ли они действительно сталкиваться.

Я вычислил точку столкновения с использованием

This formula

и то же самое для y

+0

зависит от формы объектов. являются ли они AABB, сферами, выпуклыми, сплайнами или общими точечными корпусами? –

+0

они прямоугольники –

ответ

1

Рассмотрим случай двух осей выровнен прямоугольников. Они пересекаются, если проекции обеих осей X пересекаются, а проекции обоих по оси Y пересекаются. enter image description here

Первые координаты прямоугольника (ax1, AY1), (Ах2, Ay2), вектор скорости (VAX, Vay)
вторых координат прямоугольника (BX1, by1), (Вх2, Ву2), вектор скорости (VBX, VBY)

интервал времени, когда X-проекции пересекаются:

Ax2+VAx*t1=Bx1+VBx*t1 
t1=(Bx1-Ax2)/(VAx-VBx) 
t2=(Bx2-Ax1)/(VAx-VBx) 

интервал Ix=(t1,t2) (или (t2, t1), если t2 < t1)

Р или Y-проекции

u1=(By1-Ay2)/(VAy-VBy) 
u2=(By2-Ay1)/(VAy-VBy) 

Iy=(u1,u2) Интервал (или (u2, u1), если u2 < u1)

Проверить, если эти два временных диапазонов Ix и Iy пересекаются. Если это так, объекты сталкиваются.

+0

Я думаю, у меня есть идея ... я постараюсь реализовать ее сейчас, спасибо вам большое –

0

Это, как я его установки в моем коде, хотя он, вероятно, не будет работать, чтобы просто добавить это в ваш код, надеюсь, это поможет вам разобраться в математике:

rectangleIntersect() возвращает true, если оба объекта пересекаются.

public static boolean intersectRange(int min, int max, int min2, int max2){ 
    return Math.max(min, max) >= Math.min(min2, max2) && 
      Math.min(min, max) <= Math.max(min2, max2); 
} 

public static boolean intersectRange(float min, float max, float min2, float max2){ 
    return Math.max(min, max) >= Math.min(min2, max2) && 
      Math.min(min, max) <= Math.max(min2, max2); 
} 

public static boolean rectangleIntersect(Rectangle rect, Rectangle rect2){ 
    return intersectRange(rect.getX(), rect.getX() + rect.getWidth(), rect2.getX(), rect2.getX() + rect2.getWidth()) && 
      intersectRange(rect.getY(), rect.getY() + rect.getHeight(), rect2.getY(), rect2.getY() + rect2.getHeight()); 
} 
Смежные вопросы