code pour déterminer le cente et le rayon d'un cercle à partir de 3 points non alignés :
#include <stdio.h>
#include <math.h>
//*******************************************************************
// équation d'un cercle de centre (x0,y0) et de rayon R :
// (x-x0)² + (y-y0)² = R²
//
// avec 3 point A, B et C non alignés, on peut trouver le
// cercle passant par ces 3 points:
//
// les 3 équations de base (développées) :
// (1) xA² + x0² - 2*xA*x0 + yA² + y0² - 2*yA*y0 = R²
// (2) xB² + x0² - 2*xB*x0 + yB² + y0² - 2*yB*y0 = R²
// (3) xC² + x0² - 2*xC*x0 + yC² + y0² - 2*yC*y0 = R²
//// on réalise (2)' (2)-(1) et (3)' (3)-(1)
// après simplification et réarrangement :
// (2)' 2*x0*(xA-xB) + 2*y0*(yA-yB) = xA² - xB² + yA² - yB²
// (3)' 2*x0*(xA-xC) + 2*y0*(yA-yC) = xA² - xC² + yA² - yC²
//
// (2)' A*x0 + B*y0 = C
// (3)' D*x0 + E*y0 = F
//
//
// système de 2 équations à 2 inconnues, calcul du déterminant
// (si nul, le système n'a pas de solution unique et on n'a pas
// affaire à un cercle) :
// det = A*E - B*D
//
// les solutions sont :
// x0 = (EC-BF)/det
// y0 = (AF-DC)/det
//
// le rayon s'obtient ensuite :
// R = sqrt( (xA-x0)² + (yA-y0)² )
//*******************************************************************
int main(int argc, char* argv[])
{
// les 3 points initiaux (cercle de centre (2,3) et de rayon 4,
// correspondant à des angles de 60°, 150° et 225°)double xA 4.0000, yA 6.4641;double xB -1.4641, yB 5.0000;double xC -0.8284, yC 0.1716;
// calcul de A, B, C, D, E, F et det
double A = 2*(xA-xB);
double B = 2*(yA-yB);
double C = xA*xA - xB*xB + yA*yA - yB*yB;
double D = 2*(xA-xC);
double E = 2*(yA-yC);
double F = xA*xA - xC*xC + yA*yA - yC*yC;
double det = A*E - B*D;printf("A %lf, B %lf, C = %lf\r\n", A, B, C);printf("D %lf, E %lf, F = %lf\r\n", D, E, F);
printf("det = %lf\r\n", det);
if(det == 0)
{
printf("det = 0, ce n'est pas un cercle\r\n");
return 0;
}
// calcul de x0 et y0
double x0 = (E*C-B*F)/det;
double y0 = (A*F-D*C)/det;
printf("x0 = %lf\r\n", x0);
printf("y0 = %lf\r\n", y0);
// calcul de R
double R = sqrt( (xA-x0)*(xA-x0) + (yA-y0)*(yA-y0) );
printf("R = %lf\r\n", R);
return 0;
}
Pour ce qui est de tracer le cercle, je ne sais pas, mais la plupart des fonctions de dessins de cercles se basent sur le centre et le rayon.