/*************************************************************************************************************************************/ /* */ /* R E S O L U T I O N D E L ' E Q U A T I O N D E K E P L E R */ /* P E R M E T T A N T A U N C O R P S C E L E S T E D E P A R C O U R I R */ /* U N E T R A J E C T O I R E E L L I P T I Q U E : */ /* */ /* */ /* Author of '$xtc/EquKepler.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20051102093745). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Introduit le 20051109112929... */ #define ITERATIONS 140 #define EPSILON 0.000001 #define TEMPS_0 0.0 #define PAS_TEMPS 0.1 #define THETA_CIRCULAIRE_0 0.0 #define PAS_THETA_CIRCULAIRE 0.1 #define DEMI_GRAND_AXE 1.0 #define DEMI_PETIT_AXE 0.5 #define EXCENTRICITE (DISTANCE_FOCALE/DEMI_GRAND_AXE) #define DISTANCE_FOCALE sqrt(EXP2(DEMI_GRAND_AXE)-(EXP2(DEMI_PETIT_AXE))) #define PARAMETRE_FOCAL EXP2(DEMI_PETIT_AXE)/DEMI_GRAND_AXE extern double cos(); extern double sin(); extern double acos(); extern double sqrt(); main() { int n; double temps=TEMPS_0; double rho_circulaire=DEMI_GRAND_AXE; double theta_circulaire=THETA_CIRCULAIRE_0; /* Angle 'theta' de parcours du cercle circonscrit a l'ellipse. */ printf("a=%f\n",DEMI_GRAND_AXE); printf("b=%f\n",DEMI_PETIT_AXE); printf("e=%f\n",EXCENTRICITE); printf("p=%f\n",PARAMETRE_FOCAL); printf("\n"); for (n=1 ; n<=ITERATIONS ; n++) { double pas_theta=PAS_THETA_CIRCULAIRE; int iterer=0; while (iterer == 0) { double formule=theta_circulaire - (EXCENTRICITE*sin(theta_circulaire)); /* Formule d'equivalence entre le temps (de parcours de l'ellipse) et le 'theta' du cercle : */ /* */ /* thetaC - e.sin(thetaC) = temps */ /* */ /* d'ou : */ /* */ /* thetaC = fonction1(temps). */ /* */ if (ABSO(formule-temps) < EPSILON) { double numerateur,denominateur; double rho_elliptique,theta_elliptique; /* {rhoE,thetaE} de parcours de l'ellipse, l'origine etant alors le foyer de droite de */ /* l'ellipse. */ int correction; /* Afin que 'thetaE' puisse aller au-dela de pi... */ double x,y; /* {x,y} du point courant de l'ellipse, l'origine etant le centre de l'ellipse (et du */ /* cercle)... */ numerateur=(rho_circulaire*cos(theta_circulaire))-DISTANCE_FOCALE; denominateur=((PARAMETRE_FOCAL+(DISTANCE_FOCALE*EXCENTRICITE)) -(rho_circulaire*EXCENTRICITE*cos(theta_circulaire)) ); /* On a : */ /* */ /* p */ /* rhoE = ------------------- */ /* 1 + e.cos(thetaE) */ /* */ /* (l'origine etant le foyer de droite de l'ellipse) d'ou : */ /* */ /* x = a.cos(thetaC) = rhoE.cos(thetaE) + d */ /* */ /* (l'origine etant le centre de l'ellipse -et du cercle-) d'ou : */ /* */ /* thetaE = fonction2(thetaC). */ /* */ /* et enfin, les coordonnees {x,y} du point courant de l'ellipse : */ /* */ /* x = rhoE.cos(thetaE) + d */ /* y = rhoE.sin(thetaE) */ /* */ /* (l'origine etant le centre de l'ellipse -et du cercle-) avec : */ /* */ /* a = DEMI_GRAND_AXE */ /* b = DEMI_PETIT_AXE */ /* d = DISTANCE_FOCALE */ /* e = EXCENTRICITE */ /* p = PARAMETRE_FOCAL */ /* */ if (ABSO(numerateur/denominateur) <= 1.0) { theta_elliptique = acos(numerateur/denominateur); } else { if ((numerateur/denominateur) >= 0.0) { theta_elliptique = acos(+1); } else { theta_elliptique = acos(-1); } } correction=theta_circulaire/PI; /* En effet, 'acos(...)' renvoie des valeurs dans [0,PI]. Il convient donc de corriger */ /* 'thetaE' en fonction de 'thetaC'... */ if (correction >= 0) { if (EST_PAIR(correction)) { theta_elliptique=((correction+0)*PI) + theta_elliptique; } else { theta_elliptique=((correction+1)*PI) - theta_elliptique; } } else { } rho_elliptique=PARAMETRE_FOCAL/(1+(EXCENTRICITE*cos(theta_elliptique))); x=(rho_elliptique*cos(theta_elliptique))+DISTANCE_FOCALE; y=(rho_elliptique*sin(theta_elliptique)); /* Calcul du point courant de l'ellipse... */ printf("temps=%f (formule=%f) thetaC=%f thetaE=%f point={%f,%f}\n" ,temps ,formule ,theta_circulaire ,theta_elliptique ,x,y ); iterer++; } else { if (formule > temps) { pas_theta = pas_theta/2.0; theta_circulaire = theta_circulaire-pas_theta; } else { theta_circulaire = theta_circulaire+pas_theta; } } } temps = temps + PAS_TEMPS; } }