Vb.net 另一个多边形内的多边形
我接受了这个想法,我试图检测一个完整的多边形是否在另一个多边形内。这是我的代码,我为X添加了一个额外的检查,因为有时它将等于零并导致问题Vb.net 另一个多边形内的多边形,vb.net,geometry,Vb.net,Geometry,我接受了这个想法,我试图检测一个完整的多边形是否在另一个多边形内。这是我的代码,我为X添加了一个额外的检查,因为有时它将等于零并导致问题 Public Shared Function ContainsOutsidePoints(ByVal ToBeChecked As Polygon, ByVal CheckAgainst As Polygon) As Boolean For Each pt As Point In ToBeChecked.Coordinates If C
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
公共共享函数将soutsidepoints(ByVal-ToBeChecked为Polygon,ByVal-checkback为Polygon)包含为布尔值
对于每个pt作为ToBeChecked.坐标中的点
如果checkback.Inside(pt)=False,则
返回真值
如果结束
下一个
返回错误
端函数
内部公共函数(ByVal值作为点)作为布尔值
尺寸j为整数=行。计数-1
将pxi设置为双精度
将pxj设置为双精度
Dim pyi为双精度
Dim pyj为双精度
内=假
对于i,整数=0到行。计数-1
pxi=行。项(i)。端点a.X
pxj=行。项(j)。端点a.X
pyi=行。项(i)。端点a.Y
pyj=行。项(j)。端点a.Y
如果(pyi=Value.Y或_
pyj=Value.Y)和_
pxi水平线与多边形内部的交点是一组1D间隔
如果p在Q内,则p的所有1D间隔将完全在Q的相应间隔内
只要检查此属性是否适用于两个多边形的所有顶点的所有水平面即可
通过依次考虑每个顶点,找到与水平面的交点,并在检查是否包含之前将它们从左到右排序,可以做到这一点
可以使用“扫描线”范例保存操作,即从上到下扫描顶点,并维护横跨当前水平面的边列表。这样,您就可以准确地知道哪条边将相交;从一个顶点到另一个顶点的跨域列表的更新非常简单。@the_lotus如果你认为它因为pxi pxj而无法工作,那么如果(pyj-pyi)*(pxj-pxi)=0,你会如何处理75/0?你可以看看,它与你的类似。我已经有一段时间没有这样做了,我的方法是顺时针循环,如果一个点在直线的左侧,那么该点不在多边形中。如果线的两个向量有相同的X,那么我只看Y,并且只在X和Y都不同的情况下使用公式。你不应该期望在这里发布一个不坏但不直接的代码,或者不工作的代码,或者期望有人为你简单地修复它。这样做的意思是,你会遇到明确定义的问题,这些问题可能会被具备所需知识的人或多或少地轻松回答,并且可能会对其他人有所帮助。调试一个非常特定(但不清楚)的算法不属于此组。另一方面,如果你只是在寻找或多或少抽象的答案来帮助你正确地面对这个问题,这可能没问题。我个人会按照荷花的建议做一个迭代的方法。我想我会专注于设置线路和检查交叉口。例如:点1到点2的直线不与容器的任何直线相交(我可能正在预分析这些直线,并只检查相关的直线);然后检查点1和点2是否在边界内(从点1/2到最近边界的距离/垂直线);点2到点3的直线确实相交,等等。这将是我第一个不断改进的方法(就像以这种多步骤的方式构建算法)。