【问题标题】:point in a self-intersecting / complex polygon指向自相交/复杂多边形
【发布时间】:2010-12-31 07:57:47
【问题描述】:

我已阅读How can I determine whether a 2D Point is within a Polygon?,但我不确定该解决方案是否适用于中间被内部段分割的多边形。想想一个正方形的数字 8,或者只是两个相互堆叠的正方形。任何一个正方形内的点肯定会在多边形“内部”,但交叉计数会根据您前进的方向(以及您是否越过该内部段)而有所不同。

我想解决这个问题的一种方法是将多边形视为两个单独的多边形......(在这种情况下,我需要一种算法将一个复杂的多边形分成一组更简单的多边形?)

或者是否对光线投射算法或其他多边形点算法进行了改进,以处理我描述的情况?

【问题讨论】:

  • 有许多不同的方法可以让事情在这种情况下发挥作用,但它们都严重依赖于你如何解释这种情况。更具体地说,你如何表示这样的“多边形”?使用什么数据结构?您可以拥有多个内饰部分吗?如果是这样,内部段可以相互交叉吗?
  • 基本上,此时看来您所拥有的只是一个问题的草图。你还没有完成问题的制定。当问题本身没有得到充分说明时,现在寻找解决方案还为时过早。

标签: geometry polygon


【解决方案1】:

我不确定这是否是最佳解决方案;但光线投射算法适用于任何凸多边形。任何多边形都可以分解成三角形,这些三角形是凸的。 (双框不是凸多边形,因为如果你用线段连接两个顶点,在某些情况下你会越过中心边缘。)所以,澄清一下:首先将多边形分解为三角形,然后使用射线-casting 判断点是否在三角形内。

[编辑:光线投射确实适用于凹多边形。对不起,我错了。]

【讨论】:

  • 该操作描述了一个比凹面还要多的多边形,它是退化的;>
  • 实际上,该算法应该不仅适用于凸多边形,还适用于凹多边形和复杂多边形。我的理解是,复杂的多边形是多边形与自身相交的多边形。 (而不是 2 个堆叠的正方形,想象 2 个堆叠的三角形点对点)。我还将研究多边形三角剖分作为将复杂多边形分解为一组凸多边形的方法。
【解决方案2】:

所描述的算法可以正常工作,因为如果你仔细观察它,你会发现它只是交叉的数量。如果我们从“8”的任何一个“子多边形”开始,我们将在最坏的情况下穿过边缘 3 次,通常是一次。它确实在里面。否则它在外面。

但是,人们可能会认为存在 一个 特殊情况。如果光线完全通过交叉点。但请注意,在这种情况下,您还会得到 2 个交叉点 :)。

【讨论】:

  • 你会如何穿越 3 次?如果我的点在顶部正方形中并且我将我的光线向上绘制我穿过一次(因此该点在里面)但是如果我向下绘制我的光线我穿过两次:一次穿过中心段,一次穿过底部段。
  • 上面添加的图像 - 看看光线如何根据您前进的方向穿过一次或两次?
  • 啊,就是这样……在这种情况下,您的边缘显然是“内部”。将它们标记为此类,并且不要包含在内部测试中。
  • 如果这是一个愚蠢的问题,请原谅我,但我如何通过算法测试边缘是否在内部? (我考虑过测试线的中点以查看它是否在多边形内,但后来我遇到了一个 catch-22,特别是如果有多个内部边缘)。到目前为止,我的谷歌搜索没有任何结果。
【解决方案3】:

引用的相交算法适用于任何闭合多边形,即使是凹面或自相交。为了使您的双框多边形闭合(在同一点开始和结束),必须遍历中间段两次。这意味着您的示例射线穿过底部穿过三个边缘,因此使用奇偶规则位于内部。

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多