/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E   L A   C O U R B E   D E   H I L B E R T   B I D I M E N S I O N N E L L E  :                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande (inspiree du programme                                                                          */
/*                  'v $xtc/CHilbert_2D.11$c') genere les points                                                                     */
/*                  successifs d'une approximation de la courbe                                                                      */
/*                  de Hilbert bidimensionnelle.                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_Hilbert2D$K' :                                                                                     */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20120416113706).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CB_____OPTIONS__SYSTEME_APC_LinuxRedHat_GCC          "-Wno-implicit-function-declaration"
@define   PRAGMA_CB_____OPTIONS__SYSTEME_APC_LinuxUlmint_GCC          "-Wno-implicit-function-declaration"
@define   PRAGMA_CB_____OPTIONS__SYSTEME_APC_LinuxUbuntu_GCC          "-Wno-implicit-function-declaration"
                                        /* Introduit le 20170127094911 pour la fonction 'GenerationDeLaCourbeDeHilbert_L(...)'.      */
                                        /*                                                                                           */
                                        /* Pour la meme raison, 'SYSTEME_APC_LinuxUbuntu_GCC' fut introduit le 20210907104522...     */
                                        /*                                                                                           */
                                        /* Pour la meme raison, 'SYSTEME_APC_LinuxRedHat_GCC' fut introduit le 20220511173238...     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   EDITER_LA_DEFINITION_DU_CARRE                                                                                                 \
                    FAUX
#define   EDITER_LA_DEFINITION_DES_SOUS_CARRES                                                                                          \
                    FAUX
                                        /* Faut-il editer la definition du carre ('VRAI') ou pas ('FAUX'). Ceci fut introduit        */ \
                                        /* le 20220315164556... L'edition de la definition des 4 sous-carres a ete introduite        */
                                        /* le 20220519183528...                                                                      */

#define   EDITER_LES_REGLES_UTILISEES                                                                                                   \
                    FAUX                                                                                                                \
                                        /* Faut-il editer les regles utilisees ('VRAI') ou pas ('FAUX') ?                            */
#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'). Ceci fut         */ \
                                        /* introduit le 20120502113419...                                                            */

#define   ANGLE_DE_ROTATION                                                                                                             \
                    PI_SUR_2                                                                                                            \
                                        /* Angle systematique de rotation (introduit le 20120417090654).                             */

#define   PROFONDEUR                                                                                                                    \
                    QUATRE                                                                                                              \
                                        /* Profondeur de la generation...                                                            */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20151215164034 qu'une profondeur inferieure ou egale a 1 ne genere rien...   */

                                        /* 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_DE_LA_DEFINITION_DU_CARRE(sommetX,sommetY)                                                                            \
                    Bblock                                                                                                              \
                    SET_CURSOR(sommetX,sommetY,FZERO);                                                                                  \
                                                                                                                                        \
                    EDITION_DES_COORDONNEES(TOUJOURS_VRAI                                                                               \
                                           ,"xB=%+.^^^ yB=%+.^^^"                                                                       \
                                           ,"xB=%d yB=%d"                                                                               \
                                           ," DefinitionCarre=%d"                                                                       \
                                            );                                                                                          \
                    Eblock                                                                                                              \
                                        /* Edition de la definition du carre, en notant que la coordonnee curviligne est nulle (ce   */ \
                                        /* qui n'a aucune importance). Ceci fut introduit le 20220315164556...                       */

#define   EDITION_D_UNE_REGLE(regle)                                                                                                    \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_les_regles_utilisees))                                                                          \
                         Bblock                                                                                                         \
                         CAL2(Prin1("%s",regle));                                                                                       \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition d'une regle...                                                                    */

