/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C R O I X   F R A C T A L E  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande (inspiree du programme                                                                          */
/*                  'v $xrC/ObjetComplexe.41$c') genere les points                                                                   */
/*                  successifs d'une croix fractale.                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_CroixFractale$K' :                                                                                 */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20130625115053).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   COMPATIBILITE_20130627                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet d'assurer la compatibilite anterieure au 20130627084643 si besoin est...           */
#define   COMPATIBILITE_20130629                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet d'assurer la compatibilite anterieure au 20130629090210 si besoin est...           */

#define   EDITER_LES_COORDONNEES_DES_POINTS                                                                                             \
                    VRAI
#define   EDITER_LES_COORDONNEES_NORMALISEES_DES_POINTS                                                                                 \
                    VRAI
                                        /* Faut-il editer les coordonnees des points ('VRAI') ou pas ('FAUX') et doivent-elles       */
                                        /* normalisees ('VRAI') ou denormalisees ('FAUX') ?                                          */
#define   EDITER_LES_POINTS_SOUS_LA_FORME_DE_SEGMENTS_AB                                                                                \
                    VRAI                                                                                                                \
                                        /* Faut-il editer des segments 'AB' ('VRAI') ou des points isoles ('FAUX').                  */

#define   EXPLORER_L_AXE_DES_X                                                                                                          \
                    VRAI
#define   EXPLORER_L_AXE_DES_Y                                                                                                          \
                    VRAI
#define   EXPLORER_L_AXE_DES_Z                                                                                                          \
                    VRAI
                                        /* Choix des axes a explorer...                                                              */

#define   TRACER_PAR_DEMI_BRAS                                                                                                          \
                    FAUX                                                                                                                \
                                        /* Doit-on trace demi-bras par demi-bras ('VRAI') ou bien le bras entier ('FAUX'). Ceci      */ \
                                        /* a ete introduit le 20130629084934...                                                      */

#define   FACTEUR_D_ECHELLE                                                                                                             \
                    FDEUX                                                                                                               \
                                        /* Facteur d'echelle...                                                                      */

#define   PROFONDEUR                                                                                                                    \
                    QUATRE                                                                                                              \
                                        /* Profondeur de la generation...                                                            */

                                        /* On notera que l'on ne met pas ici :                                                       */
                                        /*                                                                                           */
                                        /*                  #include  xci/valeurs.01.I"                                              */
                                        /*                                                                                           */
                                        /* parce que l'on ne peut inclure '$xci/valeurs.02$I' ci-apres...                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* On notera que l'on ne peut pas mettre ici :                                               */
                                        /*                                                                                           */
                                        /*                  #include  xci/valeurs.02.I"                                              */
                                        /*                                                                                           */
                                        /* a cause du message :                                                                      */
                                        /*                                                                                           */
                                        /*                  error: initializer element is not constant                               */
                                        /*                                                                                           */
                                        /* provoque par la fonction 'Finitialisation_d_une_constante_chaine_de_caracteres(...)'.     */

