在蟒蛇如何获得三个或三个以上圆的交叉点有或无差错

rebrid:

鉴于三圈作为

(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)三个圆的交点?更确切地说,这怎么能是强大的,即使三个圈在一个点,但没有不相交到底是什么?

我已经尝试使用least_squaresSciPy的,但我不知道它,因为即使在实际圆拦截在一个点上,它提供了另一种结果正常。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章