【问题标题】:Method to detect intersection between a rectangle and a polygon?检测矩形和多边形相交的方法?
【发布时间】:2011-10-31 11:33:18
【问题描述】:

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

【问题讨论】:

  • 为了简化问题,我建议假设多边形是凸的(参见Convex and concave polygons)。凸多边形是指多边形内两点之间的任何线段完全在多边形内。
  • @Joey - 您的假设与问题中提供的图表不一致。

标签: algorithm math collision-detection


【解决方案1】:

有四种情况。

  1. 矩形在 Poly 之外
  2. 矩形与多边形相交
  3. 矩形在 Poly 内部
  4. 多边形在矩形内

首先:根据多边形检查 Rect 中的任意点(请参阅多边形中的点)。如果它在里面你就完成了,因为它是案例 3 或 2。 如果在外面,则排除第3种情况。

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

第三:检查你的 Rect 的线条与 Poly 是否相交,以验证/排除案例 2。

这也适用于多边形与多边形(凸面和凹面),但这样更具可读性。

【讨论】:

    【解决方案2】:

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

    如果您想了解有关此算法的更多信息,Christer Ericson 提供了一个很好的 Powerpoint presentation。你也可以看看他的书,Real-Time Collision Detection,它既完整又可供任何发现碰撞检测算法的人使用。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 即使矩形是轴对齐但多边形是任意的,SAT 仍然是最好的方法吗?
        【解决方案5】:

        单纯的找有没有交集,我想你或许可以把两种算法结合起来。

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

        2) 线交点。如果第 1 步没有产生任何结果,请检查线交点。

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

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

        A simple algorithm for polygon intersection

        【讨论】:

        • 仅使用角点是不够的。如果所有形状都是矩形并且除了90、180之外没有任何角度就足够了
        • 线交点应该处理90/180的情况?
        猜你喜欢
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2010-09-28
        • 2013-08-25
        • 1970-01-01
        相关资源
        最近更新 更多