【发布时间】:2015-12-22 15:48:40
【问题描述】:
我接受了这个想法,并试图检测整个多边形是否在另一个多边形内。这是我想出的为 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 的线确实相交,等等。这将是我第一个不断改进的方法(比如以这种多步方式构建算法)。