Advertisement
rAthus

Calcul coordonnées points d'intersection de deux cercles

Apr 20th, 2017
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function calculer_intersections_cercles(c1,c2) // c = [abscisse,ordonnée,rayon]
  2. {
  3.     var Xc1 = c1[0]; // abscisse du centre du premier cercle
  4.     var Yc1 = c1[1]; // ordonnée du centre du premier cercle
  5.     var Rc1 = c1[2]; // rayon du premier cercle
  6.     var Xc2 = c2[0]; // abscisse du centre du second cercle
  7.     var Yc2 = c2[1]; // ordonnée du centre du second cercle
  8.     var Rc2 = c2[2]; // rayon du second cercle
  9.    
  10.     if (Yc1==Yc2) // si les deux cercles sont sur la même abscisse, on utilise un simple Pythagore...
  11.     {
  12.         var a = Math.abs(Xc1-Xc2);
  13.         var XIa = XIb = (Math.pow(Rc2,2)-Math.pow(a,2)-Math.pow(Rc1,2))/(-2*a);
  14.         var YIa = Math.sqrt(Math.pow(Rc2,2)-Math.pow(a-XIa,2));
  15.         var YIb = -YIa;
  16.     }
  17.     else // ...sinon, un peu de trigo des familles !
  18.     {
  19.         var a = (-Math.pow(Xc1,2)-Math.pow(Yc1,2)+Math.pow(Xc2,2)+Math.pow(Yc2,2)+Math.pow(Rc1,2)-Math.pow(Rc2,2))/(2*(Yc2-Yc1));
  20.         var d = (Xc2-Xc1)/(Yc2-Yc1);
  21.         var A = Math.pow(d,2)+1;
  22.         var B = -2*Xc1+2*Yc1*d-2*a*d;
  23.         var C = Math.pow(Xc1,2)+Math.pow(Yc1,2)-2*Yc1*a+Math.pow(a,2)-Math.pow(Rc1,2);
  24.         var delta = Math.pow(B,2)-4*A*C;
  25.         var XIa = (-B+Math.sqrt(delta))/(2*A);
  26.         var XIb = (-B-Math.sqrt(delta))/(2*A);
  27.         var YIa = a-((-B+Math.sqrt(delta))/(2*A))*d;
  28.         var YIb = a-((-B-Math.sqrt(delta))/(2*A))*d;
  29.     }
  30.    
  31.     if (isNaN(XIa) || isNaN(YIa) || isNaN(XIb) || isNaN(YIb))
  32.         return false; // si les cercles ne se touchent pas ou bien sont identiques
  33.     return [[XIa,YIa],[XIb,YIb]]; // coordonnées des deux points d'intersection [abscisse,ordonnée] (nb : seront identiques si les cercles ne se touchent qu'en un seul point)
  34. }
  35.  
  36. // exemples :
  37. console.log(calculer_intersections_cercles([0,50,100],[50,0,100])); // cercles qui se croisent
  38. console.log(calculer_intersections_cercles([0,0,100],[0,75,100])); // cercles sur la même abscisse qui se croisent
  39. console.log(calculer_intersections_cercles([0,0,100],[0,200,100])); // cercles sur la même abscisse qui ne se croisent qu'un en point
  40. console.log(calculer_intersections_cercles([0,0,100],[0,300,100])); // cercles qui ne se croisent pas
  41. console.log(calculer_intersections_cercles([0,0,100],[0,0,100])); // cercles identiques
  42.  
  43. // Sources :
  44. // http://nains-games.over-blog.com/2014/12/intersection-de-deux-cercles.html
  45. // http://nains-games.over-blog.com/2016/05/intersection-de-deux-cercles-simplifie-equation-de-soulgaal.html
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement