【问题标题】:Polygon Inside Another Polygon另一个多边形内的多边形
【发布时间】:2015-12-22 15:48:40
【问题描述】:

Source of algorithm idea

我接受了这个想法,并试图检测整个多边形是否在另一个多边形内。这是我想出的为 X 添加额外检查的代码,因为有时它会等于零并导致问题。

Public Shared Function ContainsOutsidePoints(ByVal ToBeChecked As Polygon, ByVal CheckAgainst As Polygon) As Boolean
    For Each pt As Point In ToBeChecked.Coordinates
        If CheckAgainst.Inside(pt) = False Then
            Return True
        End If
    Next
    Return False
End Function

 Public Function Inside(ByVal Value As Point) As Boolean
    Dim j As Integer = Lines.Count - 1
    Dim pxi As Double
    Dim pxj As Double
    Dim pyi As Double
    Dim pyj As Double
    Inside = False
    For i As Integer = 0 To Lines.Count - 1
        pxi = Lines.Item(i).EndPointA.X
        pxj = Lines.Item(j).EndPointA.X
        pyi = Lines.Item(i).EndPointA.Y
        pyj = Lines.Item(j).EndPointA.Y
        If (pyi < Value.Y AndAlso pyj >= Value.Y OrElse _
                pyj < Value.Y AndAlso pyi >= Value.Y) And _
                pxi <= Value.X OrElse pxj <= Value.X AndAlso _
                pxi <> pxj Then
                If (pxi + (Value.Y - pyi) / (pyj - pyi) * (pxj - pxi) < Value.X) Then
                    Inside = Not Inside
                End If
        End If
        j = i
     Next
     Return Inside
 End Function

当我运行它时,它有时会说我可以看到的多边形不在另一个多边形内,但有时它会在并非所有点都在另一个多边形内时返回。这是由于添加了 X 的额外检查造成的吗?因为符合 if 语句要求的语句更少。

【问题讨论】:

  • @the_lotus 如果您认为它不会因为 pxi pxj 起作用,那么如果 (pyj - pyi) * (pxj - pxi) = 0,您将如何处理 75 / 0?
  • 你可以看看this here,和你的差不多。
  • 我有一段时间没有这样做了,我这样做的方式是顺时针循环,如果一个点位于一条线的左侧,那么该点不在多边形中。如果线的两个向量具有相同的 X,那么我将只查看 Y,并且仅当 x 和 y 都不同时才使用公式。
  • 你不应该期望在这里发布一个不错但不是直截了当的代码,或者期望有人为你明确地修复它。 SO 的想法是您遇到明确定义的问题,这些问题可能或多或少容易被具有所需知识的人回答,并且可能对其他人有所帮助。调试一个非常具体(并且不清楚)的算法不属于这个组。另一方面,如果您只是在寻找或多或少抽象的答案来帮助您正确面对问题,那可能没问题。
  • 我个人会根据 the_lotus 的建议采用迭代方法。我想我会专注于设置线和检查交叉点。例如:point1 到 point2 的线不与容器的任何线相交(我可能会预先分析这些线并仅检查相关的线);然后检查 point1 和 point2 在边界内(从 point1/2 到最近边界的距离/垂直线); point2 到 point3 的线确实相交,等等。这将是我第一个不断改进的方法(比如以这种多步方式构建算法)。

标签: vb.net geometry


【解决方案1】:

水平线与多边形内部的交点是一组一维区间。

如果 P 在 Q 内,则 P 的所有一维区间将完全在 Q 的相应区间内。

检查此属性是否适用于所有水平面(尽管两个多边形的所有顶点)就足够了。

您可以通过依次考虑每个顶点、找到与水平线的交点并在检查是否包含之前从左到右对它们进行排序来做到这一点。

您可以使用扫描线范例来保存操作,即从上到下扫描顶点并维护跨越当前水平的边的列表。这样你就可以准确地知道哪条边会相交;从一个顶点到另一个顶点的跨越列表的更新很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多