#define   EDITION_DES_COORDONNEES(editer,format_coordonnees_normalisees,format_coordonnees_denormalisees,format_coordonnee_curviligne)  \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_les_coordonnees_des_points))                                                                    \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer))                                                                                          \
                              Bblock                                                                                                    \
                                        /* Test introduit le 20120502113419...                                                       */ \
                              Test(IL_FAUT(editer_les_coordonnees_normalisees_des_points))                                              \
                                        /* Test introduit le 20120417091027...                                                       */ \
                                   Bblock                                                                                               \
                                   CAL2(Prin2(format_coordonnees_normalisees                                                            \
                                             ,ASD1(vecteurs_____cursor_3D,x)                                                            \
                                             ,ASD1(vecteurs_____cursor_3D,y)                                                            \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* 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(Prin2(format_coordonnees_denormalisees                                                          \
                                             ,_cDENORMALISE_OX(ASD1(vecteurs_____cursor_3D,x))                                          \
                                             ,_cDENORMALISE_OY(ASD1(vecteurs_____cursor_3D,y))                                          \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* Possibilite introduite le 20120417091027...                                               */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              CAL2(Prin1(format_coordonnee_curviligne                                                                   \
                                        ,coordonnee_curviligne_sur_la_courbe_de_Hilbert                                                 \
                                         )                                                                                              \
                                   );                                                                                                   \
                              CAL2(Prin0("\n"));                                                                                        \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition des coordonnees (procedure introduite le 20120417091027).                         */

#define   REGLE_PLUS___                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("+");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Z(NEUT(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "+" (rotation de +pi/2).                                                            */
#define   REGLE_MOINS__                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("-");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Z(NEGA(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "-" (rotation de -pi/2).                                                            */

#define   REGLE_FORWARD                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("F");                                                                                           \
                                                                                                                                        \
                    EDITION_DES_COORDONNEES(IFOU(IL_FAUT(editer_les_points_sous_la_forme_de_segments_AB)                                \
                                                ,IFET(IL_NE_FAUT_PAS(editer_les_points_sous_la_forme_de_segments_AB)                    \
                                                     ,IZEQ(coordonnee_curviligne_sur_la_courbe_de_Hilbert)                              \
                                                      )                                                                                 \
                                                 )                                                                                      \
                                           ,"xA=%+.^^^ yA=%+.^^^"                                                                       \
                                           ,"xA=%d yA=%d"                                                                               \
                                           ," CoordonneeCurviligneA=%d"                                                                 \
                                            );                                                                                          \
                                                                                                                                        \
                    g1;                                                                                                                 \
                                        /* Je note le 20220315105144 que c'est ici la seule commande de deplacement du curseur       */ \
                                        /* et donc de trace (virtuel...).                                                            */ \
                                                                                                                                        \
                    INCR(coordonnee_curviligne_sur_la_courbe_de_Hilbert,I);                                                             \
                                                                                                                                        \
                    EDITION_DES_COORDONNEES(TOUJOURS_VRAI                                                                               \
                                           ,"xB=%+.^^^ yB=%+.^^^"                                                                       \
                                           ,"xB=%d yB=%d"                                                                               \
                                           ," CoordonneeCurviligneB=%d"                                                                 \
                                            );                                                                                          \
                    Eblock                                                                                                              \
                                        /* Regle "F" (deplacement en avant).                                                         */

#define   REGLE_RIGHT__                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("R");                                                                                           \
                                                                                                                                        \
                    CALS(GenerationDeLaCourbeDeHilbert_R(PRED(profondeur)));                                                            \
                    Eblock                                                                                                              \
                                        /* Regle "R" (deplacement a droite -"Right"-).                                               */
#define   REGLE_LEFT___                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("L");                                                                                           \
                                                                                                                                        \
                    CALS(GenerationDeLaCourbeDeHilbert_L(PRED(profondeur)));                                                            \
                    Eblock                                                                                                              \
                                        /* Regle "L" (deplacement a gauche -"Left"-).                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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 E   L A   C O U R B E   D E   H I L B E R T   B I D I M E N S I O N N E L 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(Local,DEFV(Logical,INIT(editer_les_regles_utilisees,EDITER_LES_REGLES_UTILISEES)));
                                        /* Faut-il editer les regles utilisees ('VRAI') ou pas ('FAUX') ?                            */
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'). Ceci fut         */
                                        /* introduit le 20120502113419...                                                            */

DEFV(Local,DEFV(Float,INIT(angle_de_rotation,ANGLE_DE_ROTATION)));
                                        /* Angle systematique de rotation.                                                           */

DEFV(Local,DEFV(Int,INIT(coordonnee_curviligne_sur_la_courbe_de_Hilbert,ZERO)));
                                        /* Coordonnee curviligne du point courant sur la courbe de Hilbert.                          */

BFonctionIB

DEFV(LoF,DEFV(FonctionIB,GenerationDeLaCourbeDeHilbert_R(profondeur)))
                                        /* Le type 'FonctionIB' est mis par "symetrie" avec 'GenerationDeLaCourbeDeHilbert_L(...)'.  */
DEFV(Argument,DEFV(Int,profondeur));
                                        /* Profondeur de la generation courante...                                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IZGT(profondeur))
          Bblock
          REGLE_MOINS__;
          REGLE_LEFT___;
          REGLE_FORWARD;
          REGLE_PLUS___;
          REGLE_RIGHT__;
          REGLE_FORWARD;
          REGLE_RIGHT__;
          REGLE_PLUS___;
          REGLE_FORWARD;
          REGLE_LEFT___;
          REGLE_MOINS__;
                                        /* Reecriture :                                                                              */
                                        /*                                                                                           */
                                        /*                  R --> -LF+RFR+FL-                                                        */
                                        /*                                                                                           */
                                        /* qui est le "complement" de :                                                              */
                                        /*                                                                                           */
                                        /*                  L --> +RF-LFL-FR+                                                        */
                                        /*                                                                                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionIB

BFonctionIB

DEFV(LoF,DEFV(FonctionIB,GenerationDeLaCourbeDeHilbert_L(profondeur)))
                                        /* Le type 'FonctionIB' est rendu necessaire par les references en avant dont elle est       */
                                        /* l'objet dans 'GenerationDeLaCourbeDeHilbert_R(...)'...                                    */
DEFV(Argument,DEFV(Int,profondeur));
                                        /* Profondeur de la generation courante...                                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IZGT(profondeur))
          Bblock
          REGLE_PLUS___;
          REGLE_RIGHT__;
          REGLE_FORWARD;
          REGLE_MOINS__;
          REGLE_LEFT___;
          REGLE_FORWARD;
          REGLE_LEFT___;
          REGLE_MOINS__;
          REGLE_FORWARD;
          REGLE_RIGHT__;
          REGLE_PLUS___;
                                        /* Reecriture :                                                                              */
                                        /*                                                                                           */
                                        /*                  L --> +RF-LFL-FR+                                                        */
                                        /*                                                                                           */
                                        /* qui est le "complement" de :                                                              */
                                        /*                                                                                           */
                                        /*                  R --> -LF+RFR+FL-                                                        */
                                        /*                                                                                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionIB

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E   L A   C O U R B E   D E   H I L B E R T   B I D I M E N S I O N N E L L E  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(editer_la_definition_du_carre,EDITER_LA_DEFINITION_DU_CARRE));
     DEFV(Logical,INIT(editer_la_definition_des_sous_carres,EDITER_LA_DEFINITION_DES_SOUS_CARRES));
                                        /* Faut-il editer la definition du carre ('VRAI') ou pas ('FAUX'). Ceci fut introduit        */
                                        /* le 20220315164556... L'edition de la definition des 4 sous-carres a ete introduite        */
                                        /* le 20220519183528...                                                                      */

     DEFV(Int,INIT(profondeur,PROFONDEUR));
                                        /* Profondeur de la generation...                                                            */
                                        /*                                                                                           */
                                        /* On notera le 20151215164034 qu'une profondeur inferieure ou egale a 1 ne genere rien...   */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("definition_carre=""dc=",editer_la_definition_du_carre);
                                        /* Argument introduit le 20220315164556...                                                   */
                         GET_ARGUMENT_L("definition_sous_carres=""dsc=",editer_la_definition_des_sous_carres);
                                        /* Argument introduit le 20220519183528...                                                   */

                         GET_ARGUMENT_L("editer_regles=""regles=",editer_les_regles_utilisees);
                         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
                                        );
                                        /* Arguments introduits le 20120417091027...                                                 */
                         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
                                        );
                                        /* Arguments introduits le 20120502113419...                                                 */

                         GET_ARGUMENT_F("angle=",angle_de_rotation);
                                        /* Argument introduit le 20120417090654...                                                   */

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

     Test(IFET(IL_FAUT(editer_les_regles_utilisees),IL_FAUT(editer_les_coordonnees_des_points)))
          Bblock
          PRINT_ATTENTION("il n'est pas conseille d'editer simultanement les regles et les coordonnees des points");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(editer_la_definition_du_carre))
                                        /* Possibilite introduite le 20220315164556...                                               */
          Bblock
          Test(IL_FAUT(editer_les_points_sous_la_forme_de_segments_AB))
               Bblock
#include  xci/valeurs_Hilbert2D.I"
                                        /* Mis sous cette forme le 20220322181035...                                                 */
               Eblock
          ATes
               Bblock
               PRINT_ATTENTION("lors de l'edition de points isoles, la definition du carre ne peut etre editee");
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     SK(DIVI(COORDONNEE_BARYCENTRIQUE_CENTRALE,PUIX(DEUX,SOUS(profondeur,DEUX))));
     SX(dimX);
     SY(dimY);
     SZ(dimZ);

     SET_CURSOR(MOIT(vecteurs_____scale_globale),MOIT(vecteurs_____scale_globale),FZERO);

     REGLE_LEFT___;

     EDITION_D_UNE_REGLE("\n");

     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.