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