给三个圆圈作为
(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中的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, 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
。请参考the docs了解这些参数的作用。它们避免了因成本函数的变化和自变量的变化而终止。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))