/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E V A L E U R S C O R R E S P O N D A N T A L ' U N E D E S */
/* C O O R D O N N E E S D ' U N C E R C L E D ' U N P L A N D E C O O R D O N N E E S : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere une sequence */
/* de valeurs numeriques flottantes obtenues */
/* par calcul d'une fonction du type : */
/* */
/* h.theta */
/* R.base .[alpha.cos(theta) + beta.sin(theta) + gamma] + (delta.theta) + T */
/* */
/* Par defaut, le calcul effectue est */
/* le suivant : */
/* */
/* cos(theta) avec theta E [0,2.pi]. */
/* */
/* Ainsi qu'on le voit, cette commande permet */
/* aussi de calculer une suite d'exponentielles. */
/* Par exemple : */
/* */
/* $xci/valeurs_trig$X p=1 d=8 aD=0 aA=7 cubique=FAUX a=0 b=0 c=1 h=1 base=2 */
/* */
/* edite les 8 premieres puissances de 2 */
/* {+1,+2,+4,+8,+16,+32,+64,+128}. */
/* */
/* */
/* Author of '$xci/valeurs_trig$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1992??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_MINI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define INTERPOLER_PAR_DES_SPLINES_CUBIQUES \
VRAI \
/* Cet indicateur permet la selection entre une interpolation "cubique" ('VRAI') ou bien */ \
/* "lineaire" ('FAUX'). */
#include xci/sequence.01.I"
#define RAYON_DE_DEPART \
FU
#define DERIVEE_DU_RAYON_DE_DEPART \
FZERO
/* Definition du rayon 'R' du cercle au depart et de sa derivee. */
#define RAYON_D_ARRIVEE \
FU
#define DERIVEE_DU_RAYON_D_ARRIVEE \
FZERO
/* Definition du rayon 'R' du cercle a l'arrivee et de sa derivee. */
#define BASE_DE_L_EXPONENTIELLE \
EN \
/* Base de l'exponentielle. */
#define FACTEUR_DE_L_EXPOSANT \
FZERO
/* Definition du facteur multiplicatif de l'exposant de l'exponentielle. */
#define ANGLE_DE_DEPART \
FZERO
#define DERIVEE_DE_L_ANGLE_DE_DEPART \
FZERO
/* Definition de l'angle 'theta' de depart et de sa derivee. */
#define ANGLE_D_ARRIVEE \
CERCLE_TRIGONOMETRIQUE
#define DERIVEE_DE_L_ANGLE_D_ARRIVEE \
FZERO
/* Definition de l'angle 'theta' d'arrivee et de sa derivee. */
#define ALPHA \
FU
#define BETA_ \
FZERO
#define GAMMA \
FZERO
/* Definition des coefficients 'a', 'b' et 'c' de la forme 'LIN2(...)' a calculer... */
#define FACTEUR_LINEAIRE_DE_L_ANGLE \
FZERO \
/* Facteur 'delta' de l'angle courant. */
#define TRANSLATION_ABSOLUE \
FZERO \
/* Translation absolue 'T'. */
#include xci/valeurs.01.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xci/valeurs.02.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E V A L E U R S C O R R E S P O N D A N T A L ' U N E D E S */
/* C O O R D O N N E E S D ' U N C E R C L E D ' U N P L A N D E C O O R D O N N E E S : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(interpoler_par_des_splines_cubiques,INTERPOLER_PAR_DES_SPLINES_CUBIQUES));
/* Cet indicateur permet la selection entre une interpolation "cubique" ('VRAI') ou bien */
/* "lineaire" ('FAUX'). */
DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
/* Numero de la premiere image, */
DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE));
/* Numero de la derniere image. */
DEFV(Int,INIT(numero_d_image,UNDEF));
/* Numero de l'image courante. */
DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
/* Pas de passage d'un numero d'image a une autre. */
DEFV(Float,INIT(rayon_de_depart,RAYON_DE_DEPART));
DEFV(Float,INIT(derivee_du_rayon_de_depart,DERIVEE_DU_RAYON_DE_DEPART));
/* Definition du rayon 'R' du cercle au depart et de sa derivee. */
DEFV(Float,INIT(rayon_d_arrivee,RAYON_D_ARRIVEE));
DEFV(Float,INIT(derivee_du_rayon_d_arrivee,DERIVEE_DU_RAYON_D_ARRIVEE));
/* Definition du rayon 'R' du cercle a l'arrivee et de sa derivee. */
DEFV(Float,INIT(base_de_l_exponentielle,BASE_DE_L_EXPONENTIELLE));
/* Base de l'exponentielle. */
DEFV(Float,INIT(facteur_de_l_exposant,FACTEUR_DE_L_EXPOSANT));
/* Definition du facteur multiplicatif de l'exposant de l'exponentielle. */
DEFV(Float,INIT(angle_de_depart,ANGLE_DE_DEPART));
DEFV(Float,INIT(derivee_de_l_angle_de_depart,DERIVEE_DE_L_ANGLE_DE_DEPART));
/* Definition de l'angle 'theta' de depart et de sa derivee. */
DEFV(Float,INIT(angle_d_arrivee,ANGLE_D_ARRIVEE));
DEFV(Float,INIT(derivee_de_l_angle_d_arrivee,DERIVEE_DE_L_ANGLE_D_ARRIVEE));
/* Definition de l'angle 'theta' d'arrivee et de sa derivee. */
DEFV(Float,INIT(alpha,ALPHA));
DEFV(Float,INIT(beta_,BETA_));
DEFV(Float,INIT(gamma,GAMMA));
/* Definition des coefficients 'a', 'b' et 'c' de la forme 'LIN2(...)' a calculer... */
DEFV(Float,INIT(facteur_lineaire_de_l_angle,FACTEUR_LINEAIRE_DE_L_ANGLE));
/* Facteur 'delta' de l'angle courant. */
DEFV(Float,INIT(translation_absolue,TRANSLATION_ABSOLUE));
/* Translation absolue 'T'. */
DEFV(Float,INIT(rayon_courant,FLOT__UNDEF));
/* Definition du rayon 'R' courant... */
DEFV(Float,INIT(angle_courant,FLOT__UNDEF));
/* Definition de l'angle 'theta' courant... */
#include xci/valeurs.03.I"
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("cubique=",interpoler_par_des_splines_cubiques);
GET_ARGUMENT_N("lineaire=",interpoler_par_des_splines_cubiques);
GET_ARGUMENT_I("premiere=""p=""D=",premiere_image);
GET_ARGUMENT_I("derniere=""d=""A=",derniere_image);
GET_ARGUMENT_I("pas=",pas_des_images);
GET_ARGUMENT_F("rd=""rD=",rayon_de_depart);
GET_ARGUMENT_F("drd=""drD=",derivee_du_rayon_de_depart);
GET_ARGUMENT_F("ra=""rA=",rayon_d_arrivee);
GET_ARGUMENT_F("dra=""drA=",derivee_du_rayon_d_arrivee);
GET_ARGUMENT_F("base=",base_de_l_exponentielle);
GET_ARGUMENT_F("h=""Efacteur=",facteur_de_l_exposant);
/* Le 20050623153035, "facteur=" a ete remplace par "Efacteur=" (double definition...). */
GET_ARGUMENT_F("td=""tD=""ad=""aD=",angle_de_depart);
GET_ARGUMENT_F("dtd=""dtD=""dad=""daD=",derivee_de_l_angle_de_depart);
GET_ARGUMENT_F("ta=""tA=""aa=""aA=",angle_d_arrivee);
GET_ARGUMENT_F("dta=""dtA=""daa=""daA=",derivee_de_l_angle_d_arrivee);
GET_ARGUMENT_F("alpha=""a=",alpha);
GET_ARGUMENT_F("beta=""b=",beta_);
GET_ARGUMENT_F("gamma=""c=",gamma);
GET_ARGUMENT_F("delta=""Afacteur=",facteur_lineaire_de_l_angle);
/* Le 20050623153035, "facteur=" a ete remplace par "Afacteur=" (double definition...). */
GET_ARGUMENT_F("translation=""T=",translation_absolue);
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
/* Cette procedure fut introduite le 20061226190002... */
)
);
Test(IFLT(premiere_image,derniere_image))
/* ATTENTION : on ne peut ecrire : */
/* */
/* Test(IFLE(premiere_image,derniere_image)) */
/* */
/* ('v $xci/valeurs.02$I iTRANSFORMATION'). */
/* a cause de 'iINTERPOLATION_...(...)' qui calcule 'derniere_image-premiere_image'... */
Bblock
DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
Bblock
Test(IL_FAUT(interpoler_par_des_splines_cubiques))
Bblock
EGAL(rayon_courant
,iINTERPOLATION_CUBIQUE(rayon_de_depart,derivee_du_rayon_de_depart
,rayon_d_arrivee,derivee_du_rayon_d_arrivee
,numero_d_image
,premiere_image,derniere_image
)
);
/* Interpolation cubique du rayon 'R'. */
EGAL(angle_courant
,iINTERPOLATION_CUBIQUE(angle_de_depart,derivee_de_l_angle_de_depart
,angle_d_arrivee,derivee_de_l_angle_d_arrivee
,numero_d_image
,premiere_image,derniere_image
)
);
/* Interpolation cubique de l'angle 'theta'. */
Eblock
ATes
Bblock
EGAL(rayon_courant
,iINTERPOLATION_LINEAIRE(rayon_de_depart,derivee_du_rayon_de_depart
,rayon_d_arrivee,derivee_du_rayon_d_arrivee
,numero_d_image
,premiere_image,derniere_image
)
);
/* Interpolation lineaire du rayon 'R'. */
EGAL(angle_courant
,iINTERPOLATION_LINEAIRE(angle_de_depart,derivee_de_l_angle_de_depart
,angle_d_arrivee,derivee_de_l_angle_d_arrivee
,numero_d_image
,premiere_image,derniere_image
)
);
/* Interpolation lineaire de l'angle 'theta'. */
Eblock
ETes
/* Le 20190928104516, j'ai tente une transformation de 'angle_courant' de facon a sumuler */
/* 'equant' des epicycles de Ptolemee et ce de la facon suivante : */
/* */
/* Une droite D tourne autour d'un point {0,ordonnee_a_l_origine} de facon a ce que son */
/* point d'intersection "de droite" avec le cercle soit a une distance angulaire de l'axe */
/* des abscisses egale a 'angle_courant'. L'angle que fait D avec l'axe des abscisses */
/* devient alors la nouvelle valeur de 'angle_courant'. */
/* */
/* On a donc (ou 'tangente' est la pente) : */
/* */
/* y = tangente.x + ordonnee_a_l_origine (equation de la droite D) */
/* */
/* et au point d'intersection de D avec le cercle : */
/* */
/* 2 2 2 */
/* x + y = R */
/* */
/* en eliminant 'y', on obtient une equation du second degre en x. On identifie alors l'une */
/* des deux solutions avec : */
/* */
/* R.cosinus */
/* */
/* d'ou la valeur de 'cosinus' et donc la nouvelle valeur de 'angle_courant' via un */
/* 'ACOX(...)'... */
/* */
/* */
/* Test(IL_FAUT(faire_une_transformation_equant)) */
/* Bblock */
/* DEFV(Float,INIT(tangente,TANX(angle_courant))); */
/* DEFV(Float,INIT(cosinus,FLOT__UNDEF)); */
/* */
/* EGAL(cosinus */
/* ,DIVI(ADD2(NEGA(MUL2(tangente,transformation_equant__ordonnee_a_l_origine)) */
/* ,RACX(SOUS(MUL2(EXP2(rayon_courant),ADD2(FU,EXP2(tangente))) */
/* ,EXP2(transformation_equant__ordonnee_a_l_origine) */
/* ) */
/* ) */
/* ) */
/* ,MUL2(rayon_courant,ADD2(FU,EXP2(tangente))) */
/* ) */
/* ); */
/* EGAL(angle_courant,ACOX(cosinus)); */
/* Eblock */
/* ATes */
/* Bblock */
/* Eblock */
/* ETes */
/* */
/* */
/* Malheureusement, cela ne marche pas correctement car, en effet, l'angle obtenu reste */
/* dans [0,pi/2] et non pas dans [0,2.pi]... */
/* */
/* On notera le 20191002175915 qu'une solution a la fois simple et elegante a ete trouvee */
/* ('v $xiirk/.EPIC.21.2.$U')... */
CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition,"\n"))
,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales)
,MULTIPLE_DE(ENTIER_FLOTTANT(ADD2(MUL3(rayon_courant
,PUIX(base_de_l_exponentielle
,MUL2(facteur_de_l_exposant,angle_courant)
)
,LIN2(alpha,COSX(angle_courant)
,beta_,SINX(angle_courant)
,gamma
)
)
,AXPB(facteur_lineaire_de_l_angle,angle_courant,translation_absolue)
)
)
)
)
);
/* Et enfin, edition de la combinaison lineaire. */
/* */
/* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */
/* 'BUG_SYSTEME_SG_C_exp'... */
Eblock
EDoI
Eblock
ATes
Bblock
PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee");
Eblock
ETes
RETU_Commande;
Eblock
ECommande