检测红色矩形是否与黑色多边形重叠的最佳方法是什么?请参考此图片:
答案 0 :(得分:4)
有四种情况。
首先:检查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答案: