2016-04-20 2 views
1

Ich versuche einen Algorithmus zu finden, der die Koordinaten des Mittelpunkts und des Radius des kleinsten Kreises berechnet, der zwei kleinere Kreise abdeckt. Ich kenne den Radius und x, y Koordinaten der Mitte der 2 kleineren Kreise.Berechnen Sie die Mitte und den Radius des kleinsten Kreises, der zwei kleinere Kreise enthält

Ich habe versucht, diesen Algorithmus unten, es funktioniert auch, wenn die beiden Kreise oder weit auseinander überlappen, aber das ist nur, wenn circle1 und circle2 auf dem gleichen x oder y-Achse ist.

Sei c1, c2 Kreis1 und Kreis 2; r Radius:

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 kein Duplikat - diese Frage ist viel einfacher, nur elementaty Geometrie – MBo

+0

können die kleineren Kreise unterschiedliche Größen haben oder haben sie den gleichen Radius haben? –

+0

@MBo Diese Frage erlaubt explizit - und wird mit - Algorithmen für nur zwei Kreise beantwortet. – hlt

Antwort

0

Wenn Ihr algo funktioniert, wenn beide Zentren gleiche x oder gleiche y haben, dann sind Sie (x1, y1) und (x2, y2) von (0, 0) und (sqrt((x2-x1)**2+(y2-y1)**2), 0) (nur die Anwendung die entsprechende Translation und Rotation in der Ebene) ersetzen könnte.

1

Covering Kreisparameter (Pseudo-Code):

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 

Arbeitsbeispiele (blau bedeckt): enter image description here

+0

Dies ist ungenau, wenn die beiden Kreise unterschiedliche Radien haben. Es ist auch ungenau, wenn einer der Kreise in den anderen eingeschlossen ist. –

+0

@Reblochon Masque Ich dachte, dass Radien die gleichen sind, danke – MBo

+0

Ich denke, Sie sollten angeben, dass Ihre Antwort Pseudocode verwendet, wie die Frage über Python ist. –

0

sollten Sie folgen dem DRY Prinzip (Do wiederholen sich nicht) in Ihrem Code und duplizieren Sie Ihre Formeln nicht mehrfach. Sie werden Copy-Paste-Fehler machen oder vergessen, eine der Kopien zu ändern.

Ich gruppiere alle diese Variationen der Formel zusammen durch Sortieren der kleinen Kreise, so dass ich direkt auf z. Die äußerste linke Kreises x (cax) und dessen Radius (caxr) oder der niedrigsten Kreises y (cby) und dessen Radius (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

Verwandte Themen