|
|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
- Function f(p, p0, p1, p2, Optional k = 0)
- Dim a(2), b(1, 2), bk(2, 1), i&, j&, n&, s$, sf$, st$, t, tb, tf$, tp$, flg As Boolean
- st = ",0++,0X+,0-+,0-X,0--,+++,+X+,+-+,+-X,+--,+0+,+0X,+0-,+++,++X,++-,X--,X0-,X+-,---,-0-,-+-,-X-,---"
- sf = ",110,100,100,101,101,110,100,100,101,101,100,101,101,100,101,101,001,001,001,001,001,001,011,011"
-
- bk(0, 0) = f_Line(p0(1), p0(2), p1(1), p1(2), 0) '0-1
- bk(0, 1) = f_Line(p0(1), p0(2), p1(1), p1(2), 1)
-
-
- bk(1, 0) = f_Line(p1(1), p1(2), p2(1), p2(2), 0) '1-2
- bk(1, 1) = f_Line(p1(1), p1(2), p2(1), p2(2), 1)
-
- bk(2, 0) = f_Line(p2(1), p2(2), p0(1), p0(2), 0) '2-0
- bk(2, 1) = f_Line(p2(1), p2(2), p0(1), p0(2), 1)
-
- If p0(2) < p1(2) Then 'y0<y1
- If p0(2) < p2(2) Then 'y0<y2
- If Chk_k(bk(0, 1), bk(2, 1)) Then '0
- a(0) = 0: a(1) = 1: a(2) = 2 '0-1-2-0
- Else
- a(0) = 2: a(1) = 1: a(2) = 0 '0-2-1-0
- End If
- Else 'y0>=y2
- If p0(2) = p2(2) Then 'y0=y2 0 or 2
- If p0(1) < p2(1) Then 'x0<x2
- a(0) = 2: a(1) = 1: a(2) = 0 '0-2-1-0
- Else 'x2<x0
- a(0) = 2: a(1) = 0: a(2) = 1 '2-0-1-2
- End If
- Else 'y2<y0
- If Chk_k(bk(1, 1), bk(2, 1)) Then '2
- a(0) = 1: a(1) = 0: a(2) = 2 '2-1-0-2
- Else
- a(0) = 2: a(1) = 0: a(2) = 1 '2-0-1-2
- End If
- End If
- End If
- ElseIf p0(2) = p1(2) Then 'y0=y1
- If p0(2) < p2(2) Then 'y0=y1<y2 0 or 1
- If p0(1) < p1(1) Then 'x0<x1
- a(0) = 0: a(1) = 1: a(2) = 2 '0-1-2-0
- Else 'x1<x0
- a(0) = 0: a(1) = 2: a(2) = 1 '1-0-2-1
- End If
- Else 'y2<y0=y1
- If Chk_k(bk(1, 1), bk(2, 1)) Then '2
- a(0) = 1: a(1) = 0: a(2) = 2 '2-1-0-2
- Else
- a(0) = 2: a(1) = 0: a(2) = 1 '2-0-1-2
- End If
- End If
- Else 'y1<y0
- If p1(2) < p2(2) Then 'y1<y2
- If Chk_k(bk(0, 1), bk(1, 1)) Then '1
- a(0) = 0: a(1) = 2: a(2) = 1 '1-0-2-1
- Else
- a(0) = 1: a(1) = 2: a(2) = 0 '1-2-0-1
- End If
- Else 'y1>=y2
- If p1(2) = p2(2) Then 'y1=y2 1 or 2
- If p1(1) < p2(1) Then 'x1<x2
- a(0) = 1: a(1) = 2: a(2) = 0 '1-2-0-1
- Else 'x2<x1
- a(0) = 1: a(1) = 0: a(2) = 2 '2-1-0-2
- End If
- Else 'y2<y1
- If Chk_k(bk(1, 1), bk(2, 1)) Then '2
- a(0) = 1: a(1) = 0: a(2) = 2 '2-1-0-2
- Else
- a(0) = 2: a(1) = 0: a(2) = 1 '2-0-1-2
- End If
- End If
- End If
- End If
-
- For j = 0 To 2
- b(0, j) = j: b(1, j) = bk(a(j), 1): tp = tp & Get_k(b(1, j))
- Next
- If tp = "+++" Or tp = "---" Then
- For i = 2 To 1 Step -1
- For j = 0 To i - 1
- If b(1, j) > b(1, j + 1) Then
- t = b(0, j): b(0, j) = b(0, j + 1): b(0, j + 1) = t
- t = b(1, j): b(1, j) = b(1, j + 1): b(1, j + 1) = t
- End If
- Next
- Next
- ' t = b(0, 0) & b(0, 1) & b(0, 2)
- If tp = "+++" Then
- If b(0, 0) = 1 Then tf = "100": n = 14 Else tf = "110": n = 6
- Else '"---"
- If b(0, 0) = 1 Then tf = "011": n = 24 Else tf = "001": n = 20
- End If
- Else
- n = (InStr(st, tp) + 3) / 4
- tf = Mid(sf, InStr(st, tp), 3)
- End If
- If k Then f = Join(a, "-") & ":" & n & " " & tp: Exit Function
-
- For i = 0 To 2
- If bk(a(i), 1) = "X" Then
- If Mid(tf, i + 1, 1) = 1 Then
- If p(1) < bk(a(i), 0) Then Exit For
- Else
- If p(1) > bk(a(i), 0) Then Exit For
- End If
- Else
- tb = p(2) - bk(a(i), 1) * p(1)
- If Mid(tf, i + 1, 1) = 1 Then
- If tb < bk(a(i), 0) Then Exit For
- Else
- If tb > bk(a(i), 0) Then Exit For
- End If
- End If
- Next
- If i = 3 Then f = 1
- End Function
- Function f_Line(x1, y1, x2, y2, m) 'm=0 b/=1 k
- If x1 = x2 Then
- If m Then f_Line = "X" Else f_Line = x1
- Else
- If m Then f_Line = (y1 - y2) / (x1 - x2) Else f_Line = (x1 * y2 - x2 * y1) / (x1 - x2)
- End If
- End Function
- Function Get_k(t) '按斜率结果返回直线类型 0X+-
- If t = "X" Then Get_k = t Else If t = 0 Then Get_k = t Else If t > 0 Then Get_k = "+" Else Get_k = "-"
- End Function
- Function Chk_k(k1, k2) As Boolean 'Check if k1,k2 逆时针
- If k1 = "X" Then
- If k2 < 0 Then Chk_k = True 'II
- ElseIf k2 = "X" Then
- If k1 >= 0 Then Chk_k = True 'I
- ElseIf (k1 < 0 And k2 >= 0) Or (k1 >= 0 And k2 < 0) Then
- If k1 > k2 Then Chk_k = True
- Else
- If k1 < k2 Then Chk_k = True
- End If
- End Function
复制代码 |
|