Cette petite fonction permet de connaître les 2 centres possibles pour un cercle de rayon R passant par les points p1(x1,y1) et p2(x2,y2).
Pour cela :
-je prends le milieu J de p1,p2
-connaissant la distance D entre p1 et p2, j'en déduit la distance CJ (où C est l'un des centres potentiel) grâce à Pythagore
-soit O le centre du repère : le rapport CJ/OJ me donne la tangente de l'angle COJ que j'appelle theta
-j'effectue ensuite une rotation d'un angle theta (et -theta pour l'autre cercle){le truc avec les sinus et cosinus} suivi d'un redimensionnement {OC/OJ} du segment [OJ]
Je renvoie ensuite les deux résultats dans un tableau.
Le main() est là juste pour l'exemple (au passage, il affiche :
"
Soit C=(1.000000,1.000000),
soit C=(2.000000,2.000000).
").
Source / Exemple :
#include <stdio.h>
#include <math.h>
typedef struct {double x,y;} Point;
/*Renvoie un tableau contenant les coordoonées possibles des 2 cercles de rayon R et passant par les points
p1 et p2
Point* trouveCercle(Point *p1,Point *p2,double R)
{
double x_J= (p1->x+p2->x)/2;
double y_J= (p1->y+p2->y)/2;
double D=sqrt((p1->x-p2->x)*(p1->x-p2->x) +(p1->y-p2->y)*(p1->y-p2->y));
double CJ=sqrt(R*R -D*D/4);
double OJ=sqrt(x_J*x_J + y_J*y_J);
double OC=sqrt(OJ*OJ + CJ*CJ);
double theta= atan(CJ/OJ);
Point* tabRetour=(Point*)malloc(2*sizeof(Point));
tabRetour[0].x= (x_J*cos(theta) - y_J*sin(theta))*OC/OJ;
tabRetour[0].y= (y_J*cos(theta) - x_J*sin(theta))*OC/OJ;
tabRetour[1].x= (x_J*cos(theta) + y_J*sin(theta))*OC/OJ;
tabRetour[1].y= (y_J*cos(theta) + x_J*sin(theta))*OC/OJ;
return tabRetour;
}
int main()
{
Point a={1,1};
Point b={2,2};
Point* t=trouveCercle(&a,&b,1);
printf("Soit C=(%lf,%lf),\n",t[0].x,t[0].y);
printf("soit C=(%lf,%lf).",t[1].x,t[1].y);
free (t);
}
Conclusion :
Merci à ma soeur pour m'avoir demandé cette petite fonction :-p
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.