#define   EDITION_DES_COORDONNEES(editer,format_coordonnees_normalisees,format_coordonnees_denormalisees)                               \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_les_coordonnees_des_points))                                                                    \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer))                                                                                          \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(editer_les_coordonnees_normalisees_des_points))                                              \
                                   Bblock                                                                                               \
                                   CAL2(Prin3(format_coordonnees_normalisees                                                            \
                                             ,ASD1(vecteurs_____cursor_3D,x)                                                            \
                                             ,ASD1(vecteurs_____cursor_3D,y)                                                            \
                                             ,ASD1(vecteurs_____cursor_3D,z)                                                            \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* On notera que l'on ne peut utiliser 'NOMBRE_DE_DECIMALES_EFFECTIF(...)' ou encore         */ \
                                        /* 'valeurs_signees' et 'format_d_edition' tels qu'il sont definis d'une part dans           */ \
                                        /* 'v $xci/valeurs.02$I' et d'autre part dans '$xci/valeurs.03$I' pour des problemes         */ \
                                        /* de references en avant...                                                                 */ \
                                        /*                                                                                           */ \
                                        /* Grace a ce format d'edition, on peut assurer les conversions :                            */ \
                                        /*                                                                                           */ \
                                        /*                  {X,Y} <--> CoordonneeCurviligne                                          */ \
                                        /*                                                                                           */ \
                                        /* si besoin est...                                                                          */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   CAL2(Prin3(format_coordonnees_denormalisees                                                          \
                                             ,_cDENORMALISE_OX(ASD1(vecteurs_____cursor_3D,x))                                          \
                                             ,_cDENORMALISE_OY(ASD1(vecteurs_____cursor_3D,y))                                          \
                                             ,_cDENORMALISE_OZ(ASD1(vecteurs_____cursor_3D,z))                                          \
                                              )                                                                                         \
                                        );                                                                                              \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              CAL2(Prin0("\n"));                                                                                        \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition des coordonnees.                                                                  */

#define   DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX                                                                                          \
                    Bblock                                                                                                              \
                    EDITION_DES_COORDONNEES(IL_FAUT(editer_les_points_sous_la_forme_de_segments_AB)                                     \
                                           ,"xA=%+.^^^ yA=%+.^^^ zA=%+.^^^"                                                             \
                                           ,"xA=%d yA=%d zA=%d"                                                                         \
                                            );                                                                                          \
                    Eblock
#define   FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX                                                                                          \
                    Bblock                                                                                                              \
                    EDITION_DES_COORDONNEES(TOUJOURS_VRAI                                                                               \
                                           ,"xB=%+.^^^ yB=%+.^^^ zB=%+.^^^"                                                             \
                                           ,"xB=%d yB=%d zB=%d"                                                                         \
                                            );                                                                                          \
                    Eblock

#define   TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe,deplacement_direct,deplacement_inverse)                                            \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(explorer_l_axe))                                                                                       \
                         Bblock                                                                                                         \
                         BLOC(deplacement_inverse);                                                                                     \
                                                                                                                                        \
                         GenerationDeLaCroixFractale(PRED(profondeur));                                                                 \
                                                                                                                                        \
                         DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX;                                                                          \
                                                                                                                                        \
                         BLOC(deplacement_direct);                                                                                      \
                                                                                                                                        \
                         Test(IL_FAUT(tracer_par_demi_bras))                                                                            \
                                        /* Possibilite introduite le 20130629084934 qui est tres utile, en particulier, si l'on      */ \
                                        /* utiliser des splines pour representer la croix ('v $xrv/particule.10$K cubique=').        */ \
                              Bblock                                                                                                    \
                              FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX;                                                                     \
                              DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX;                                                                     \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         BLOC(deplacement_direct);                                                                                      \
                                                                                                                                        \
                         FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX;                                                                          \
                                                                                                                                        \
                         GenerationDeLaCroixFractale(PRED(profondeur));                                                                 \
                                                                                                                                        \
                         BLOC(deplacement_inverse);                                                                                     \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock
                                        /* Trace de l'un des bras de la croix (introduit sous cette forme le 20130629083413).        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   R E C U R S I V E S   D E   G E N E R A T I O N                                                        */
/*        D ' U N E   C R O I X   F R A C T A L E  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* On notera que l'on ne met pas ici :                                                       */
                                        /*                                                                                           */
                                        /*                  #include  xci/valeurs.03.I"                                              */
                                        /*                                                                                           */
                                        /* parce que l'on ne peut inclure '$xci/valeurs.02$I' ci-avant...                            */
DEFV(Logical,INIT(compatibilite_20130629,COMPATIBILITE_20130629));
                                        /* Permet d'assurer la compatibilite anterieure au 20130629090210 si besoin est...           */


DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees_des_points,EDITER_LES_COORDONNEES_DES_POINTS)));
DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees_normalisees_des_points,EDITER_LES_COORDONNEES_NORMALISEES_DES_POINTS)));
                                        /* Faut-il editer les coordonnees des points ('VRAI') ou pas ('FAUX') et doivent-elles       */
                                        /* normalisees ('VRAI') ou denormalisees ('FAUX') ?                                          */
DEFV(Local,DEFV(Logical,INIT(editer_les_points_sous_la_forme_de_segments_AB,EDITER_LES_POINTS_SOUS_LA_FORME_DE_SEGMENTS_AB)));
                                        /* Faut-il editer des segments 'AB' ('VRAI') ou des points isoles ('FAUX').                  */

DEFV(Local,DEFV(Float,INIT(facteur_d_echelle,FACTEUR_D_ECHELLE)));
                                        /* Facteur d'echelle...                                                                      */

DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_X,EXPLORER_L_AXE_DES_X)));
DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_Y,EXPLORER_L_AXE_DES_Y)));
DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_Z,EXPLORER_L_AXE_DES_Z)));
                                        /* Choix des axes a explorer...                                                              */

