2012-08-31 4 views
15

enter image description hereUna funzione JavaScript che restituisce i punti x, y dell'intersezione tra due cerchi?

Ho la posizione centrale (x, y) di due cerchi e il loro raggio ma ho bisogno di trovare i loro punti di intersezione (contrassegnati con il rosso) utilizzando JavaScript.

Penso che la spiegazione migliore per quanto riguarda la matematica si trova here (intersezione di due cerchi), ma io non capisco davvero la matematica, quindi non sono in grado di implementarlo.

Ad esempio d = || P1 - P0 || , che cosa fanno || stare per? Significa che il numero risultante è sempre positivo?

E anche P2 = P0 + a (P1 - P0)/d, non sono i P qui qualcosa come (10, 50)? Ma fare (10,50) +13 in JavaScript ti dà 63, quindi ignora solo il primo numero, quindi cosa dovrebbe succedere? Il risultato dovrebbe essere (23,63) qui o? E anche la parte P1-P0 o (40,30) - (10,60), come la esprimi in JavaScript?

+2

Queste sono funzioni vettoriali; stai operando in due dimensioni, dopotutto. È necessario costruire funzioni di algebra vettoriale equivalenti in JS per ottenere il risultato desiderato. – Xophmeister

+2

... o tradurre l'implementazione C collegata in basso a JavaScript. – duskwuff

+2

'd = || P1 - P0 ||' indica la distanza tra i punti P0 e P1, quindi d = sqrt ((x1-x2) ² + (y1-y2) ²) –

risposta

31

tradusse la funzione C sul sito per JavaScript:

function intersection(x0, y0, r0, x1, y1, r1) { 
     var a, dx, dy, d, h, rx, ry; 
     var x2, y2; 

     /* dx and dy are the vertical and horizontal distances between 
     * the circle centers. 
     */ 
     dx = x1 - x0; 
     dy = y1 - y0; 

     /* Determine the straight-line distance between the centers. */ 
     d = Math.sqrt((dy*dy) + (dx*dx)); 

     /* Check for solvability. */ 
     if (d > (r0 + r1)) { 
      /* no solution. circles do not intersect. */ 
      return false; 
     } 
     if (d < Math.abs(r0 - r1)) { 
      /* no solution. one circle is contained in the other */ 
      return false; 
     } 

     /* 'point 2' is the point where the line through the circle 
     * intersection points crosses the line between the circle 
     * centers. 
     */ 

     /* Determine the distance from point 0 to point 2. */ 
     a = ((r0*r0) - (r1*r1) + (d*d))/(2.0 * d) ; 

     /* Determine the coordinates of point 2. */ 
     x2 = x0 + (dx * a/d); 
     y2 = y0 + (dy * a/d); 

     /* Determine the distance from point 2 to either of the 
     * intersection points. 
     */ 
     h = Math.sqrt((r0*r0) - (a*a)); 

     /* Now determine the offsets of the intersection points from 
     * point 2. 
     */ 
     rx = -dy * (h/d); 
     ry = dx * (h/d); 

     /* Determine the absolute intersection points. */ 
     var xi = x2 + rx; 
     var xi_prime = x2 - rx; 
     var yi = y2 + ry; 
     var yi_prime = y2 - ry; 

     return [xi, xi_prime, yi, yi_prime]; 
    } 
+0

A partire da ES6, 'Math.hypot (dx, dy)' può essere usato al posto di 'Math.sqrt ((dy * dy) + (dx * dx))'. – Arnauld