多边形内的另一个多边形

时间:2015-12-22 15:48:40

标签: vb.net geometry

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语句要求相匹配。

1 个答案:

答案 0 :(得分:1)

水平线与多边形内部的交点是一组1D间隔。

如果P在Q内部,则P的所有1D间隔将完全在Q的相应间隔内。

enter image description here

通过两个多边形的所有顶点检查此属性是否适用于所有水平线就足够了。

你可以通过依次考虑每个顶点,找到与水平线的交点并在检查包含之前从左到右排序来做到这一点。

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