【问题标题】:How to determine a diagonal is in or out of a concave polygon?如何确定对角线在凹多边形内还是外?
【发布时间】:2009-03-29 00:09:52
【问题描述】:

凹(非凸)多边形的对角线(对角线是连接不相邻顶点的线段)可以完全在多边形内部或外部(或可以与多边形的边相交)。如何判断它是否完全在多边形内?(一种不用point-in-polygon测试的方法)。

【问题讨论】:

  • 我在处理地理空间应用程序的编程时遇到了类似的问题......对我来说似乎有效。
  • 这是一个关于他可能想在软件中实现的算法的问题,我会说它是合格的。
  • 正是 John Feminella !我的多边形可能有很多边,我不想测试所有边的交叉点。另外我想知道是否存在更好的方法。
  • @Kevin,这个问题来自计算几何领域。它与编程有关。

标签: geometry polygon


【解决方案1】:

如果对角线与边至少有一个交点,则它部分在多边形内,部分在多边形外多边形。

判断是在多边形内还是在多边形外:

假设多边形的顶点是逆时针排序的。考虑位于名为 P[i] 的顶点上的对角线端点之一(另一个端点是 p[j])。然后,制作三个向量,其第一个点是 p[i] :

V1 : p[i+1] - p[i]

V2 : p[i-1] - p[i]

V3 : p[j] - p[i]

当我们从 V1 逆时针移动到 V2 时,当且仅当 V3 在 V1 和 V2 之间时,对角线完全在多边形中。

从V1逆时针到V2,如何判断V3是否在V1和V2之间?转至here

我用这种方法写了一个程序,效果很好。

【讨论】:

    【解决方案2】:

    如何判断是否完全在多边形内?

    如果要确定对角线是否永远不会离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何线相交。

    • 如果是,则它部分在多边形内,部分在多边形外。

    • 如果不是,它要么完全在多边形内,要么完全在多边形外。从那里开始,最简单的方法是在对角线上的任何点上使用多边形中的点,但如果您不想这样做,请使用 winding algorithm

    【讨论】:

      【解决方案3】:

      我相信约翰的回答错过了一个重要的案例:当对角线从一开始就完全在多边形之外时。想象一下他的“u”形多边形的两座塔对角线“桥”。

      几年前我不得不解决这个问题,所以如果我的回忆有点参差不齐,请原谅。

      我解决这个问题的方法是对多边形中的每条边执行对角线的线相交测试。然后您有两种可能的情况:您至少有一个交叉口,或者您没有交叉口。如果有任何交点,则对角线不在多边形内。

      如果没有得到任何交点,则需要确定对角线是完全在多边形内部还是完全在多边形外部。假设对角线将 p[i] 连接到 p[j],即 i

      完成此操作后,如果对角线在多边形外部,对角线的 2D 角度将为正,如果在多边形内部,则对角线的 2D 角度将为负。

      【讨论】:

      • 你说得对,我完全错过了!我相应地编辑了我的答案。
      • 我有一个观点,我正在尝试用与你的方法有点不同的方法来解决它......坦率地说,我几乎不明白你的意思
      • 我不明白你的“正角度”方法。在以下示例中,角度为正,对角线位于多边形内部:imgur.com/a/4zz1T
      • @EllaShar “...对角线将 p[i] 连接到 p[j],即 i 我 有点困惑这是否有效。
      【解决方案4】:

      关于检查线段之间的交叉点(这是您可能必须做的第一步),我发现SoftSurfer 上的解释很有帮助。您必须检查对角线和多边形的任何边缘之间的交点。如果您使用的是 MATLAB,您应该能够找到一种有效的方法来同时使用矩阵和向量运算检查所有边的交点(我已经为 ray-triangle intersections 处理过以这种方式计算交点的方法)。

      【讨论】:

        【解决方案5】:

        我知道这个问题在很多年前就得到了回答,但我有一个易于实施的新方法。

        如前面的答案中所建议的,您应该首先计算多边形的所有边,如果它们中的任何一条与对角线段相交。 here 描述了计算交集并确定是否存在交集的代码。

        如果所有边(不包括那些与对角线共享顶点的边)不与对角线相交,那么您知道对角线要么完全在完全在多边形意味着对角线的中点也分别完全在里面完全在外面。中点是对角线的两个端点的平均值。

        我们现在已经将问题转化为计算对角线是在多边形内部还是外部,而将其转换为中点在多边形内部还是外部。使用单点比使用线更容易。

        确定一个点是否在多边形内的方法在here 中进行了描述,并且可以通过计算从该点开始的水平光线的相交量并查看该光线与多少多边形边相交来进行总结。如果光线相交奇数次,则该点位于多边形内部,否则位于多边形外部。

        此实现易于实现的原因是,当您遍历所有边以检查是否与对角线相交时,您现在还可以计算对角线的中点光线是否与正在处理的当前边相交。如果您的 for 循环返回时对角线和边之间没有交集,那么您可以查看偶数/奇数计数以确定对角线是在内部还是外部。

        【讨论】:

          【解决方案6】:

          约翰的回答很准确:

          如果要确定对角线是否永远不会离开多边形的边界,只需确定它是否与两个相邻顶点之间的任何线相交。如果是这样,它就剩下多边形了。

          执行此检查的一种有效方法是对数据运行 Bentley-Ottman 扫描线算法。它很容易实现,但很难使数值稳定。如果您的多边形中的边数少于...比如说... 20 条,那么蛮力搜索很可能会更快。

          【讨论】:

            猜你喜欢
            • 2011-02-18
            • 1970-01-01
            • 2020-04-21
            • 1970-01-01
            • 2012-11-05
            • 2013-07-11
            • 2014-04-05
            • 2017-01-07
            相关资源
            最近更新 更多