在python中,如何获得三个或多个圆的交点,无论是否有错误



给定三个圆作为

(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))

最新更新