/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D ' U N E C R O I X F R A C T A L E : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande (inspiree du programme */
/* 'v $xrC/ObjetComplexe.41$c') genere les points */
/* successifs d'une croix fractale. */
/* */
/* */
/* Author of '$xci/valeurs_CroixFractale$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20130625115053). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 COMPATIBILITE_20130627 \
FAUX \
/* Permet d'assurer la compatibilite anterieure au 20130627084643 si besoin est... */
#define COMPATIBILITE_20130629 \
FAUX \
/* Permet d'assurer la compatibilite anterieure au 20130629090210 si besoin est... */
#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'). */
#define EXPLORER_L_AXE_DES_X \
VRAI
#define EXPLORER_L_AXE_DES_Y \
VRAI
#define EXPLORER_L_AXE_DES_Z \
VRAI
/* Choix des axes a explorer... */
#define TRACER_PAR_DEMI_BRAS \
FAUX \
/* Doit-on trace demi-bras par demi-bras ('VRAI') ou bien le bras entier ('FAUX'). Ceci */ \
/* a ete introduit le 20130629084934... */
#define FACTEUR_D_ECHELLE \
FDEUX \
/* Facteur d'echelle... */
#define PROFONDEUR \
QUATRE \
/* Profondeur de la generation... */
/* 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_DES_COORDONNEES(editer,format_coordonnees_normalisees,format_coordonnees_denormalisees) \
Bblock \
Test(IL_FAUT(editer_les_coordonnees_des_points)) \
Bblock \
Test(IL_FAUT(editer)) \
Bblock \
Test(IL_FAUT(editer_les_coordonnees_normalisees_des_points)) \
Bblock \
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} <--> 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)) \
) \
); \
Eblock \
ETes \
\
CAL2(Prin0("\n")); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition des coordonnees. */
#define DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX \
Bblock \
EDITION_DES_COORDONNEES(IL_FAUT(editer_les_points_sous_la_forme_de_segments_AB) \
,"xA=%+.^^^ yA=%+.^^^ zA=%+.^^^" \
,"xA=%d yA=%d zA=%d" \
); \
Eblock
#define FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX \
Bblock \
EDITION_DES_COORDONNEES(TOUJOURS_VRAI \
,"xB=%+.^^^ yB=%+.^^^ zB=%+.^^^" \
,"xB=%d yB=%d zB=%d" \
); \
Eblock
#define TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe,deplacement_direct,deplacement_inverse) \
Bblock \
Test(IL_FAUT(explorer_l_axe)) \
Bblock \
BLOC(deplacement_inverse); \
\
GenerationDeLaCroixFractale(PRED(profondeur)); \
\
DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX; \
\
BLOC(deplacement_direct); \
\
Test(IL_FAUT(tracer_par_demi_bras)) \
/* Possibilite introduite le 20130629084934 qui est tres utile, en particulier, si l'on */ \
/* utiliser des splines pour representer la croix ('v $xrv/particule.10$K cubique='). */ \
Bblock \
FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX; \
DEBUT_DU_TRACE_D_UN_BRAS_DE_LA_CROIX; \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
BLOC(deplacement_direct); \
\
FIN___DU_TRACE_D_UN_BRAS_DE_LA_CROIX; \
\
GenerationDeLaCroixFractale(PRED(profondeur)); \
\
BLOC(deplacement_inverse); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
/* Trace de l'un des bras de la croix (introduit sous cette forme le 20130629083413). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 ' U N E C R O I X F R A C T A 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(Logical,INIT(compatibilite_20130629,COMPATIBILITE_20130629));
/* Permet d'assurer la compatibilite anterieure au 20130629090210 si besoin est... */
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'). */
DEFV(Local,DEFV(Float,INIT(facteur_d_echelle,FACTEUR_D_ECHELLE)));
/* Facteur d'echelle... */
DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_X,EXPLORER_L_AXE_DES_X)));
DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_Y,EXPLORER_L_AXE_DES_Y)));
DEFV(Local,DEFV(Logical,INIT(explorer_l_axe_des_Z,EXPLORER_L_AXE_DES_Z)));
/* Choix des axes a explorer... */
DEFV(Local,DEFV(Logical,INIT(tracer_par_demi_bras,TRACER_PAR_DEMI_BRAS)));
/* Doit-on trace demi-bras par demi-bras ('VRAI') ou bien le bras entier ('FAUX'). Ceci */
/* a ete introduit le 20130629084934... */
BFonctionIB
DEFV(LoF,DEFV(FonctionIB,GenerationDeLaCroixFractale(profondeur)))
DEFV(Argument,DEFV(Int,profondeur));
/* Profondeur de la generation courante... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
CALS(FgMIC());
CALS(FgMIK());
EGAL(vecteurs_____scale_globale,DIVI(vecteurs_____scale_globale,facteur_d_echelle));
Test(IZGT(profondeur))
Bblock
TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_X,BLOC(g1;),BLOC(g3;));
TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Y,BLOC(g2;),BLOC(g4;));
Test(IL_NE_FAUT_PAS(compatibilite_20130629))
/* Test introduit le 20130629090210... */
Bblock
TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Z,BLOC(g5;),BLOC(g6;));
/* L'ordre {g5,g6} est compatible avec les ordres {g1,g3} et {g2,g4}... */
Eblock
ATes
Bblock
TRACE_D_UN_BRAS_DE_LA_CROIX(explorer_l_axe_des_Z,BLOC(g6;),BLOC(g5;));
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
CALS(FgMOK());
CALS(FgMOC());
RETU_ERROR;
Eblock
EFonctionIB
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D ' U N E C R O I X F R A C T A L E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(compatibilite_20130627,COMPATIBILITE_20130627));
/* Permet d'assurer la compatibilite anterieure au 20130627084643 si besoin est... */
DEFV(Int,INIT(profondeur,PROFONDEUR));
/* Profondeur de la generation... */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("compatibilite_20130627=",compatibilite_20130627);
/* Argument introduit le 20130627084643... */
GET_ARGUMENT_L("compatibilite_20130629=",compatibilite_20130629);
/* Argument introduit le 20130629090210... */
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
);
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
);
GET_ARGUMENT_L("explorer_X=""eX=",explorer_l_axe_des_X);
GET_ARGUMENT_L("explorer_Y=""eY=",explorer_l_axe_des_Y);
GET_ARGUMENT_L("explorer_Z=""eZ=",explorer_l_axe_des_Z);
GET_ARGUMENT_L("tracer_demi_bras=""db=",tracer_par_demi_bras);
GET_ARGUMENT_N("trace_bras_entier=""be=",tracer_par_demi_bras);
/* Arguments introduits le 20130629084934... */
GET_ARGUMENT_F("facteur=""echelle=",facteur_d_echelle);
GET_ARGUMENT_I("profondeur=""recursivite=",profondeur);
)
);
SK(COORDONNEE_BARYCENTRIQUE_CENTRALE);
SX(dimX);
SY(dimY);
SZ(dimZ);
g1;
g2;
g5;
/* Le 'g5' est necessaire si l'on veut que la croix soit au centre de l'espace... */
Test(IL_NE_FAUT_PAS(compatibilite_20130627))
/* Test introduit le 20130627084643... */
Bblock
EGAL(vecteurs_____scale_globale,MUL2(vecteurs_____scale_globale,facteur_d_echelle));
/* Afin de compenser le 'DIVI(...)' situe a l'entree de 'GenerationDeLaCroixFractale(...)'. */
Eblock
ATes
Bblock
Eblock
ETes
CALS(GenerationDeLaCroixFractale(profondeur));
RETU_Commande;
Eblock
ECommande