Excel 直线与多边形相交吗?
我在这里重新使用了sijipie的代码: 我需要做的是确定一条线是否在多边形内 诚然,这有点懒惰,因为我没有测试直线与每一条边的交点,而是迭代直线的中点,并测试它们是否为内部点 我想知道有没有更快的方法 VBA代码如下:Excel 直线与多边形相交吗?,excel,computational-geometry,vba,Excel,Computational Geometry,Vba,我在这里重新使用了sijipie的代码: 我需要做的是确定一条线是否在多边形内 诚然,这有点懒惰,因为我没有测试直线与每一条边的交点,而是迭代直线的中点,并测试它们是否为内部点 我想知道有没有更快的方法 VBA代码如下: Function PolyLineIntersect(lXY As Range, polyXY As Range) As Boolean Dim i As Integer, j As Integer, a As Integer, polySides As Integer
Function PolyLineIntersect(lXY As Range, polyXY As Range) As Boolean
Dim i As Integer, j As Integer, a As Integer, polySides As Integer
Dim Result As Boolean
Dim x As Double, y As Double
Dim aXY As Variant
Dim mXY(1 To 5, 1 To 2) As Integer
Dim tXY(1 To 5) As Boolean
x = lXY.Cells.value2(1, 1)
y = lXY.Cells.value2(1, 2)
xb = lXY.Cells.value2(1, 3)
yb = lXY.Cells.value2(1, 4)
mXY(1, 1) = x
mXY(1, 2) = y
mXY(2, 1) = xb
mXY(2, 2) = yb
mXY(3, 1) = (xb + x) / 2
mXY(3, 2) = (yb + y) / 2
mXY(4, 1) = (xb + mx1) / 2
mXY(4, 2) = (yb + my1) / 2
mXY(5, 1) = (xb + mx1) / 2
mXY(5, 2) = (yb + my1) / 2
Result = False
aXY = polyXY.Value
polySides = polyXY.Rows.Count
j = polySides - 1
For a = 1 To 5
x = mXY(a, 1)
y = mXY(a, 2)
For i = 1 To polySides
If (((aXY(i, 2) < y And aXY(j, 2) >= y) _
Or (aXY(j, 2) < y And aXY(i, 2) >= y)) _
And (aXY(i, 1) <= x Or aXY(j, 1) <= x)) Then
Result = Result Xor (aXY(i, 1) + (y - aXY(i, 2)) / (aXY(j, 2) - aXY(i, 2)) * (aXY(j, 1) - aXY(i, 1)) < x)
End If
j = i
Next i
Next a
PolyLineIntersect = Result
End Function
函数PolyLineIntersect(lXY作为范围,polyXY作为范围)作为布尔值
尺寸i为整数,j为整数,a为整数,多边形为整数
将结果设置为布尔值
尺寸x为双精度,y为双精度
Dim-aXY作为变体
将mXY(1到5,1到2)调整为整数
将tXY(1到5)的尺寸设置为布尔值
x=lXY.Cells.value2(1,1)
y=lXY.Cells.value2(1,2)
xb=lXY.Cells.value2(1,3)
yb=lXY.Cells.value2(1,4)
mXY(1,1)=x
mXY(1,2)=y
mXY(2,1)=xb
mXY(2,2)=yb
mXY(3,1)=(xb+x)/2
mXY(3,2)=(yb+y)/2
mXY(4,1)=(xb+mx1)/2
mXY(4,2)=(yb+my1)/2
mXY(5,1)=(xb+mx1)/2
mXY(5,2)=(yb+my1)/2
结果=错误
aXY=polyXY.Value
polySides=polyXY.Rows.Count
j=多糖苷-1
对于a=1到5
x=mXY(a,1)
y=mXY(a,2)
对于i=1的多晶硅
如果((aXY(i,2)=y)_
或者(aXY(j,2)=y))_
和(aXY(i,1)检查所有多边形顶点相对于给定直线是否位于同一个半平面(左或右)。如果是,则直线不与多边形相交
Side = Sign(CrossProduct(L2-L1, P[i] - L1))
where L1, L2 are points defining the line, P[i] is i-th polygon vertex
算法在线性时间O(N)下工作,其中N是多边形顶点计数。请注意,对于凸多边形,使用二进制搜索可能会在O(logN)时间内推导出结果。删除mathematica标记。如果您认为它属于您,请说明原因。似乎比StackOverflow更适合CodeReview。注意到了。我不知道。谢谢!