给定三个圆作为
(x - x1)**2 + (y - y1)**2 = r1**2
(x - x2)**2 + (y - y2)**2 = r2**2
(x - x3)**2 + (y - y3)**2 = r3**2
如何在python中找到三个圆的(x,y(交点?更准确地说,即使三个圆不正好在一个点相交,但没有相交,这怎么可能是稳健的呢?
我曾尝试使用scipy中的最小二乘法,但我不确定它是否正常工作,因为即使圆实际上在一个点上相交,它也会给出另一个结果。
def intersectionPoint(p1,p2,p3):
x1, y1, dist_1 = (p1[0], p1[1], p1[2])
x2, y2, dist_2 = (p2[0], p2[1], p2[2])
x3, y3, dist_3 = (p3[0], p3[1], p3[2])
def eq(g):
x, y, r = g
return (
(x - x1)**2 + (y - y1)**2 - (dist_1 - r )**2,
(x - x2)**2 + (y - y2)**2 - (dist_2 - r )**2,
(x - x3)**2 + (y - y3)**2 - (dist_3 - r )**2)
guess = (100, 100, 0)
ans = scipy.optimize.least_squares(eq, guess)
return ans
ans = intersectionPoint((0,0,9962),(7228,0,9784),(4463,3109,6251))
虽然使用least_squares
解决这个问题是可能的,但代码中有一些内容需要更改。
-
eq
函数应该只取一个点(x,y(作为参数,因为您正在寻找交点。 -
每个圆的返回值应该是
(x - x1)**2 + (y - y1)**2 - dist_1**2
(即到圆的距离的平方(。 -
对
least_squares
的调用应该使用一些额外的参数来避免误报,即ftol=None, xtol=None
。请参阅文档以了解这些参数的作用。它们避免了因成本函数的变化和自变量的变化而终止。 -
我会把猜测改为第一个圆上的一个点,这样算法就从相关区域
guess = (x1, y1 + dist_1)
开始
当然,不要忘记检查success
属性,以检查算法是否收敛!
然后代码变为:
from scipy.optimize import least_squares
def intersectionPoint(p1,p2,p3):
x1, y1, dist_1 = (p1[0], p1[1], p1[2])
x2, y2, dist_2 = (p2[0], p2[1], p2[2])
x3, y3, dist_3 = (p3[0], p3[1], p3[2])
def eq(g):
x, y = g
return (
(x - x1)**2 + (y - y1)**2 - dist_1**2,
(x - x2)**2 + (y - y2)**2 - dist_2**2,
(x - x3)**2 + (y - y3)**2 - dist_3**2)
guess = (x1, y1 + dist_1)
ans = least_squares(eq, guess, ftol=None, xtol=None)
return ans
ans = intersectionPoint((0,0,1),(2,0,1),(1,-1,1))