/*************************************************************************************************************************************/ /* */ /* 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.02$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20051107105318). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Introduit le 20051109113051... */ #define ITERATIONS 64 #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 300 #define DEMI_PETIT_AXE 50 #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(); extern void *malloc(); static int dimX=0; #define Xmin 0 #define Xmax (Xmin + (dimX-1)) /* Definition des abscisses. */ static int dimY=0; #define Ymin 0 #define Ymax (Ymin + (dimY-1)) /* Definition des ordonnees. */ #define IMAGE(x,y) \ (*(image + (((y-Ymin)*dimX) + (x-Xmin)))) \ /* Acces a un point de l'image (reintroduit le 20221012115600...). */ #define store(n,x,y) \ { \ IMAGE(x,y) = n; \ } \ /* Rangement d'un point valide d'une image (reintroduit le 20221012115600...). */ main() { int x,y; /* Definition des coordonnees. */ unsigned char *image; /* Definition de l'image a generer... */ 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. */ Get(dimX,"dimX"); Get(dimY,"dimY"); /* Recuperation des dimensions en 'X' et en 'Y' de l'image a generer. */ image=(unsigned char*)malloc(dimY*dimX); /* Definition de l'image a generer... */ for (y=Ymin ; y<=Ymax ; y++) { for (x=Xmin ; x<=Xmax ; x++) { store(NOIR,x,y); /* Initialisation de l'image finale... */ } } 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... */ store(BLANC ,(int)(x)+(dimX/2) ,(int)(y)+(dimY/2) ); /* Trace de l'ellipse... */ 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; } write(1,image,dimX*dimY); /* Sortie de l'image... */ }