Trouver le centre d'un cercle

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 812 fois - Téléchargée 19 fois

Contenu du snippet

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

A voir également

Ajouter un commentaire Commentaires
Messages postés
19
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
21 mai 2010

je me trompe peut être mais si on cherche l'ensemble des centre possible d'un cercle en connaissant la position de deux de ses points, la solution c'est la médiatrice de la droite formée par ces 2 points. (en fait 2 demi droite).

ensuite si on connais le rayon du cercle on se retrouve avec l'equation d'une droite, la distance d'un de nos deux point p a cette droite est la moitié de la distance p1 p2, et la distance du centre du cercle a p1 est r.
si avec tout ca on ne peux pas trouver une expression simple de la solution, sans passer par des équations compliquées ^^....
Messages postés
1
Date d'inscription
jeudi 10 août 2006
Statut
Membre
Dernière intervention
25 septembre 2007

theta= atan(CJ/OJ) c'est pas tout le temps vrai, il faut avoir un angle droit dans le triangle COJ
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Je l'ai dit au-dessus pour systèmes non linéaires base de Groeber et algo de Buchberger
Messages postés
3
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
20 septembre 2007

Merci lucky pour ta réponse

Cyberboy>
ah ben non, faut pas pousser non plus ... sinon on aurait pas besoin de construire des supercalculateurs de plusieurs tera flops (floating operation per second) :-p
Messages postés
173
Date d'inscription
jeudi 20 décembre 2001
Statut
Membre
Dernière intervention
22 août 2008

Oui je me doute que ta méthode résoud le systeme, même s'il ne se trouve pas sous cette forme.
Mais je pensais plutot à des méthodes générales de resolutions de systemes non linéaires (genre pivot de gauss ou autres pour du linéaire)
Afficher les 12 commentaires

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.