|
|
本帖最后由 microyip 于 2016-10-19 23:59 编辑
- Sub 计算()
- Dim iDataSlope As Double, iStartSlope As Double, iEndSlope As Double
- Dim vDot As Variant, iDot As Integer, vDataDot As Variant, iDataDot As Integer
- Dim bIn As Boolean, vInout As Variant
- vDot = [C6:D10].Value
- vDataDot = [C14].Resize([C65536].End(xlUp).Row - 13, 2).Value
- ReDim vInout(1 To UBound(vDataDot), 1 To 1)
- For iDataDot = 1 To UBound(vDataDot)
- bIn = True
- For iDot = 2 To 4
- iDataSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDataDot(iDataDot, 1)), Val(vDataDot(iDataDot, 2))) '顶点到散点的射线
- iStartSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDot(iDot - 1, 1)), Val(vDot(iDot - 1, 2))) '顶点到上一个定点的射线边
- iEndSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDot(iDot + 1, 1)), Val(vDot(iDot + 1, 2))) '顶点到下一个定点的射线边
- iEndSlope = iEndSlope - (iEndSlope < iStartSlope) * Application.Pi() * 2 '如果第二条边的斜率弧度小于第一条边的斜率弧度,以转一圈的弧度计算
- bIn = bIn And iDataSlope >= iStartSlope And iDataSlope <= iEndSlope
- Next
- vInout(iDataDot, 1) = IIf(bIn, "In", "Out")
- Next
- [E14].Resize(UBound(vInout), 1) = vInout
- End Sub
- Function 斜率弧度(iStartX As Double, iStartY As Double, iEndX As Double, iEndY As Double) As Double
- If iStartX = iEndX Then
- If iStartY = iEndY Then
- 斜率弧度 = 0
- ElseIf iStartY < iEndY Then
- 斜率弧度 = Application.Pi() / 2
- Else
- 斜率弧度 = Application.Pi() * 3 / 2
- End If
- Else
- 斜率弧度 = Atn((iEndY - iStartY) / (iEndX - iStartX)) - (iEndX - iStartX < 0) * Application.Pi() + (iEndX - iStartX > 0) * (iEndY - iStartY < 0) * Application.Pi() * 2
- End If
- End Function
复制代码
|
|