/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   T R I D I M E N S I O N N E L L E  :                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande (inspiree du programme                                                                          */
/*                  'v $xci/valeurs_Hilbert2D$K') genere les points                                                                  */
/*                  successifs d'une approximation de la courbe                                                                      */
/*                  de Hilbert tridimensionnelle.                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_Hilbert3D$K' :                                                                                     */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20120416141547).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   EDITER_LA_DEFINITION_DU_CUBE                                                                                                  \
                    FAUX
#define   EDITER_LA_DEFINITION_DES_SOUS_CUBES                                                                                           \
                    FAUX
                                        /* Faut-il editer la definition du cube ('VRAI') ou pas ('FAUX'). Ceci fut introduit         */
                                        /* le 20220315173043... L'edition de la definition des 8 sous-cubes a ete introduite         */
                                        /* le 20220519182608...                                                                      */

#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 20120502113413...                                                            */

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

#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_CUBE(editer,sommetX,sommetY,sommetZ)                                                              \
                                        /* Le parametre 'editer' est destine a ne pas editer les aretes parcourues plus d'une fois   */ \
                                        /* lors des deplacements de changement de plan. Il est malheureusement impossible de         */ \
                                        /* parcourir toutes les aretes du cube sans repasser deux fois sur certaines...              */ \
                    Bblock                                                                                                              \
                    SET_CURSOR(sommetX,sommetY,sommetZ);                                                                                \
                                                                                                                                        \
                    EDITION_DES_COORDONNEES(editer                                                                                      \
                                           ,"xB=%+.^^^ yB=%+.^^^ zB=%+.^^^"                                                             \
                                           ,"xB=%d yB=%d zB=%d"                                                                         \
                                           ," DefinitionCube=%d"                                                                        \
                                            );                                                                                          \
                    Eblock                                                                                                              \
                                        /* Edition de la definition du cube, en notant que la coordonnee curviligne est nulle (ce    */ \
                                        /* qui n'a aucune importance). Ceci fut introduit le 20220315173043...                       */

#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 20120502113413...                                                       */ \
                              Test(IL_FAUT(editer_les_coordonnees_normalisees_des_points))                                              \
                                   Bblock                                                                                               \
                                        /* Test introduit le 20120417091031...                                                       */ \
                                   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,Z} <--> 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))                                          \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* Possibilite introduite le 20120417091031...                                               */ \
                                   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 20120417091031).                         */

#define   REGLE_PLUS_X_                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("<");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_X(NEGA(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "<" (rotation de +pi/2 autour de l'axe 'OX').                                       */
#define   REGLE_MOINS_X                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE(">");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_X(NEUT(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle ">" (rotation de -pi/2 autour de l'axe 'OX').                                       */

#define   REGLE_PLUS_Y_                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("^");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Y(NEGA(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "^" (rotation de +pi/2 autour de l'axe 'OY').                                       */
#define   REGLE_MOINS_Y                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("&");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Y(NEUT(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "&" (rotation de -pi/2 autour de l'axe 'OY').                                       */

#define   REGLE_PLUS_Z_                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("+");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Z(NEUT(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "+" (rotation de +pi/2 autour de l'axe 'OZ').                                       */
#define   REGLE_MOINS_Z                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("-");                                                                                           \
                                                                                                                                        \
                    T_ROTATION_Z(NEGA(angle_de_rotation));                                                                              \
                    Eblock                                                                                                              \
                                        /* Regle "-" (rotation de -pi/2 autour de l'axe 'OZ').                                       */

#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=%+.^^^ zA=%+.^^^"                                                             \
                                           ,"xA=%d yA=%d zA=%d"                                                                         \
                                           ," CoordonneeCurviligneA=%d"                                                                 \
                                            );                                                                                          \
                                                                                                                                        \
                    g1;                                                                                                                 \
                                        /* Je note le 20220315105421 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=%+.^^^ zB=%+.^^^"                                                             \
                                           ,"xB=%d yB=%d zB=%d"                                                                         \
                                           ," CoordonneeCurviligneB=%d"                                                                 \
                                            );                                                                                          \
                    Eblock                                                                                                              \
                                        /* Regle "F" (deplacement en avant).                                                         */

#define   REGLE_X______                                                                                                                 \
                    Bblock                                                                                                              \
                    EDITION_D_UNE_REGLE("A");                                                                                           \
                                                                                                                                        \
                    CALS(GenerationDeLaCourbeDeHilbert_X(PRED(profondeur)));                                                            \
                    Eblock                                                                                                              \
                                        /* Regle "X".                                                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   T R 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 20120502113413...                                                            */

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_X(profondeur)))
DEFV(Argument,DEFV(Int,profondeur));
                                        /* Profondeur de la generation courante...                                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IZGT(profondeur))
          Bblock
          REGLE_PLUS_Y_;
          REGLE_PLUS_X_;
          REGLE_X______;
          REGLE_FORWARD;
          REGLE_PLUS_Y_;
          REGLE_PLUS_X_;
          REGLE_X______;
          REGLE_FORWARD;
          REGLE_X______;
          REGLE_MOINS_Z;
          REGLE_FORWARD;
          REGLE_PLUS_Y_;
          REGLE_MOINS_X;
          REGLE_MOINS_X;
          REGLE_X______;
          REGLE_FORWARD;
          REGLE_X______;
          REGLE_MOINS_Y;
          REGLE_FORWARD;
          REGLE_PLUS_Z_;
          REGLE_MOINS_X;
          REGLE_MOINS_X;
          REGLE_X______;
          REGLE_FORWARD;
          REGLE_X______;
          REGLE_MOINS_Z;
          REGLE_FORWARD;
          REGLE_MOINS_X;
          REGLE_X______;
          REGLE_MOINS_Z;
          REGLE_MOINS_X;
                                        /* Reecriture :                                                                              */
                                        /*                                                                                           */
                                        /*                  X --> ^<XF^<XFX-F^>>XFX&F+>>XFX-F>X->                                    */
                                        /*                                                                                           */
          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   T R 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_cube,EDITER_LA_DEFINITION_DU_CUBE));
     DEFV(Logical,INIT(editer_la_definition_des_sous_cubes,EDITER_LA_DEFINITION_DES_SOUS_CUBES));
                                        /* Faut-il editer la definition du cube ('VRAI') ou pas ('FAUX'). Ceci fut introduit         */
                                        /* le 20220315173043... L'edition de la definition des 8 sous-cubes a ete introduite         */
                                        /* le 20220519182608...                                                                      */

     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_cube=""dc=",editer_la_definition_du_cube);
                                        /* Argument introduit le 20220315173043...                                                   */
                         GET_ARGUMENT_L("definition_sous_cubes=""dsc=",editer_la_definition_des_sous_cubes);
                                        /* Argument introduit le 20220519182608...                                                   */

                         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 20120417091031...                                                 */
                         GET_ARGUMENT_N("points_isoles=""points="
                                       ,editer_les_points_sous_la_forme_de_segments_AB
                                        );
                                        /* Arguments introduits le 20120502113413...                                                 */

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

                         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_cube))
                                        /* Possibilite introduite le 20220315173043...                                               */
          Bblock
          Test(IL_FAUT(editer_les_points_sous_la_forme_de_segments_AB))
               Bblock
#include  xci/valeurs_Hilbert3D.I"
                                        /* Mis sous cette forme le 20220322181039...                                                 */
               Eblock
          ATes
               Bblock
               PRINT_ATTENTION("lors de l'edition de points isoles, la definition du cube 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_X______;

     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.