二维运动物体碰撞
2D moving object collision
我正在创建两个 2D
模拟,我需要确定 2 个移动对象 A
和 B
是否会交叉路径。
A
以恒定速度移动 Va
和 B 以 Vb
.
我能够确定对象路径相交的点
但我不知道他们是否真的会相撞。
我用
计算了碰撞点
y
也一样
让我们考虑两个轴对齐的矩形的情况。如果 X 轴的投影相交,并且 Y 轴的投影相交,则它们确实相交。
第一个矩形坐标(Ax1,Ay1),(Ax2,Ay2),速度矢量(VAx,VAy)
第二个矩形坐标(Bx1,By1),(Bx2,By2),速度矢量(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是否相交。如果他们这样做,对象就会发生碰撞。
这就是我在我的代码中设置它的方式,尽管简单地将其添加到您的代码中可能行不通,但希望这能帮助您理解数学:
如果两个对象相交,rectangleIntersect() 将 return 为真。
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());
}
我正在创建两个 2D
模拟,我需要确定 2 个移动对象 A
和 B
是否会交叉路径。
A
以恒定速度移动 Va
和 B 以 Vb
.
我能够确定对象路径相交的点 但我不知道他们是否真的会相撞。
我用
计算了碰撞点y
让我们考虑两个轴对齐的矩形的情况。如果 X 轴的投影相交,并且 Y 轴的投影相交,则它们确实相交。
第一个矩形坐标(Ax1,Ay1),(Ax2,Ay2),速度矢量(VAx,VAy)
第二个矩形坐标(Bx1,By1),(Bx2,By2),速度矢量(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是否相交。如果他们这样做,对象就会发生碰撞。
这就是我在我的代码中设置它的方式,尽管简单地将其添加到您的代码中可能行不通,但希望这能帮助您理解数学:
如果两个对象相交,rectangleIntersect() 将 return 为真。
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());
}