2016-04-20 31 views
1

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

我在下面试过这个算法,它甚至在两个圆形重叠或相距很远的时候都可以工作,但只有在circle1和circle2位于同一个x或y轴上时才有效。

设c1,c2为圆1和圆2; R上半径:

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

@Selcuk不是重复 - 这个问题就简单多了,只是elementaty几何 – MBo

+0

较小的圆可具有不同尺寸或他们具有相同的半径? –

+0

@MBo该问题明确允许 - 仅用于两个圆圈的算法。 – hlt

回答

0

如果你的算法中工作时,这两个中心具有相同x或相同y,那么你可以通过(0, 0)(sqrt((x2-x1)**2+(y2-y1)**2), 0)(只应用在飞机上适当的平移和旋转)取代(x1, y1)(x2, y2)

1

覆盖圈参数(伪):

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

+0

如果两个圆有不同的半径,这是不准确的。如果其中一个圈被包含在另一个圈中,这也是不准确的。 –

+0

@Reblochon Masque我认为半径是相同的,谢谢 – MBo

+0

我想你应该说你的答案使用伪代码,因为问题是关于Python的。 –

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