第一个很好办吧,不用说直线,圆弧我都连接过,不过我的程序相关性太大,摘不出来,也不能送人。第二个问题,有些代码供你参考
非法条件
If C1.R < 0 Or C2.R < 0 Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "圆的半径不能小于0" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If C1.R = 0 And C2.R = 0 Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "圆的半径不能同时为0" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If C1.cx = C2.cx And C1.cy = C2.cy Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "两圆圆心重合" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If Abs(C1.R - C2.R) > Length(C1.cx, C1.cy, C2.cx, C2.cy) Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "两圆相包容" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End IfPublic Function TwoCircle_Line_Dot(C1 As CCIRCLE, C2 As CCIRCLE, WhichOne As Integer, Yes As Boolean) As CPOINT
'┏━━━━━━━━━━━━┓
'┃本函数用来计算两圆之 ┃
'┃公切线,参数C1、C2 ┃
'┃是圆,WhichOne从1 到 ┃
'┃4,代表四个不同的解, ┃
'┃YES代表返回直线与哪一个 ┃
'┃圆的切点,TRUE--表示圆1 ┃
'┃FALSE--表示圆2 ┃
'┗━━━━━━━━━━━━┛
'┏━━━━━━━━━━━┓
'┃定义局部变量 ┃
'┃Dim P1P2 As New CLINE ┃
'┃Dim temp As New CLINE ┃
'┃Dim L As Double ┃
'┃Dim S As Double ┃
'┃Dim C As Double ┃
'┃Dim T As Double ┃
'┗━━━━━━━━━━━┛
On Error GoTo ErrHandle
Dim P1P2 As New CLINE
Dim temp As New CLINE
Dim pt As New CPOINT
Dim L As Double
Dim s As Double
Dim C As Double
Dim T As Double
P1P2.X = C1.cx
P1P2.Y = C1.cy
P1P2.Length = Length(C1.cx, C1.cy, C2.cx, C2.cy)
P1P2.Angle = Angle(C1.cx, C1.cy, C2.cx, C2.cy)
Select Case WhichOne
Case 1
If C1.R = C2.R Then
temp.X = P1P2.X + C1.R * Cos(P1P2.Angle + PI / 2)
temp.Y = P1P2.Y + C1.R * Sin(P1P2.Angle + PI / 2)
temp.Angle = P1P2.Angle
End If
If C1.R > C2.R Then
L = P1P2.Length * C1.R / (C1.R - C2.R)
temp.X = P1P2.X + L * Cos(P1P2.Angle)
temp.Y = P1P2.Y + L * Sin(P1P2.Angle)
s = C1.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + PI - T
End If
If C1.R < C2.R Then
L = P1P2.Length * C2.R / (C2.R - C1.R)
temp.X = P1P2.X + (L - P1P2.Length) * Cos(P1P2.Angle + PI)
temp.Y = P1P2.Y + (L - P1P2.Length) * Sin(P1P2.Angle + PI)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle - T
End If
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle - PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle - PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle - PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle - PI / 2)
End If
Case 2
If C1.R = C2.R Then
temp.X = P1P2.X + C1.R * Cos(P1P2.Angle - PI / 2)
temp.Y = P1P2.Y + C1.R * Sin(P1P2.Angle - PI / 2)
temp.Angle = P1P2.Angle
temp.Length = P1P2.Length
End If
If C1.R > C2.R Then
L = P1P2.Length * C1.R / (C1.R - C2.R)
temp.X = P1P2.X + L * Cos(P1P2.Angle)
temp.Y = P1P2.Y + L * Sin(P1P2.Angle)
s = C1.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + PI + T
End If
If C1.R < C2.R Then
L = P1P2.Length * C2.R / (C2.R - C1.R)
temp.X = P1P2.X + (L - P1P2.Length) * Cos(P1P2.Angle + PI)
temp.Y = P1P2.Y + (L - P1P2.Length) * Sin(P1P2.Angle + PI)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + T
End If
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle + PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle + PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle + PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle + PI / 2)
End If
Case 3
temp.X = C1.cx + C1.R / (C1.R + C2.R) * P1P2.Length * Cos(P1P2.Angle)
temp.Y = C1.cy + C1.R / (C1.R + C2.R) * P1P2.Length * Sin(P1P2.Angle)
L = P1P2.Length * C2.R / (C2.R + C1.R)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + T
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle - PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle - PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle + PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle + PI / 2)
End If
Case 4
temp.X = C1.cx + C1.R / (C1.R + C2.R) * P1P2.Length * Cos(P1P2.Angle)
temp.Y = C1.cy + C1.R / (C1.R + C2.R) * P1P2.Length * Sin(P1P2.Angle)
L = P1P2.Length * C2.R / (C2.R + C1.R)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle - T
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle + PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle + PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle - PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle - PI / 2)
End If
Case Else
End Select
Dim Rect As New CRECT
Rect.L = Min(C1.cx - C1.R, C2.cx - C2.R)
Rect.T = Min(C1.cy - C1.R, C2.cy - C2.R)
Rect.R = Max(C1.cx + C1.R, C2.cx + C2.R)
Rect.b = Max(C1.cy + C1.R, C2.cy + C2.R)
CopyRect g_RECT, Rect
ZoominMultiple = DefineZoominmultiple(Rect)
Set TwoCircle_Line_Dot = pt
Exit Function
ErrHandle:
MsgBox
非法条件
If C1.R < 0 Or C2.R < 0 Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "圆的半径不能小于0" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If C1.R = 0 And C2.R = 0 Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "圆的半径不能同时为0" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If C1.cx = C2.cx And C1.cy = C2.cy Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "两圆圆心重合" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End If
If Abs(C1.R - C2.R) > Length(C1.cx, C1.cy, C2.cx, C2.cy) Then
BeFirst = False
frmGraph.Cls
Unload CurrentResultDlg
For I = 0 To 7
frmAuxi.MutexBtn2(I).Visible = False
Next I
frmAuxi.cmdOK.Visible = False
MsgBox "两圆相包容" & lf & "请检查输入数据", vbCritical Or vbOKOnly, "错误"
IBM Text1(0)
Exit Sub
End IfPublic Function TwoCircle_Line_Dot(C1 As CCIRCLE, C2 As CCIRCLE, WhichOne As Integer, Yes As Boolean) As CPOINT
'┏━━━━━━━━━━━━┓
'┃本函数用来计算两圆之 ┃
'┃公切线,参数C1、C2 ┃
'┃是圆,WhichOne从1 到 ┃
'┃4,代表四个不同的解, ┃
'┃YES代表返回直线与哪一个 ┃
'┃圆的切点,TRUE--表示圆1 ┃
'┃FALSE--表示圆2 ┃
'┗━━━━━━━━━━━━┛
'┏━━━━━━━━━━━┓
'┃定义局部变量 ┃
'┃Dim P1P2 As New CLINE ┃
'┃Dim temp As New CLINE ┃
'┃Dim L As Double ┃
'┃Dim S As Double ┃
'┃Dim C As Double ┃
'┃Dim T As Double ┃
'┗━━━━━━━━━━━┛
On Error GoTo ErrHandle
Dim P1P2 As New CLINE
Dim temp As New CLINE
Dim pt As New CPOINT
Dim L As Double
Dim s As Double
Dim C As Double
Dim T As Double
P1P2.X = C1.cx
P1P2.Y = C1.cy
P1P2.Length = Length(C1.cx, C1.cy, C2.cx, C2.cy)
P1P2.Angle = Angle(C1.cx, C1.cy, C2.cx, C2.cy)
Select Case WhichOne
Case 1
If C1.R = C2.R Then
temp.X = P1P2.X + C1.R * Cos(P1P2.Angle + PI / 2)
temp.Y = P1P2.Y + C1.R * Sin(P1P2.Angle + PI / 2)
temp.Angle = P1P2.Angle
End If
If C1.R > C2.R Then
L = P1P2.Length * C1.R / (C1.R - C2.R)
temp.X = P1P2.X + L * Cos(P1P2.Angle)
temp.Y = P1P2.Y + L * Sin(P1P2.Angle)
s = C1.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + PI - T
End If
If C1.R < C2.R Then
L = P1P2.Length * C2.R / (C2.R - C1.R)
temp.X = P1P2.X + (L - P1P2.Length) * Cos(P1P2.Angle + PI)
temp.Y = P1P2.Y + (L - P1P2.Length) * Sin(P1P2.Angle + PI)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle - T
End If
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle - PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle - PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle - PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle - PI / 2)
End If
Case 2
If C1.R = C2.R Then
temp.X = P1P2.X + C1.R * Cos(P1P2.Angle - PI / 2)
temp.Y = P1P2.Y + C1.R * Sin(P1P2.Angle - PI / 2)
temp.Angle = P1P2.Angle
temp.Length = P1P2.Length
End If
If C1.R > C2.R Then
L = P1P2.Length * C1.R / (C1.R - C2.R)
temp.X = P1P2.X + L * Cos(P1P2.Angle)
temp.Y = P1P2.Y + L * Sin(P1P2.Angle)
s = C1.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + PI + T
End If
If C1.R < C2.R Then
L = P1P2.Length * C2.R / (C2.R - C1.R)
temp.X = P1P2.X + (L - P1P2.Length) * Cos(P1P2.Angle + PI)
temp.Y = P1P2.Y + (L - P1P2.Length) * Sin(P1P2.Angle + PI)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + T
End If
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle + PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle + PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle + PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle + PI / 2)
End If
Case 3
temp.X = C1.cx + C1.R / (C1.R + C2.R) * P1P2.Length * Cos(P1P2.Angle)
temp.Y = C1.cy + C1.R / (C1.R + C2.R) * P1P2.Length * Sin(P1P2.Angle)
L = P1P2.Length * C2.R / (C2.R + C1.R)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle + T
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle - PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle - PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle + PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle + PI / 2)
End If
Case 4
temp.X = C1.cx + C1.R / (C1.R + C2.R) * P1P2.Length * Cos(P1P2.Angle)
temp.Y = C1.cy + C1.R / (C1.R + C2.R) * P1P2.Length * Sin(P1P2.Angle)
L = P1P2.Length * C2.R / (C2.R + C1.R)
s = C2.R
C = Sqr(L ^ 2 - s ^ 2)
If C > 0 Then
T = Atn(s / C)
ElseIf C = 0 Then
T = PI / 2
End If
temp.Angle = P1P2.Angle - T
If Yes Then
pt.X = C1.cx + C1.R * Cos(temp.Angle + PI / 2)
pt.Y = C1.cy + C1.R * Sin(temp.Angle + PI / 2)
Else
pt.X = C2.cx + C2.R * Cos(temp.Angle - PI / 2)
pt.Y = C2.cy + C2.R * Sin(temp.Angle - PI / 2)
End If
Case Else
End Select
Dim Rect As New CRECT
Rect.L = Min(C1.cx - C1.R, C2.cx - C2.R)
Rect.T = Min(C1.cy - C1.R, C2.cy - C2.R)
Rect.R = Max(C1.cx + C1.R, C2.cx + C2.R)
Rect.b = Max(C1.cy + C1.R, C2.cy + C2.R)
CopyRect g_RECT, Rect
ZoominMultiple = DefineZoominmultiple(Rect)
Set TwoCircle_Line_Dot = pt
Exit Function
ErrHandle:
MsgBox
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货