检测矩形和多边形之间交叉的方法?

时间:2011-08-21 05:21:03

标签: algorithm math collision-detection

检测红色矩形是否与黑色多边形重叠的最佳方法是什么?请参考此图片:

red rectangle and black polygon

5 个答案:

答案 0 :(得分:4)

有四种情况。

  1. Rect在Poly
  2. 之外
  3. Rect与Poly相交
  4. Rect位于Poly
  5. Poly在Rect
  6. 首先:检查Rect中与Poly对齐的任意点(参见Polygon中的Point)。如果它在里面你就完成了,因为它是3或2的情况。 如果它在外面,则排除了案例3。

    第二:检查Poly对Rect的任意一点以验证/排除案例4。

    第三步:检查你的Rect的线对Poly的交叉点以验证/排除案例2。

    这也应该适用于Polygon与Polygon(凸面和凹面),但这种方式更具可读性。

答案 1 :(得分:3)

如果多边形不是凸面,则可以使用tessellation将其细分为凸子部分。由于您正在寻找检测可能的碰撞的方法,我认为您也可以查看GJK algorithm。即使你不需要强大的东西(它提供有关两个凸形和相关见证点之间的最小距离的信息),如果你决定处理更多不同的凸形,它可能证明是有用的。

如果你想了解更多关于这个算法的信息,Christer Ericson做了一个很好的Powerpoint presentation。您还可以查看他的书实时碰撞检测,这对于发现碰撞检测算法的任何人来说都是完整且可访问的。

答案 2 :(得分:2)

如果您知道红色矩形始终是轴对齐的事实,并且黑色区域由几个轴对齐的矩形组成(我不确定这只是巧合还是它是问题所固有的) ,然后你可以使用rectangle-on-rectangle intersection algorithm非常有效地计算两个形状是否重叠,如果是,它们重叠的位置。

答案 3 :(得分:2)

如果使用轴对齐的矩形,而多边形仅由矩形组成,则 templatetypedef 的答案就是您所需要的。

如果使用任意多边形,则这是一个更复杂的问题。 首先,您需要将多边形细分为convex parts,然后使用例如SAT algorithm

执行碰撞检测

答案 4 :(得分:1)

只是想知道是否有交叉点,我想你可以将两种算法结合起来。

1)光线投射算法。使用每个多边形的顶点,确定其中一个顶点是否在另一个顶点中。假设你并不担心实际的交叉区域,而只是存在它。 http://en.wikipedia.org/wiki/Point_in_polygon

2)线路交叉口。如果步骤1没有产生任何结果,请检查行交叉点。

我不确定这是100%正确还是最佳。

如果您确实需要确定交叉点的区域,那就更复杂了,请参阅之前的SO答案:

A simple algorithm for polygon intersection