考虑到您迄今为止所做的简单算法:
- 对于每个形状,将所有顶点存储在一个数组(或列表)中,以便它们出现在形状上(顺时针或逆时针没有区别)。这使您可以轻松地迭代任何给定对象的边缘,因为在这种情况下边缘是(P 1 , P 2 ) , (P 2 , P 3 ) , ... (P N , P 1 )其中N是数字的顶点。
- 对于您要检查的每条线是否与任何对象碰撞,请遍历您表示的所有边,以及您要检查的线是否与任何边缘相交 - 线与给定对象碰撞。
检查线与边缘的交叉是一个几何问题。如果我们正在检查的线的边界点是P 1 =(x 1 ,y 1 )和P 2 =(x 2 ,y 2 ),并且边缘的边界点是P 3 =(x 3 ,y 3 )和P 4 =(x 4 ,y 4 )那么你应该求解线性系统:
(x 2 - x 1 ) y + (y 1 - y 2 ) x = x 1 y 2 - x 2 y 1 ,
(x 4 - x 3 ) y + (y 3 - y 4 ) x = x 3 y 4 - x 4 y 3。
在获得(x, y)的值后,您应该检查它是否位于两条线(我们正在检查的线和边缘)的边界点之间的部分上。如果这是真的,那么您的线条会相互交叉。
注意:您可以通过在检查碰撞时不迭代每个对象的边缘来缩短运行时间,而只迭代那些位于直线路径中的对象。例如,这可以通过计算包含每个对象的最小矩形来完成,并检查您的线是否穿过该矩形,如果没有,则取消该对象的进一步检查。