求两个圆交点的坐标-解析表达式推导及编程

从圆的一般方程入手x ^ 2+y^2+Dx+Ey+F=0,推导两个圆的交点公式:
手打牛肉丸

从圆的一般方程入手x2+y2+Dx+Ey+F=0,(1)-(2)求出x=a*y+b (3)

感谢伟大的计算机,我们只要标记那一大坨的表达式为a,b就可以了,因为a,b是可以计算的,我们不需要将它展开。然后将(3)式代回(1)式,得到关于y的一元二次方程,又是一大坨的系数表达式,感谢伟大的计算机,别怕,将它们标记为A,B,C,这样就可以了,利用通解公式就可以计算出y了!

谢天谢地,我们不用把那么复杂的式子展开来计算,全部交给计算机好啦!这就是我喜欢计算机的原因!我做学生时,面对这么复杂的式子,内心是崩溃的,是完全没信心计算出来的。

下面就是利用VBA+EXCEL来算题了,输入界面,有点粗糙啊,凑合着看:
程序界面

输入界面,算例1
已知两个圆:(x1,y1) r1 和 (x2,y2)r2 求出它们的交点为 Xr1,Yr1 (可能有2、1、0个交点)。 最开始用增量搜索法计算,这是一种暴力求解方法,不精确,不稳定。现在改为解析公式进行计算,结果可靠,可以在CAD中进行验证。
CAD验证

算例1在CAD中验证(有舍入误差)
最后贴出VBA代码:

Private Sub CommandButton2_Click()    ''解析公式计算 2023-7
   Dim x1, y1, x2, y2, r1, r2, t As Double
   Dim xr1, xr2, yr1, yr2 As Double     ''求解出来的二个交点
   Dim bSwap As Boolean
   Dim D1, D2, E1, E2, F1, F2 As Double
   Dim a, b As Double
   Dim A1, B1, C1 As Double
   Dim B4AC As Double
     
   
  '' =======start=======
   
   x1 = Cells(3, "F")
   y1 = Cells(3, "G")
   x2 = Cells(4, "F")
   y2 = Cells(4, "G")
   r1 = Cells(3, "D")
   r2 = Cells(4, "D")
    
   bSwap = False
    
   If x1 = x2 And y1 = y2 Then
        MsgBox "两圆无交点(圆心重合)"
        Exit Sub
   Else
        If Abs(x1 - x2) < Abs(y1 - y2) Then  '' 交换X,Y
            t = x1: x1 = y1: y1 = t
            t = x2: x2 = y2: y2 = t
            bSwap = True
        End If
   End If
    
   D1 = -2 * x1: E1 = -2 * y1: F1 = x1 ^ 2 + y1 ^ 2 - r1 ^ 2
   
   D2 = -2 * x2: E2 = -2 * y2: F2 = x2 ^ 2 + y2 ^ 2 - r2 ^ 2
   
   a = (E2 - E1) / (D1 - D2)
   b = (F2 - F1) / (D1 - D2)
   
   A1 = a ^ 2 + 1
   B1 = 2 * a * b + D1 * a + E1
   C1 = b ^ 2 + D1 * b + F1
   
   B4AC = B1 ^ 2 - 4 * A1 * C1
   
   If B4AC < 0 Then
       MsgBox "两圆无交点!"
       Exit Sub
   End If
   
   If B4AC > 0 Then
        yr1 = (-1 * B1 + Sqr(B4AC)) / (2 * A1)
        xr1 = a * yr1 + b
        
        If bSwap Then
             t = xr1
             xr1 = yr1
             yr1 = t
        End If
        
        Cells(6, "J") = xr1
        Cells(7, "J") = yr1
        
        yr1 = (-1 * B1 - Sqr(B4AC)) / (2 * A1)
        xr1 = a * yr1 + b
        
        If bSwap Then
             t = xr1
             xr1 = yr1
             yr1 = t
        End If
        
        Cells(6, "K") = xr1
        Cells(7, "K") = yr1
        
    End If
    
    If B4AC = 0 Then
    
        yr1 = (-1 * B1 + Sqr(B4AC)) / (2 * A1)
        xr1 = a * yr1 + b
        
        If bSwap Then
             t = xr1
             xr1 = yr1
             yr1 = t
        End If
        
        Cells(6, "J") = xr1
        Cells(7, "J") = yr1
        
    End If
    
End Sub

最后略微解释一下:当x1=x2时会导致被0除(计算a,b时),这时并不表示无解,将x,y互换一下即可。若圆心坐标完全相同,当然是无解了(重合有无数个解)。另外,以x,y差值大的方向来计算,精度更高。所以程序中有个小小的交换技巧,不影响计算结果!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值