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

问题描述 投票:2回答:1

给三个圆圈作为

(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))
python optimization scipy least-squares
1个回答
1
投票
虽然可以使用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))

© www.soinside.com 2019 - 2024. All rights reserved.