Excel 直线与多边形相交吗?

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

我在这里重新使用了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
    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。注意到了。我不知道。谢谢!