在python中如何得到三个或多个圆的交点有无错误

In python how to get intersection point of three or more circles with or without error

给定三个圆作为

(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) 交点?更准确地说,即使三个圆不完全相交于一点而是 none?

,这怎么可能是稳健的?

我尝试使用 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)作为参数,因为你正在寻找交点。

  • 每个圆的 return 值应为 (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))