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