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