2016-04-20 81 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