/*************************************************************************************************************************************/ /* */ /* 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