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



Copyright © Jean-François COLONNA, 2019-2025.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2025.