第一个很好办吧,不用说直线,圆弧我都连接过,不过我的程序相关性太大,摘不出来,也不能送人。第二个问题,有些代码供你参考
非法条件
    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