从圆的一般方程入手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中进行验证。
算例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差值大的方向来计算,精度更高。所以程序中有个小小的交换技巧,不影响计算结果!