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