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