begin process at 2012 05 27 21:07:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > TROUVER LE CENTRE D'UN CERCLE

TROUVER LE CENTRE D'UN CERCLE


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :cercle, coordonnées, trouver Niveau :Débutant Date de création :18/09/2007 Date de mise à jour :19/09/2007 10:23:35 Vu :9 963

Auteur : sebsheep

Ecrire un message privé
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

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

  • #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);
  • }
#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


 Historique

19 septembre 2007 10:23:35 :
.

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip POLYGONE EN SDL par alexis0788
Source avec Zip Source avec une capture DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH par Pistol_Pete
Source avec Zip RÉCUPÉRATION DES COORDONNÉES GPS EN LIAISON SÉRIE AVEC LA T... par rayzor
Source avec Zip INTÉRÊT DE L’UTILISATION D’UNE CLASSE ABSTRAITE [DEV-CPP] par stenka

Commentaires et avis

Commentaire de juju12 le 18/09/2007 20:25:25

Tu devrais gérer les exceptions(p1=p2,||p1p2||>2R); il serait possible de faire cela sans trigo : résout les équations à la main dans le cas général et utilises après le résultat  dans le code, ca sera plus rapide.
Et niveau initié c'est pas un peu (beaucoup) exagéré?

Commentaire de sebsheep le 19/09/2007 10:23:05

effectivement les exceptions ne sont pas gérées, mais vu l'application, il n'y a pas d'exception possible.

Sinon, j'avais essayé de résoudre à la main mais j'étais pas arrivé à grand chose ... tu peux m'éclairer?

Commentaire de juju12 le 19/09/2007 11:32:20

Ben t'as deux points (x1;y1) et (x2;y2), tu cherches le centre (x;y) d'un cercle de rayon R donc tu as le système :
(x-x1)²+(y-y1)²=R²
(x-x2)²+(y-y2)²=R²

Et t'as plus qu'à résoudre ça.

Commentaire de Cyberboy2054 le 19/09/2007 20:08:20

Ya des manières non numeriques de résoudre des systemes non linéaires, comme c'est le cas ici ?
Il me semble que ca ce généralise assez mal mais bon je prends si vous avez des infos intéressantes la dessus :)

Commentaire de sebsheep le 19/09/2007 20:22:18

ben la preuve c'est ce que j'ai fait ... mais apres doit pas falloir rajouter des trucs en plus sinon ca devient assez insolubles. Non linéaire ne veut pas dire impossible à résoudre à la main. x^2=4 est une équation non linéaire, et pourtant un 3 eme sait le faire !


Sinon pour ce qui est de la solution en résolvant le système, ca me fait des trucs assez barbares comme expressions...

Commentaire de juju12 le 19/09/2007 20:53:04

Pour info on peut résoudre n'importe quel système polynômial de façcon générale (base de Groebner), enfin du moins on peut isoler toutes les inconnues pour obtenir des équations indépendantes, mais évidemment il faut chercher à ce moment là des solutions numériques si le degré est supérieur ou égal à 5.

Commentaire de Lucky92 le 20/09/2007 07:16:39

Bonjour,

en utilisant les complexes, j'obtiens les solutions non triviales par la formule suivante :

z = ( a + b ) / 2. ± i / 2. * ( b - a ) * sqrt( norm( 2 * R / ( b - a ) ) - 1 );

z affixe des centres des cercles recherchés
a , b affixes des deux points donnés
i = std::complex<double>( 0 , 1 )
std::norm( x + iy ) = x² + y²;

Pour arriver à ce résultat, j'ai utilisé la géométrie affine ; j'esquive ainsi la trigonométrie & les systèmes d'équations non linéaires. J'ai basculé en complexe uniquement pour simplifier l'implémentation.

Commentaire de Cyberboy2054 le 20/09/2007 19:50:40

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)

Commentaire de sebsheep le 20/09/2007 19:57:33

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

Commentaire de juju12 le 20/09/2007 22:59:41

Je l'ai dit au-dessus pour systèmes non linéaires base de Groeber et algo de Buchberger

Commentaire de hichmous le 25/09/2007 19:42:04

theta= atan(CJ/OJ) c'est pas tout le temps vrai, il faut avoir un angle droit dans le triangle COJ

Commentaire de flamt le 20/09/2008 22:10:24

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 ^^....

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Où trouver le Win32 SDK ? [ par PierreP ] ... avec un help ou qqchose de ce genre qui explique comment on utilise les fonctions.Impossible de le trouver sur Le site de Microsoft ! comment on fait pourn trouver un fichier sur le disque un c++ [ par Wipet2k ] boujour J'aimerais savoir comment on fait pour trouverun ficher sur le disque dur en c++Merci d'avence :) Trouver les diviseur d'un nombre [ par Olivier ] Salut,je viens de découvrir ce site et je le trouve vraiment complet !! ça fait longtemps que je cherche ce genre de site proposant des sources de pro Où trouver Turbo C++ 3 ? [ par FirE SnakE ] Pouvez-vous me dire où je peux trouver le compileur Turbo C++ 3 ? Liste de mots français [ par Kassad ] Afin de pouvoir commencer un projet if, j'ai besoin de trouver une liste des mots français la plus complète possible.G déjà passé pas mal de temps à e ou trouver graphics.h [ par Seb_d_angers ] Si vous pouvez me l'envoyer ou me dire ou je peux le trouver. Mercisebastiendelestre@wanadoo.fr ou pourais-je trouver un décompilateur pour les dll?? [ par ditch ] je dois pour un travail utiliser une DLL existante mais malheureusement elle foire avec l'utilisation d'une de ses fonctions, j'aimerais trouver un dé Ou trouver les fichiers winsock.h .... [ par YoDaaa ] ou puis je trouver des fichiers *.h, dont le fichier winsock.h par exemple...merci d'avance !!! Coordonnées de la souris et résolution de l'écran [ par Thanatos ] Bonjour,Comment récupérer et afficher les coordonnées de la souris avec Borland c++ Builder ? Et commment récupérer la résolution de l'écran? OU pourrais je trouver de la doc sur le REGEDIT [ par bily ] Vegeta :-)je voudrai surtout savoir comment faire pour bloquer l'acces au disque dur et de retirer les raccourci se trouvant sur le boutton demarerrac


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales