鉴于三圈作为
(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_squares从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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句