DEFV(Local,DEFV(Logical,INIT(tracer_par_demi_bras,TRACER_PAR_DEMI_BRAS)));
                                        /* Doit-on trace demi-bras par demi-bras ('VRAI') ou bien le bras entier ('FAUX'). Ceci      */
                                        /* a ete introduit le 20130629084934...                                                      */

BFonctionIB

DEFV(LoF,DEFV(FonctionIB,GenerationDeLaCroixFractale(profondeur)))
DEFV(Argument,DEFV(Int,profondeur));
                                        /* Profondeur de la generation courante...                                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     CALS(FgMIC());
     CALS(FgMIK());

     EGAL(vecteurs_____scale_globale,DIVI(vecteurs_____scale_globale,facteur_d_echelle));

     Test(IZGT(profondeur))
          Bblock
          TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_X,BLOC(g1;),BLOC(g3;));
          TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Y,BLOC(g2;),BLOC(g4;));

          Test(IL_NE_FAUT_PAS(compatibilite_20130629))
                                        /* Test introduit le 20130629090210...                                                       */
               Bblock
               TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Z,BLOC(g5;),BLOC(g6;));
                                        /* L'ordre {g5,g6} est compatible avec les ordres {g1,g3} et {g2,g4}...                      */
               Eblock
          ATes
               Bblock
               TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Z,BLOC(g6;),BLOC(g5;));
               Eblock
          ETes

          Eblock
     ATes
          Bblock
          Eblock
     ETes

     CALS(FgMOK());
     CALS(FgMOC());

     RETU_ERROR;
     Eblock

EFonctionIB

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C R O I X   F R A C T A L E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(compatibilite_20130627,COMPATIBILITE_20130627));
                                        /* Permet d'assurer la compatibilite anterieure au 20130627084643 si besoin est...           */

     DEFV(Int,INIT(profondeur,PROFONDEUR));
                                        /* Profondeur de la generation...                                                            */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20130627=",compatibilite_20130627);
                                        /* Argument introduit le 20130627084643...                                                   */
                         GET_ARGUMENT_L("compatibilite_20130629=",compatibilite_20130629);
                                        /* Argument introduit le 20130629090210...                                                   */

                         GET_ARGUMENT_L("editer_coordonnees=""coordonnees=",editer_les_coordonnees_des_points);
                         GET_ARGUMENT_L("coordonnees_normalisees=""normalisees=""norm="
                                       ,editer_les_coordonnees_normalisees_des_points
                                        );
                         GET_ARGUMENT_N("coordonnees_denormalisees=""denormalisees=""denorm="
                                       ,editer_les_coordonnees_normalisees_des_points
                                        );
                         GET_ARGUMENT_L("segments_AB=""segments=""AB="
                                       ,editer_les_points_sous_la_forme_de_segments_AB
                                        );
                         GET_ARGUMENT_N("points_isoles=""points="
                                       ,editer_les_points_sous_la_forme_de_segments_AB
                                        );

                         GET_ARGUMENT_L("explorer_X=""eX=",explorer_l_axe_des_X);
                         GET_ARGUMENT_L("explorer_Y=""eY=",explorer_l_axe_des_Y);
                         GET_ARGUMENT_L("explorer_Z=""eZ=",explorer_l_axe_des_Z);

                         GET_ARGUMENT_L("tracer_demi_bras=""db=",tracer_par_demi_bras);
                         GET_ARGUMENT_N("trace_bras_entier=""be=",tracer_par_demi_bras);
                                        /* Arguments introduits le 20130629084934...                                                 */

                         GET_ARGUMENT_F("facteur=""echelle=",facteur_d_echelle);

                         GET_ARGUMENT_I("profondeur=""recursivite=",profondeur);
                         )
                    );

     SK(COORDONNEE_BARYCENTRIQUE_CENTRALE);

     SX(dimX);
     SY(dimY);
     SZ(dimZ);

     g1;
     g2;
     g5;
                                        /* Le 'g5' est necessaire si l'on veut que la croix soit au centre de l'espace...            */

     Test(IL_NE_FAUT_PAS(compatibilite_20130627))
                                        /* Test introduit le 20130627084643...                                                       */
          Bblock
          EGAL(vecteurs_____scale_globale,MUL2(vecteurs_____scale_globale,facteur_d_echelle));
                                        /* Afin de compenser le 'DIVI(...)' situe a l'entree de 'GenerationDeLaCroixFractale(...)'.  */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     CALS(GenerationDeLaCroixFractale(profondeur));

     RETU_Commande;
     Eblock
ECommande



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