计算包含两个较小圆的最小圆的圆心和半径

2024-10-03 17:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个算法,计算中心的坐标和覆盖两个小圆的最小圆的半径。我知道两个较小的圆的半径和中心的x,y坐标。在

我在下面尝试了这个算法,即使两个圆重叠或相距很远,它也能工作,但前提是圆1和圆2在同一x或y轴上。在

设c1,c2是圆1,圆2; 半径:

    if c1x >= c2x:
        if c1y >= c2y:
            c = ((c1x + c1r) + (c2x - c2r))/2, ((c1y + c1r) + (c2y - c2r))/2
            r = max(((c1x + c1r) - (c2x - c2r))/2, 
                     ((c1y + c1r) - (c2y - c2r))/2)
        elif c1y < c2y:
            c = ((c1x + c1r) + (c2x - c2r))/2, ((c2y + c2r) + (c1y - c1r))/2
            r = max(((c1x + c1r) - (c2x - c2r))/2, 
                     ((c2y + c2r) - (c1y - c1r))/2)
    elif if c1x < c2x:
        if c1y >= c2y:
            c = ((c2x + c2r) + (c1x - c1r))/2, ((c1y + c1r) + (c2y - c2r))/2
            r = max(((c2x + c2r) - (c1x - c1r))/2, 
                     ((c1y + c1r) - (c2y - c2r))/2)
        elif c1y < c2y:
            c = ((c2x + c2r) + (c1x - c1r))/2, ((c2y + c2r) + (c1y - c1r))/2
            r = max(((c2x + c2r) - (c1x - c1r))/2, 
                     ((c2y + c2r) - (c1y - c1r))/2)

Tags: 算法if半径中心maxelifc1前提
3条回答

如果你的算法在两个中心都有相同的x或相同的y时起作用,那么可以用(0, 0)和{}替换{}和{}(只需在平面上应用适当的平移和旋转)。在

您应该在代码中遵循DRY原则(不要重复自己),不要多次重复公式。您将出现复制粘贴错误或忘记修改其中一个副本。在

我通过对小圆进行排序,将公式的所有变体组合在一起,这样我就可以直接访问例如最左边的圆的x(cax)和它的半径(caxr)或最低的圆y(cby)及其半径(cbyr)。在

from math import sqrt

(cax, caxr), (cbx, cbxr) = sorted([(c1x, c1r), (c2x, c2r)], key=lambda t:t[0])
(cay, cayr), (cby, cbyr) = sorted([(c1y, c1r), (c2y, c2r)], key=lambda t:t[0])

x = (cax-caxr + cbx+cbxr) / 2
y = (cay-cayr + cby+cbyr) / 2

r = sqrt( ((cax-caxr) - (cbx+cbxr))**2 + ((cay-cayr) + (cby+cbyr))**2 ) / 2

See this code running on IDEone.com

覆盖圆参数(伪码):

dx = c2x - c1x
dy = c2y - c1y
//center-center distance   
dc = Sqrt(dx**2 + dy**2)
rmin = Min(r1, r2)
rmax = Max(r1, r2)
if rmin + dc < rmax then
    covercenter = center of larger circle
    R = rmax
else
    R = 0.5 * (r1 + r2 + dc)
    x = c1x + (R - r1) * dx / dc
    y = c1y + (R - r1) * dy / dc

工作示例(蓝色表示覆盖): enter image description here

相关问题 更多 >