/*************************************************************************************************************************************/ /* */ /* C O N S T R U C T I O N D E L ' E P O N G E D E M E N G E R */ /* ( E T D U T A P I S D E S I E R P I N S K I ) : */ /* */ /* */ /* Author of '$xrf/EpongeDeMenger.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20140909125510). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 #include image_image_DI_ALBUM_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" /* ATTENTION, on definit ainsi le symbole 'DERNIERE_IMAGE' qui ne sert a rien ici, puisque */ /* c'est en effet 'Zmax' qui joue ce role... */ #define TRACER_LES_DIFFERENTES_OPERATIONS \ FAUX \ /* Faut-il tracer les differentes operations ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit */ \ /* le 20240618150759 afin de mieux comprendre comment tout cela fonctionne reellement... */ #define PARCOURS_OPTIMISE_DE_LA_HIERARCHIE_DES_CUBES \ VRAI \ /* A cause de l'anomalie 'v $xrf/EpongeDeMenger.01$I 20171231142417', cette option fut */ \ /* introduite le 20180101085659 au cas ou la methode 'FAUX' aurait des consequences sur */ \ /* les calculs. Cela permettrait donc de regenerer des images faites entre le 20171215150111 */ \ /* et le 20171231142417... */ \ /* */ \ /* Des tests faits apres l'introduction de cette option semblent montrer, comme je m'y */ \ /* attendais, que les resultats sont les memes qu'il y ait ou pas optimisation... */ \ /* Ainsi, aux environs du 20180102094205 sur '$LACT1A', l'image 'v $xiirf/MENG.O1.4.21' */ \ /* a ete recalculee. Les durees (via 'Dhms') ont ete respectivement de 00:00:18 et de */ \ /* 00:00:02 SANS et AVEC optimisation respectivement. Les deux images ainsi recalculees */ \ /* etaient strictement identiques... */ #define EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION \ FAUX #define EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION__VERSION_SIMPLIFIEE \ VRAI #define EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION__VERSION_SIMPLIFIEE_AVEC_PARENTHESAGE \ FAUX /* Introduit le 20240917115931 afin de pouvoir editer les choix de subdivision/suppression */ /* dans tous les cas... */ /* */ /* Je note le 20240918100540 que le fichier generable par cette edition peut etre reinjecte */ /* sous la forme "LISTE_VALEURS_ALEATOIRES_PRE_CALCULEES=" ce qui redonne la meme structure. */ /* */ /* La version simplifiee a ete introduite le 20240918170538... */ /* */ /* La version simplifiee et parenthesee a ete introduite le 20240921112252... */ #define UTILISER_UN_GENERATEUR_ALEATOIRE_PRE_CALCULE \ FAUX #define EDITER_LES_NOMBRES_ALEATOIRES \ FAUX #define EDITER_LE_NOMBRE_DE_TIRAGES_ALEATOIRES \ FAUX #define UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL \ VRAI #define UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE \ FAUX #define GRAINE \ PARE(1789) #define A_SEUIL_D_INDECISION_ENTRE_FAUX_ET_VRAI \ FZERO #define B_SEUIL_D_INDECISION_ENTRE_FAUX_ET_VRAI \ FDU /* Definition du generateur aleatoire introduit le 20180107174041... */ /* */ /* On notera le 20180108111352 que plus le seuil est petit (par exemple "seuil=0.2"), plus */ /* il y a de matiere (et donc moins il y a de trous...). */ /* */ /* Le 20240617131239 a ete introduite la possibilite d'un generateur "pre-calcule"... */ /* */ /* Le 20240619093425 a ete introduite la possibilite d'editer le nombre de tirages */ /* aleatoires effectues... */ /* */ /* Le 20240706095828 a ete introduite la possibilite d'editer les nombres aleatoires */ /* calcules ou recuperes dans un fichier... */ /* */ /* Le 20240926150024, le seuil d'indecision est devenu un polynome du premier degre */ /* fonction de 'profondeur_courante' renormalisee (P) : */ /* */ /* 1 0 */ /* seuil = A.P + B.P P E [0,1] */ /* */ /* tel que par defaut (A>=0) au debut du processus (les grands cubes), le seuil est faible */ /* et donc on elimine peu de cubes. Alors qu'a la fin (les petits cubes), le seuil est */ /* eleve et on elimine donc plus de cubes. En choisissant 'A' negatif, ce fonctionnement */ /* est inverse... */ /* */ /* On notera le 20240927100709 que : */ /* */ /* A=0 (valeur par defaut) */ /* B<0 (par exemple -0.1) */ /* */ /* provoque l'absence de toute subdivision... */ /* */ /* Le 20240927111114, en utilisant par exemple : */ /* */ /* A=-1.001 */ /* B=+1.000 */ /* */ /* tous les gros cubes seront conserves et les petits cubes tres subdivises. On notera */ /* les valeurs suivantes : */ /* */ /* pc ni P=pc/ni seuil nombre d'occurences */ /* */ /* 5 5 1.000000 -0.001000 27 */ /* 4 5 0.800000 +0.199200 729 */ /* 3 5 0.600000 +0.399400 15714 */ /* 2 5 0.400000 +0.599600 251046 */ /* 1 5 0.200000 +0.799800 2693628 */ /* */ /* 'pc' et 'ni' designant respectivement 'profondeur_courante' et 'nombre_d_iterations'. */ #define INVERSER_LES_CONVENTIONS \ FAUX \ /* Faut-il inverser les conventions ('VRAI') c'est-a-dire permuter 'F' et 'T' ou pas */ \ /* ('FAUX') ? c'est-a-dire conserver 'F' et 'T'. Ceci fut introduit le 20240615073518, */ \ /* la valeur par defaut garantissant la compatibilite anterieure... */ #define LISTE_DES_CUBES_A_SUBDIVISER \ "TTT TFT TTT TFT FFF TFT TTT TFT TTT" \ /* Liste des cubes a subdiviser qui correspond a l'Eponge de Menger standard. Cette liste */ \ /* correspond aux sections suivantes (avec un rapport d'homothetie egal a 3) : */ \ /* */ \ /* Z=0 Z=1 Z=2 */ \ /* */ \ /* Y=2 *** *-* *** */ \ /* Y=1 *-* --- *-* */ \ /* Y=0 *** *-* *** */ \ /* */ \ /* <--- X=0 X=1 X=2 ---> */ \ /* */ \ /* ou "*" indique un cube subdivisible (introduit le 20171216070955). */ \ /* */ \ /* Avec les notations a utiliser dans 'GET_ARGUMENT_C("liste_cubes="...', on a donc : */ \ /* */ \ /* Eponge de Menger */ \ /* _____________________ */ \ /* / \ */ \ /* */ \ /* TTT TFT TTT */ \ /* TFT FFF TFT */ \ /* TTT TFT TTT */ \ /* */ \ /* \_/ */ \ /* */ \ /* Tapis de Sierpinski */ \ /* */ \ /* soit donc la chaine : */ \ /* */ \ /* Eponge de Menger */ \ /* _________________________________________ */ \ /* / \ */ \ /* TTT TFT TTT TFT FFF TFT TTT TFT TTT */ \ /* \_________/ */ \ /* */ \ /* Tapis de Sierpinski */ \ /* */ \ /* ou encore apres elimination des espaces : */ \ /* */ \ /* Eponge de Menger */ \ /* _________________________ */ \ /* / \ */ \ /* TTTTFTTTTTFTFFFTFTTTTTFTTTT */ \ /* \_______/ */ \ /* */ \ /* Tapis de Sierpinski */ \ /* */ \ /* Ainsi, pour le tapis de Sierpinski seul le debut de la chaine est utile, mais malgre */ \ /* tout la suite doit etre presente (surtout s'il y a plus d'une iteration puisque la chaine */ \ /* est alors reexploitee depuis son debut...). */ \ /* */ \ /* Les cubes marques 'V/T' (pour 'VRAI/TRUE') seront subdivises, alors que ceux qui sont */ \ /* marques 'F' (pour 'FAUX/FALSE') disparaitront (il y a aura a leur place un trou */ \ /* cubique...). */ \ /* */ \ /* */ \ /* Voici le 20171228092010 un exemple ('v $xiirf/MENG.S1.5.21') moins symetrique qui permet */ \ /* de souligner le fait que l'axe 'OY' monte evidemment : */ \ /* */ \ /* FFTFTTTTTFFFTFTFFFTTTFTTFFT */ \ /* === */ \ /* */ \ /* */ \ /* Z=0 Z=1 Z=2 */ \ /* */ \ /* Y=2 TTT FFF FFT */ \ /* Y=1 FTT TFT FTT */ \ /* Y=0 FFT FFF TTT */ \ /* === */ \ /* */ \ /* <--- X=0 X=1 X=2 ---> */ \ /* */ \ /* */ \ /* Je note le 20240408134025 que le tapis de Sierpinski "pur" doit etre defini par : */ \ /* */ \ /* TTT TFT TTT TTT TFT TTT TTT TFT TTT */ \ /* ------------------------ */ \ /* || */ \ /* ----------------- | */ \ /* | ----------------- */ \ /* || */ \ /* ------------------------ */ \ /* Le role de "TTT TFT TTT TTT TFT TTT" s'est vu a la mise au point de '$xiirf/SIER.81..4' */ \ /* ('v $xiirf/.SIER.81.1.$U 20240408134427' a ce propos...). */ #define GENERER_L_EPONGE_DE_MENGER \ VRAI \ /* Faut-il generer l'eponge de Menger ('VRAI') ou bien le tapis de Sierpinski ('FAUX') ? */ \ /* Ceci fut introduit le 20140910084547... */ #define GENERER_L_ENSEMBLE_TRIADIQUE_DE_CANTOR \ FAUX \ /* Lorsque 'IL_NE_FAUT_PAS(generer_l_eponge_de_menger)' faut-il generer l'ensemble triadique */ \ /* de Cantor ('VRAI') ou bien le tapis de Sierpinski ('FAUX') ? */ \ /* Ceci fut introduit le 20191204115436... */ #define RAPPORT_D_HOMOTHETIE \ TROIS #define RAPPORT_D_HOMOTHETIE_X \ RAPPORT_D_HOMOTHETIE #define RAPPORT_D_HOMOTHETIE_Y \ RAPPORT_D_HOMOTHETIE #define RAPPORT_D_HOMOTHETIE_Z \ RAPPORT_D_HOMOTHETIE /* Rapport permettant de passer d'une generation de cube a la suivante. Ce rapport est */ /* devenu un argument le 20171106102312 alors qu'il etait invariant avant cette date... */ /* */ /* On notera le 20171106103930 que les cubes ne sont bien centres les uns par rapport aux */ /* autres lors du decoupage recursif que lorsque 'rapport_d_homothetie' est IMPAIR... */ #define GENERALISER_LES_CUBES \ FAUX #define GENERALISER_LES_CUBES_____FAIRE_UN_IZLE \ VRAI /* Afin de pouvoir generaliser la notion de cube (introduit le 20171117162625). */ #define EDITER_LA_HIERARCHIE_DES_CUBES \ FAUX \ /* Faut-il editer la hierarchie des differents cubes ('VRAI') ou pas ('FAUX') ? */ #define NOMBRE_D_ITERATIONS \ QUATRE \ /* Nombre d'iterations. */ #define UTILISER_LA_SUPER_ECHELLE \ VRAI \ /* Faut-il utiliser la super-echelle ('VRAI') ou pas ('FAUX') ? */ #define X_ORIGINE_DU_CUBE \ FZERO #define Y_ORIGINE_DU_CUBE \ FZERO #define Z_ORIGINE_DU_CUBE \ FZERO #define COTE_DU_CUBE \ FU #define COTE_DU_CUBE_X \ COTE_DU_CUBE #define COTE_DU_CUBE_Y \ COTE_DU_CUBE #define COTE_DU_CUBE_Z \ COTE_DU_CUBE #define OPTIMISER_LE_COTE_DU_CUBE \ FAUX #define EDITER_LE_COTE_DU_CUBE \ FAUX /* Definition du cube. Cela fut complete le 20171113100122 avec l'optimisation et l'edition. */ #define NIVEAU_DU_FOND \ NOIR #define NIVEAU_DE_MARQUAGE_DE_L_EPONGE \ BLANC #define NIVEAU_DE_MARQUAGE_DU_COMPLEMENT_DE_L_EPONGE \ NOIR /* Niveaux de marquage de l'eponge et de son complement... */ #define MARQUER_LE_BORD_X_DE_L_EPONGE \ FAUX #define MARQUER_LE_BORD_Y_DE_L_EPONGE \ FAUX #define MARQUER_LE_BORD_Z_DE_L_EPONGE \ FAUX #define NIVEAU_DE_MARQUAGE_DU_BORD_DE_L_EPONGE \ NIVEAU_DE_MARQUAGE_DE_L_EPONGE /* Le marquage du bord a ete introduit le 20150326151602 et rendu conditionnel le */ /* 20150326152845... */ /* */ /* On rappelle le 20171106111532 qu'on appelle "bord" tout ce qui est autour et a */ /* l'exterieur de l'eponge... */ /* */ /* On notera ls possibilite d'activer selectivement le bord de l'eponge sur les trois */ /* axes. Cela est rendu necessaire pour les utilisations bidimensionnelles (cas du */ /* tapis de Sierpinski) pour lesquelles il n'y a qu'une seule couche dont le 'Z' est */ /* minimal et qui doit etre evidemment trace malgre cela (dans ce cas donc, on trace */ /* le bord uniquement parallelement aux axes 'X' et 'Y'...). */ #define COMPATIBILITE_20240617 \ VRAI \ /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement */ \ /* au 20240617093456. */ \ /* */ \ /* Le 20240618075356, a cause des images du type 'v $xiirf/SIER.61.2' ou les bords sont */ \ /* marques, je suis passe par defaut au mode compatibilite... */ #define COMPATIBILITE_20240917 \ FAUX \ /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement */ \ /* au 20240917095226. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define STOPPER_LA_SUBDIVISION_D_UN_CUBE \ ADD4(FAUX,VRAI,INDECIS,UN) \ /* Introduit le 20180116101348 pour forcer le marquage d'un cube "non terminal". Cette */ /* valeur doit evidemment etre differente de {FAUX,VRAI,INDECIS} d'ou cette definition */ /* un peu "tordu" destinee a etre perenne... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N R E C U R S I V E D E L ' E P O N G E D E M E N G E R : */ /* */ /*************************************************************************************************************************************/ /* Les variables suivantes ne peuvent etre localisees dans {BCommande,ECommande} car, en */ /* effet elles sont utilisees dans 'v $xrf/EpongeDeMenger.01$I rapport_d_homothetie'... */ DEFV(Positive,INIT(compteur_de_trace_1,ZERO)); DEFV(Positive,INIT(compteur_de_trace_2,ZERO)); DEFV(Positive,INIT(compteur_de_trace_3,ZERO)); DEFV(Logical,INIT(tracer_les_differentes_operations,TRACER_LES_DIFFERENTES_OPERATIONS)); /* Faut-il tracer les differentes operations ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit */ /* le 20240618150759 afin de mieux comprendre comment cela fonctionne reellement... */ /* */ /* Le compteur 'compteur_de_trace_3' a ete introduit le 20240917123058... */ DEFV(Logical,INIT(parcours_optimise_de_la_hierarchie_des_cubes,PARCOURS_OPTIMISE_DE_LA_HIERARCHIE_DES_CUBES)); /* A cause de l'anomalie 'v $xrf/EpongeDeMenger.01$I 20171231142417', cette option fut */ /* introduite le 20180101085659 au cas ou la methode 'FAUX' aurait des consequences sur */ /* les calculs. Cela permettrait donc de regenerer des images faites entre le 20171215150111 */ /* et le 20171231142417... */ /* */ /* Des tests faits apres l'introduction de cette option semblent montrer, comme je m'y */ /* attendais, que les resultats sont les memes qu'il y ait ou pas optimisation... */ /* Ainsi, aux environs du 20180102094205 sur '$LACT1A', l'image 'v $xiirf/MENG.O1.4.21' */ /* a ete recalculee. Les durees (via 'Dhms') ont ete respectivement de 00:00:18 et de */ /* 00:00:02 SANS et AVEC optimisation respectivement. Les deux images ainsi recalculees */ /* etaient strictement identiques... */ DEFV(Logical,INIT(editer_les_choix_de_subdivision_suppression,EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION)); DEFV(Logical,INIT(editer_les_choix_de_subdivision_suppression__version_simplifiee ,EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION__VERSION_SIMPLIFIEE ) ); DEFV(Logical,INIT(editer_les_choix_de_subdivision_suppression__version_simplifiee_avec_parenthesage ,EDITER_LES_CHOIX_DE_SUBDIVISION_SUPPRESSION__VERSION_SIMPLIFIEE_AVEC_PARENTHESAGE ) ); /* Introduit le 20240917115931 afin de pouvoir editer les choix de subdivision/suppression */ /* dans tous les cas... */ /* */ /* Je note le 20240918100540 que le fichier generable par cette edition peut etre reinjecte */ /* sous la forme "LISTE_VALEURS_ALEATOIRES_PRE_CALCULEES=" ce qui redonne la meme structure. */ /* */ /* La version simplifiee a ete introduite le 20240918170538... */ /* */ /* La version simplifiee et parenthesee a ete introduite le 20240921112252... */ /* */ /* On notera le 20240923182617 que le fichier ainsi genere peut etre remis en forme via */ /* les instructions suivantes : */ /* */ /* */ /* $xcp/substitue.01$X \ */ /* \ */ /* c01="\n\( *[01]*\)\n *\((\[[0-9]*\]\)\n *\([01][01][01][01][01][01]*\)\n *\()\)" \ */ /* s01="\n\1\2\3\4" \ */ /* \ */ /* c12="\(\n *\)\([01]\)\([01]\)\((\)" \ */ /* s12="\1\2\1\3 \4" \ */ /* \ */ /* c13="\(\n *\)\([01]\)\([01]\)\([01]\)\((\)" \ */ /* s13="\1\2\1\3\1\4\5" \ */ /* \ */ /* c14="\(\n *\)\([01]\)\([01]\)\([01]\)\([01]\)\((\)" \ */ /* s14="\1\2\1\3\1\4\1\5\6" \ */ /* \ */ /* c21="\([01]\)\((\)" \ */ /* s21="\1 \2" \ */ /* \ */ /* c22="\(\n *[01]\)\n *\((\)" \ */ /* s22="\1 \2" \ */ /* \ */ /* c23="\(\]\)\([^ ]\)" \ */ /* s23="\1 \2" \ */ /* */ DEFV(Int,INIT(graine,GRAINE)); DEFV(Float,INIT(A_seuil_d_indecision_entre_FAUX_et_VRAI,A_SEUIL_D_INDECISION_ENTRE_FAUX_ET_VRAI)); DEFV(Float,INIT(B_seuil_d_indecision_entre_FAUX_et_VRAI,B_SEUIL_D_INDECISION_ENTRE_FAUX_ET_VRAI)); DEFV(Logical,INIT(utiliser_un_generateur_aleatoire_pre_calcule,UTILISER_UN_GENERATEUR_ALEATOIRE_PRE_CALCULE)); DEFV(Logical,INIT(editer_les_nombres_aleatoires,EDITER_LES_NOMBRES_ALEATOIRES)); DEFV(Logical,INIT(editer_le_nombre_de_tirages_aleatoires,EDITER_LE_NOMBRE_DE_TIRAGES_ALEATOIRES)); DEFV(Logical,INIT(utiliser_un_espace_de_parametrage_tridimensionnel,UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL)); DEFV(Logical,INIT(utiliser_le_generateur_a_periodicite_parametrable,UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE)); DEFV(pointI_2D,point_courant_de_l_espace_de_parametrage_2D); DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage_3D); SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) /* Definition du generateur aleatoire introduit le 20180107174041... */ /* */ /* On notera le 20180108111352 que plus le seuil est petit (par exemple "seuil=0.2"), plus */ /* il y a de matiere (et donc moins il y a de trous...). */ /* */ /* Le 20240617131239 a ete introduite la possibilite d'un generateur "pre-calcule"... */ /* */ /* Le 20240619093425 a ete introduite la possibilite d'editer le nombre de tirages */ /* aleatoires effectues... */ /* */ /* Le 20240706095828 a ete introduite la possibilite d'editer les nombres aleatoires */ /* calcules ou recuperes dans un fichier... */ DEFV(Logical,INIT(editer_la_hierarchie_des_cubes,EDITER_LA_HIERARCHIE_DES_CUBES)); /* Faut-il editer la hierarchie des differents cubes ('VRAI') ou pas ('FAUX') ? */ DEFV(Logical,INIT(utiliser_la_super_echelle,UTILISER_LA_SUPER_ECHELLE)); /* Faut-il utiliser la super-echelle ('VRAI') ou pas ('FAUX') ? */ DEFV(coeffI_3D,rapport_d_homothetie); /* Rapport permettant de passer d'une generation de cube a la suivante. Ce rapport est */ /* devenu un argument le 20171106102312 alors qu'il etait invariant avant cette date... */ /* */ /* On notera le 20171106103930 que les cubes ne sont bien centres les uns par rapport aux */ /* autres lors du decoupage recursif que lorsque 'rapport_d_homothetie' est IMPAIR... */ DEFV(Logical,INIT(generaliser_les_cubes,GENERALISER_LES_CUBES)); DEFV(Logical,INIT(generaliser_les_cubes_____faire_un_IZLE,GENERALISER_LES_CUBES_____FAIRE_UN_IZLE)); /* Afin de pouvoir generaliser la notion de cube (introduit le 20171117162625). */ DEFV(Int,INIT(nombre_d_iterations,NOMBRE_D_ITERATIONS)); /* Nombre d'iterations. */ /* Le variables precedentes ne peuvent etre localisees dans {BCommande,ECommande} car, en */ /* effet elles sont utilisees dans 'v $xrf/EpongeDeMenger.01$I rapport_d_homothetie'... */ #include xrf/EpongeDeMenger.01.I" /* A cause des operateurs 'OPC1(...)' que la fonction 'GenerationDeLEpongeDeMenger(...)' */ /* qui est definie utilise ('v $xrf/EpongeDeMenger.01$I OPC1')... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T I O N D E L ' E P O N G E D E M E N G E R */ /* ( E T D U T A P I S D E S I E R P I N S K I ) : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); /* Definition de l'album Resultat. */ DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Logical,INIT(inverser_les_conventions,INVERSER_LES_CONVENTIONS)); /* Faut-il inverser les conventions ('VRAI') c'est-a-dire permuter 'F' et 'T' ou pas */ /* ('FAUX') ? c'est-a-dire conserver 'F' et 'T'. Ceci fut introduit le 20240615073518, */ /* la valeur par defaut garantissant la compatibilite anterieure... */ DEFV(CHAR,INIC(POINTERc(liste_des_cubes_a_subdiviser_avec_d_eventuels_espaces),LISTE_DES_CUBES_A_SUBDIVISER)); DEFV(CHAR,INIC(POINTERc(liste_des_cubes_a_subdiviser),CHAINE_UNDEF)); /* Liste des cubes a subdiviser qui correspond a l'Eponge de Menger standard. Cette liste */ /* correspond aux sections suivantes (avec un rapport d'homothetie egal a 3) : */ /* */ /* Z=0 Z=1 Z=2 */ /* */ /* Y=2 *** *-* *** */ /* Y=1 *-* --- *-* */ /* Y=0 *** *-* *** */ /* */ /* <--- X=0 X=1 X=2 ---> */ /* */ /* ou "*" indique un cube subdivisible (introduit le 20171216070955). */ /* */ /* Avec les notations a utiliser dans 'GET_ARGUMENT_C("liste_cubes="...', on a donc : */ /* */ /* Eponge de Menger */ /* _____________________ */ /* / \ */ /* */ /* TTT TFT TTT */ /* TFT FFF TFT */ /* TTT TFT TTT */ /* */ /* \_/ */ /* */ /* Tapis de Sierpinski */ /* */ /* soit donc la chaine : */ /* */ /* Eponge de Menger */ /* _________________________________________ */ /* / \ */ /* TTT TFT TTT TFT FFF TFT TTT TFT TTT */ /* \_________/ */ /* */ /* Tapis de Sierpinski */ /* */ /* ou encore apres elimination des espaces : */ /* */ /* Eponge de Menger */ /* _________________________ */ /* / \ */ /* TTTTFTTTTTFTFFFTFTTTTTFTTTT */ /* \_______/ */ /* */ /* Tapis de Sierpinski */ /* */ /* Ainsi, pour le tapis de Sierpinski seul le debut de la chaine est utile, mais malgre */ /* tout la suite doit etre presente (surtout s'il y a plus d'une iteration puisque la chaine */ /* est alors reexploitee depuis son debut...). */ /* */ /* Les cubes marques 'V/T' (pour 'VRAI/TRUE') seront subdivises, alors que ceux qui sont */ /* marques 'F' (pour 'FAUX/FALSE') disparaitront (il y a aura a leur place un trou */ /* cubique...). */ /* */ /* */ /* Voici le 20171228092010 un exemple ('v $xiirf/MENG.S1.5.21') moins symetrique qui permet */ /* de souligner le fait que l'axe 'OY' monte evidemment : */ /* */ /* FFTFTTTTTFFFTFTFFFTTTFTTFFT */ /* === */ /* */ /* */ /* Z=0 Z=1 Z=2 */ /* */ /* Y=2 TTT FFF FFT */ /* Y=1 FTT TFT FTT */ /* Y=0 FFT FFF TTT */ /* === */ /* */ /* <--- X=0 X=1 X=2 ---> */ /* */ DEFV(Logical,INIT(generer_l_eponge_de_Menger,GENERER_L_EPONGE_DE_MENGER)); /* Faut-il generer l'eponge de Menger ('VRAI') ou bien le tapis de Sierpinski ('FAUX') ? */ /* Ceci fut introduit le 20140910084547... */ DEFV(Logical,INIT(generer_l_ensemble_triadique_de_Cantor,GENERER_L_ENSEMBLE_TRIADIQUE_DE_CANTOR)); /* Lorsque 'IL_NE_FAUT_PAS(generer_l_eponge_de_menger)' faut-il generer l'ensemble triadique */ /* de Cantor ('VRAI') ou bien le tapis de Sierpinski ('FAUX') ? */ /* Ceci fut introduit le 20191204115436... */ DEFV(pointF_3D,origine_du_cube); DEFV(deltaF_3D,cote_du_cube); DEFV(Logical,INIT(optimiser_le_cote_du_cube,OPTIMISER_LE_COTE_DU_CUBE)); DEFV(Logical,INIT(editer_le_cote_du_cube,EDITER_LE_COTE_DU_CUBE)); /* Definition du cube "initial" que l'on va subdiviser... */ /* */ /* L"optimisation et l'edition ont ete introduites le 20171113100122... */ DEFV(genere_p,INIT(niveau_du_fond,NIVEAU_DU_FOND)); DEFV(genere_p,INIT(niveau_de_marquage_de_l_eponge,NIVEAU_DE_MARQUAGE_DE_L_EPONGE)); DEFV(genere_p,INIT(niveau_de_marquage_du_complement_de_l_eponge,NIVEAU_DE_MARQUAGE_DU_COMPLEMENT_DE_L_EPONGE)); /* Niveaux de marquage de l'eponge et de son complement... */ DEFV(Logical,INIT(marquer_le_bord_X_de_l_eponge,MARQUER_LE_BORD_X_DE_L_EPONGE)); DEFV(Logical,INIT(marquer_le_bord_Y_de_l_eponge,MARQUER_LE_BORD_Y_DE_L_EPONGE)); DEFV(Logical,INIT(marquer_le_bord_Z_de_l_eponge,MARQUER_LE_BORD_Z_DE_L_EPONGE)); DEFV(genere_p,INIT(niveau_de_marquage_du_bord_de_l_eponge,NIVEAU_DE_MARQUAGE_DU_BORD_DE_L_EPONGE)); /* Le marquage du bord a ete introduit le 20150326151602 et rendu conditionnel le */ /* 20150326152845... */ /* */ /* On rappelle le 20171106111532 qu'on appelle "bord" tout ce qui est autour et a */ /* l'exterieur de l'eponge... */ /* */ /* On notera ls possibilite d'activer selectivement le bord de l'eponge sur les trois */ /* axes. Cela est rendu necessaire pour les utilisations bidimensionnelles (cas du */ /* tapis de Sierpinski) pour lesquelles il n'y a qu'une seule couche dont le 'Z' est */ /* minimal et qui doit etre evidemment trace malgre cela (dans ce cas donc, on trace */ /* le bord uniquement parallelement aux axes 'X' et 'Y'...). */ /*..............................................................................................................................*/ INITIALISATION_POINT_3D(origine_du_cube,X_ORIGINE_DU_CUBE,Y_ORIGINE_DU_CUBE,Z_ORIGINE_DU_CUBE); INITIALISATION_ACCROISSEMENT_3D(cote_du_cube,COTE_DU_CUBE_X,COTE_DU_CUBE_Y,COTE_DU_CUBE_Z); INITIALISATION_COEFFICIENT_3D(rapport_d_homothetie,RAPPORT_D_HOMOTHETIE_X,RAPPORT_D_HOMOTHETIE_Y,RAPPORT_D_HOMOTHETIE_Z); GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20240617=",compatibilite_20240617); GET_ARGUMENT_L("compatibilite_20240917=",compatibilite_20240917); PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENTS2_I("pas=",pas_des_images,pasZ); GET_ARGUMENT_L("tracer=",tracer_les_differentes_operations); /* Arguments introduits le 20240618150759... */ GET_ARGUMENT_L("parcours_optimise=""po=",parcours_optimise_de_la_hierarchie_des_cubes); GET_ARGUMENT_N("parcours_non_optimise=""pno=",parcours_optimise_de_la_hierarchie_des_cubes); /* Arguments introduits le 20180101085659... */ GET_ARGUMENT_I("graine=""g=",graine); GET_ARGUMENT_F("Aseuil_FAUX_VRAI=""Aseuil=""AsFV=" ,A_seuil_d_indecision_entre_FAUX_et_VRAI ); GET_ARGUMENT_F("Bseuil_FAUX_VRAI=""Bseuil=""BsFV=""seuil_FAUX_VRAI=""seuil=""sFV=" ,B_seuil_d_indecision_entre_FAUX_et_VRAI ); /* Arguments completes et/ou introduits le 20240926150024... */ GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_L("tridimensionnel=""3D=",utiliser_un_espace_de_parametrage_tridimensionnel); GET_ARGUMENT_L("periodique=",utiliser_le_generateur_a_periodicite_parametrable); /* Arguments introduits le 20180107174041 et completes le 20240617131239... */ /* */ /* On notera le 20180108111352 que plus le seuil est petit (par exemple "seuil=0.2"), plus */ /* il y a de matiere (et donc moins il y a de trous...). */ GET_ARGUMENT_L("valeurs_aleatoires_pre_calculees=""pre_calculees=""pre_calcule=""pc=" ,utiliser_un_generateur_aleatoire_pre_calcule ); PROKESF_ARGUMENT_FICHIER("LISTE_VALEURS_ALEATOIRES_PRE_CALCULEES=" ,fichier_LISTE_VALEURS_ALEATOIRES_PRE_CALCULEES ,liste_initiale_des_VALEURS_ALEATOIRES_PRE_CALCULEES ,VALEURS_ALEATOIRES_PRE_CALCULEES_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); /* Introduit le 20240617131239... */ /* */ /* Je rappelle le 20240920123359 que ce fichier peut contenir trois valeurs entieres */ /* differentes : */ /* */ /* 0 False */ /* 1 True */ /* */ /* 9 Random (valeur aleatoire generee 0/1 remplacant le '9') */ /* */ /* Le 20240925095806, "pc=" a ete introduit pour 'v $xrf/EpongeDeMenger.01$Z pc='... */ GET_ARGUMENT_L("editer_choix_subdivision_suppression=""ecss=",editer_les_choix_de_subdivision_suppression); GET_ARGUMENT_L("editer_choix_subdivision_suppression_simplifiee=""ecsss=" ,editer_les_choix_de_subdivision_suppression__version_simplifiee ); GET_ARGUMENT_L("editer_choix_subdivision_suppression_simplifiee_parenthesee=""ecsssp=" ,editer_les_choix_de_subdivision_suppression__version_simplifiee_avec_parenthesage ); /* Argument introduit le 20240917115931... */ /* */ /* Je note le 20240918100540 que le fichier generable par cette edition peut etre reinjecte */ /* sous la forme "LISTE_VALEURS_ALEATOIRES_PRE_CALCULEES=" ce qui redonne la meme structure. */ /* */ /* La version simplifiee a ete introduite le 20240918170538... */ /* */ /* La version simplifiee et parenthesee a ete introduite le 20240921112252... */ GET_ARGUMENT_L("editer_nombres_aleatoires=""ena=",editer_les_nombres_aleatoires); /* Argument introduit le 20240706095828... */ GET_ARGUMENT_L("editer_nombre_tirages_aleatoires=""enta=",editer_le_nombre_de_tirages_aleatoires); /* Argument introduit le 20240619093425... */ GET_ARGUMENT_L("inverser_conventions=""inverser=""TF_FT=",inverser_les_conventions); /* Argument introduit le 20240615073518... */ GET_ARGUMENT_C("liste_cubes=""lc=",liste_des_cubes_a_subdiviser_avec_d_eventuels_espaces); /* Arguments introduits le 20171216070955 et completes le 20171231114039 afin de permettre */ /* d'eventuels espaces facilitant la lecture de cette liste... */ GET_ARGUMENT_L("eponge_Menger=""Menger=""eponge=",generer_l_eponge_de_Menger); GET_ARGUMENT_N("tapis_Sierpinski=""Sierpinski=""tapis=",generer_l_eponge_de_Menger); GET_ARGUMENT_L("ensemble_triadique_Cantor=""Cantor=""ensemble=",generer_l_ensemble_triadique_de_Cantor); /* Arguments introduits le 20140910084547 et completes le 20191204115436 avec l'ensemble */ /* triadique de Cantor... */ GET_ARGUMENTS3g_I("rapport_homothetie=""rapport=""rh=" ,ASD1(rapport_d_homothetie,cx) ,ASD1(rapport_d_homothetie,cy) ,ASD1(rapport_d_homothetie,cz) ); GET_ARGUMENT_I("rapport_homothetieX=""rapportX=""rhX=",ASD1(rapport_d_homothetie,cx)); GET_ARGUMENT_I("rapport_homothetieY=""rapportY=""rhY=",ASD1(rapport_d_homothetie,cy)); GET_ARGUMENT_I("rapport_homothetieZ=""rapportZ=""rhZ=",ASD1(rapport_d_homothetie,cz)); /* Arguments introduits le 20171106102312... */ GET_ARGUMENT_L("generaliser_cubes=""gc=",generaliser_les_cubes); GET_ARGUMENT_L("IZLE=",generaliser_les_cubes_____faire_un_IZLE); GET_ARGUMENT_N("IZGT=",generaliser_les_cubes_____faire_un_IZLE); GET_ARGUMENT_F("a333=",Acoupe_quelconque_____a333); GET_ARGUMENT_F("a332=",Acoupe_quelconque_____a332); GET_ARGUMENT_F("a331=",Acoupe_quelconque_____a331); GET_ARGUMENT_F("a330=",Acoupe_quelconque_____a330); GET_ARGUMENT_F("a323=",Acoupe_quelconque_____a323); GET_ARGUMENT_F("a322=",Acoupe_quelconque_____a322); GET_ARGUMENT_F("a321=",Acoupe_quelconque_____a321); GET_ARGUMENT_F("a320=",Acoupe_quelconque_____a320); GET_ARGUMENT_F("a313=",Acoupe_quelconque_____a313); GET_ARGUMENT_F("a312=",Acoupe_quelconque_____a312); GET_ARGUMENT_F("a311=",Acoupe_quelconque_____a311); GET_ARGUMENT_F("a310=",Acoupe_quelconque_____a310); GET_ARGUMENT_F("a303=",Acoupe_quelconque_____a303); GET_ARGUMENT_F("a302=",Acoupe_quelconque_____a302); GET_ARGUMENT_F("a301=",Acoupe_quelconque_____a301); GET_ARGUMENT_F("a300=",Acoupe_quelconque_____a300); GET_ARGUMENT_F("a233=",Acoupe_quelconque_____a233); GET_ARGUMENT_F("a232=",Acoupe_quelconque_____a232); GET_ARGUMENT_F("a231=",Acoupe_quelconque_____a231); GET_ARGUMENT_F("a230=",Acoupe_quelconque_____a230); GET_ARGUMENT_F("a223=",Acoupe_quelconque_____a223); GET_ARGUMENT_F("a222=",Acoupe_quelconque_____a222); GET_ARGUMENT_F("a221=",Acoupe_quelconque_____a221); GET_ARGUMENT_F("a220=",Acoupe_quelconque_____a220); GET_ARGUMENT_F("a213=",Acoupe_quelconque_____a213); GET_ARGUMENT_F("a212=",Acoupe_quelconque_____a212); GET_ARGUMENT_F("a211=",Acoupe_quelconque_____a211); GET_ARGUMENT_F("a210=",Acoupe_quelconque_____a210); GET_ARGUMENT_F("a203=",Acoupe_quelconque_____a203); GET_ARGUMENT_F("a202=",Acoupe_quelconque_____a202); GET_ARGUMENT_F("a201=",Acoupe_quelconque_____a201); GET_ARGUMENT_F("a200=",Acoupe_quelconque_____a200); GET_ARGUMENT_F("a133=",Acoupe_quelconque_____a133); GET_ARGUMENT_F("a132=",Acoupe_quelconque_____a132); GET_ARGUMENT_F("a131=",Acoupe_quelconque_____a131); GET_ARGUMENT_F("a130=",Acoupe_quelconque_____a130); GET_ARGUMENT_F("a123=",Acoupe_quelconque_____a123); GET_ARGUMENT_F("a122=",Acoupe_quelconque_____a122); GET_ARGUMENT_F("a121=",Acoupe_quelconque_____a121); GET_ARGUMENT_F("a120=",Acoupe_quelconque_____a120); GET_ARGUMENT_F("a113=",Acoupe_quelconque_____a113); GET_ARGUMENT_F("a112=",Acoupe_quelconque_____a112); GET_ARGUMENT_F("a111=",Acoupe_quelconque_____a111); GET_ARGUMENT_F("a110=",Acoupe_quelconque_____a110); GET_ARGUMENT_F("a103=",Acoupe_quelconque_____a103); GET_ARGUMENT_F("a102=",Acoupe_quelconque_____a102); GET_ARGUMENT_F("a101=",Acoupe_quelconque_____a101); GET_ARGUMENT_F("a100=",Acoupe_quelconque_____a100); GET_ARGUMENT_F("a033=",Acoupe_quelconque_____a033); GET_ARGUMENT_F("a032=",Acoupe_quelconque_____a032); GET_ARGUMENT_F("a031=",Acoupe_quelconque_____a031); GET_ARGUMENT_F("a030=",Acoupe_quelconque_____a030); GET_ARGUMENT_F("a023=",Acoupe_quelconque_____a023); GET_ARGUMENT_F("a022=",Acoupe_quelconque_____a022); GET_ARGUMENT_F("a021=",Acoupe_quelconque_____a021); GET_ARGUMENT_F("a020=",Acoupe_quelconque_____a020); GET_ARGUMENT_F("a013=",Acoupe_quelconque_____a013); GET_ARGUMENT_F("a012=",Acoupe_quelconque_____a012); GET_ARGUMENT_F("a011=",Acoupe_quelconque_____a011); GET_ARGUMENT_F("a010=",Acoupe_quelconque_____a010); GET_ARGUMENT_F("a003=",Acoupe_quelconque_____a003); GET_ARGUMENT_F("a002=",Acoupe_quelconque_____a002); GET_ARGUMENT_F("a001=",Acoupe_quelconque_____a001); GET_ARGUMENT_F("a000=",Acoupe_quelconque_____a000); /* Arguments introduits le 20171117162625... */ GET_ARGUMENT_L("editer_hierarchie_cubes=""editer=""hierarchie=""ehc=",editer_la_hierarchie_des_cubes); GET_ARGUMENT_I("nombre_iterations=""iterations=""iter=",nombre_d_iterations); GET_ARGUMENT_L("super_echelle=""se=",utiliser_la_super_echelle); GET_ARGUMENT_F("x0=""X0=",ASD1(origine_du_cube,x)); GET_ARGUMENT_F("y0=""Y0=",ASD1(origine_du_cube,y)); GET_ARGUMENT_F("z0=""Z0=",ASD1(origine_du_cube,z)); GET_ARGUMENTS3g_F("cote=""c=" ,ASD1(cote_du_cube,dx) ,ASD1(cote_du_cube,dy) ,ASD1(cote_du_cube,dz) ); GET_ARGUMENT_F("coteX=""cX=",ASD1(cote_du_cube,dx)); GET_ARGUMENT_F("coteY=""cY=",ASD1(cote_du_cube,dy)); GET_ARGUMENT_F("coteZ=""cZ=",ASD1(cote_du_cube,dz)); GET_ARGUMENT_L("optimiser_cote=""oc=",optimiser_le_cote_du_cube); /* Arguments introduits le 20171113100122... */ GET_ARGUMENT_L("editer_cote=""ec=",editer_le_cote_du_cube); /* Arguments introduits le 20171113100122... */ GET_ARGUMENT_P("niveau_fond=""nf=",niveau_du_fond); /* Arguments introduits le 20140916105438... */ GET_ARGUMENT_P("niveau_eponge=""nep=",niveau_de_marquage_de_l_eponge); GET_ARGUMENT_P("niveau_complement_eponge=""ncep=",niveau_de_marquage_du_complement_de_l_eponge); GET_ARGUMENT_L("marquer_bord_X=""mbX=""mbx=",marquer_le_bord_X_de_l_eponge); GET_ARGUMENT_L("marquer_bord_Y=""mbY=""mby=",marquer_le_bord_Y_de_l_eponge); GET_ARGUMENT_L("marquer_bord_Z=""mbZ=""mbz=",marquer_le_bord_Z_de_l_eponge); GET_ARGUMENT_P("niveau_bord_eponge=""nbep=",niveau_de_marquage_du_bord_de_l_eponge); GET_ARGUMENT_F("increment_niveau_eponge=""increment=""inep=" ,increment_de__increment_courant_de__niveau_de_marquage_de_l_eponge ); /* Argument introduit le 20240617080321 avec passage de 'GET_ARGUMENT_I(...)' a */ /* 'GET_ARGUMENT_F(...)' le 20240621093649... */ ) ); EGAL(liste_des_cubes_a_subdiviser ,chain_Acopie_avec_suppression_des_espaces(liste_des_cubes_a_subdiviser_avec_d_eventuels_espaces) ); /* Introduit le 20171231114039 afin de permettre d'eventuels espaces facilitant la lecture */ /* de cette liste... */ SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) SPIRALE_VALIDATION; INITIALISATION_POINT_2D(point_courant_de_l_espace_de_parametrage_2D,Xmin,Ymin); INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage_3D,Xmin,Ymin,Zmin); /* Initialisation du generateur aleatoire (introduite le 20180107174041...). */ Test(IL_FAUT(optimiser_le_cote_du_cube)) /* Test introduit le 20171113100122... */ Bblock DEFV(Float,INIT(coteXYZ_du_cube,FLOT__UNDEF)); DEFV(Float,INIT(coteX_du_cube,_____lNORMALISE_OX(TRMU(dimX)))); DEFV(Float,INIT(coteY_du_cube,_____lNORMALISE_OY(TRMU(dimY)))); Test(IL_FAUT(generer_l_eponge_de_Menger)) Bblock DEFV(Float,INIT(coteZ_du_cube,_____lNORMALISE_OZ(TRMU(dimZ)))); EGAL(coteXYZ_du_cube,MIN3(coteX_du_cube,coteY_du_cube,coteZ_du_cube)); /* Et ce afin que toute l'eponge tienne dans l'image... */ Eblock ATes Bblock EGAL(coteXYZ_du_cube,MIN2(coteX_du_cube,coteY_du_cube)); /* Et ce afin que tout le tapis tienne dans l'image... */ Eblock ETes DECR(coteXYZ_du_cube,TRES_GRAND_EPSILON); INITIALISATION_ACCROISSEMENT_3D(cote_du_cube,coteXYZ_du_cube,coteXYZ_du_cube,coteXYZ_du_cube); /* Cette correction a ete introduite le 20171113104548 pour 'v $xiirf/SIER.71.3'... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_le_cote_du_cube)) /* Test introduit le 20171113100122... */ Bblock CAL3(Prme1("CoteCubeX=%+.^^^\n",ASD1(cote_du_cube,dx))); CAL3(Prme1("CoteCubeY=%+.^^^\n",ASD1(cote_du_cube,dy))); CAL3(Prme1("CoteCubeZ=%+.^^^\n",ASD1(cote_du_cube,dz))); Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_la_hierarchie_des_cubes)) /* Test introduit le 20171106103930... */ Bblock Test(I3OU(EST_IMPAIR(ASD1(rapport_d_homothetie,cx)) ,EST_IMPAIR(ASD1(rapport_d_homothetie,cy)) ,EST_IMPAIR(ASD1(rapport_d_homothetie,cz)) ) ) Bblock /* Cas ou les cubes seront bien centres les uns par rapport aux autres lors du decoupage */ /* recursif... */ Eblock ATes Bblock PRINT_ATTENTION("les cubes ne seront pas bien centres les uns par rapport aux autres lors du decoupage recursif"); Eblock ETes Eblock ATes Bblock Eblock ETes Test(TOUJOURS_FAUX) /* Introduit le 20140924110127 suite a 'v $xrf/EpongeDeMenger.01$K 20140912095448', mais */ /* sans supprimer cette sequence : on ne sait jamais... */ Bblock Test(I3OU(NON_DIVISIBLE(dimX,ASD1(rapport_d_homothetie,cx)) ,NON_DIVISIBLE(dimY,ASD1(rapport_d_homothetie,cy)) ,NON_DIVISIBLE(dimZ,ASD1(rapport_d_homothetie,cz)) ) ) /* Le 20140912095448, je ne comprends pas ce test : il me semble qu'en fait il devrait se */ /* retrouver a chaque etage de la recursivite... */ Bblock PRINT_ATTENTION("l'une au moins des dimensions n'est pas divisible par le rapport d'homothetie"); /* Dans ce cas, certains cubes ne sont plus exactement des cubes... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes begin_nouveau_block Bblock BDEFV(album,album_d_imagesR); /* Definition de l'album Resultat. */ DEFV(Logical,INIT(c_est_le_premier_cube_de_la_profondeur_courante,VRAI)); /* Introduit le 20140922163745 dans le but de faire des verifications des differents */ /* cotes des cubes au cours du processus de reduction recursive... */ DEFV(Int,INIT(index_des_cubes,PREMIER_CARACTERE)); DEFV(Int,INIT(nombre_de_cubes_a_subdiviser,chain_Xtaille(liste_des_cubes_a_subdiviser))); MdTb4(selecteur_des_cubes_a_subdiviser ,NOMBRE_EFFECTIF_D_ITERATIONS ,NOMBRE_LINEAIRE_DE_CUBES_Z ,NOMBRE_LINEAIRE_DE_CUBES_Y ,NOMBRE_LINEAIRE_DE_CUBES_X ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); /* Introduit le 20171215150111 dans le but, ulterieurement, de selectionner les cubes */ /* a subdiviser... */ DEFV(coeffI_3D,rapport_d_homothetie_cumule); INITIALISATION_COEFFICIENT_3D(rapport_d_homothetie_cumule,FU,FU,FU); Test(NON_DIVISIBLE(nombre_de_cubes_a_subdiviser,NOMBRE_VOLUMIQUE_DE_CUBES)) /* Introduit le 20171216070955... */ Bblock PRINT_ERREUR("il y a une incoherence dans le nombre de cubes"); CAL1(Prer2("(la liste des cubes a subdiviser en contient %d qui n'est pas divisible par %d)\n" ,nombre_de_cubes_a_subdiviser ,NOMBRE_VOLUMIQUE_DE_CUBES ) ); Eblock ATes Bblock Eblock ETes begin_hyper_albumQ(DoDe,PREMIERE_ITERATION_,DERNIERE_ITERATION_,I ,DoIn,PREMIER_CUBE_REDUIT_Z,DERNIER_CUBE_REDUIT_Z,I ,DoIn,PREMIER_CUBE_REDUIT_Y,DERNIER_CUBE_REDUIT_Y,I ,DoIn,PREMIER_CUBE_REDUIT_X,DERNIER_CUBE_REDUIT_X,I ) /* Introduit le 20171215150111... */ /* */ /* ATTENTION : je rappelle le 20240616090847 que ce processus est ADDITIF et non pas */ /* multiplicatif. Ainsi : */ /* */ /* ------------------------ --- dimension de l'espace */ /* | -------- | | */ /* | | | | | */ /* rapport=3 iterations=1 ==> 1x(3^3) = 27 "Do??(...)" */ /* rapport=3 iterations=2 ==> 2x(3^3) = 54 "Do??(...)" */ /* rapport=3 iterations=3 ==> 3x(3^3) = 81 "Do??(...)" */ /* (...) */ /* */ /* et donc +27 "tours" pour chaque iteration de plus (et non pas x27...). */ /* */ /* Le 20240618172951, grace a 'TRACER(...)', je me demande a quoi sert le 'DoDe(...)' : */ /* */ /* PREMIERE_ITERATION_,DERNIERE_ITERATION_ */ /* */ /* dans le 'begin_hyper_albumQ'... Le 20240619073159, je realise qu'il s'agit du controle */ /* de la hierarchie des trous... */ Bblock DEFV(Int,INIT(index_du_cube_courant,MODS(index_des_cubes,PREMIER_CARACTERE,TRMU(nombre_de_cubes_a_subdiviser)))); DEFV(CHAR,INIT(etat_demande_de_subdivision,K_UNDEF)); DEFV(Logical,INIT(etat_de_subdivision_du_cube_courant,LUNDEF)); EGAL(etat_demande_de_subdivision,ITb1(liste_des_cubes_a_subdiviser,index_du_cube_courant)); Test(IL_FAUT(inverser_les_conventions)) /* Test introduit le 20240615073518... */ Bblock DEFV(CHAR,INIT(etat_inverse_de_subdivision,etat_demande_de_subdivision)); /* A priori, l'etat demande est conserve... */ Choi(etat_demande_de_subdivision) Bblock Ca5e(K_T,K_t,K_V,K_v,K_1) Bblock EGAL(etat_inverse_de_subdivision,K_F); Eblock ECa5 Ca3e(K_F,K_f,K_0) /* On notera que "False" et "Faux" commencent par la meme lettre ('F') d'ou un 'Ca3e(...)' */ /* et non pas un 'Ca5e(...)'. */ Bblock EGAL(etat_inverse_de_subdivision,K_T); Eblock ECa3 Defo Bblock /* Dans ce cas, l'etat demande est conserve evidemment... */ Eblock EDef Eblock ECho EGAL(etat_demande_de_subdivision,etat_inverse_de_subdivision); /* Nouvel etat demande, inverse eventuellement... */ Eblock ATes Bblock Eblock ETes Choi(etat_demande_de_subdivision) /* Liste des codes disponibles : */ /* */ /* V v T t 1 : "VRAI/TRUE", on subdivise le cube courant, */ /* F f F f 0 : "FAUX/FALSE", on ne subdivise pas le cube courant, */ /* */ /* A a R r : "ALEATOIRE/RANDOM", on choisit aleatoirement de subdiviser ou pas, */ /* S s C c : "STOP", on stoppe la subdivision. */ /* */ Bblock /* On notera le 20171216084204 que l'on n'utilise pas 'C_VRAI_____ABREGE' et */ /* 'C_FAUX_____ABREGE' car, en effet, d'une part ci-apres on a bsoin de caracteres */ /* individuels et non pas de chaines de caracteres. D'autre part, on aura peut-etre */ /* besoin ulterieurement d'etendre les listes {K_V,K_v} et {K_F,K_f} avec d'autres */ /* caracteres (plus significatifs...). */ Ca5e(K_T,K_t,K_V,K_v,K_1) /* Les deux cas 'K_T' et 'K_t' ont ete introduits le 20171227095637 afin de permettre */ /* de mettre des chaines 'liste_des_cubes_a_subdiviser', par exemple, dans les pages */ /* 'v ''$xiMl/MENG.21.n.1$ANGLAIS.$m4.$I'... */ /* */ /* Le cas 'K_1' a ete introduit le 20240614175644 pour traiter les "decimales" de pi en */ /* base 2. */ Bblock EGAL(etat_de_subdivision_du_cube_courant,VRAI); Eblock ECa5 Ca3e(K_F,K_f,K_0) /* Le cas 'K_0' a ete introduit le 20240614175644 pour traiter les "decimales" de pi en */ /* base 2. */ Bblock EGAL(etat_de_subdivision_du_cube_courant,FAUX); Eblock ECa3 Ca4e(K_R,K_r,K_A,K_a) Bblock EGAL(etat_de_subdivision_du_cube_courant,INDECIS); /* L'indecision a ete introduite le 20180107180745 (avec "R" pour "Random" et "A" pour */ /* "aleatoire"...). */ Eblock ECa4 Ca4e(K_C,K_c,K_S,K_s) Bblock EGAL(etat_de_subdivision_du_cube_courant,STOPPER_LA_SUBDIVISION_D_UN_CUBE); /* Introduit le 20180116101348 pour forcer le marquage d'un Cube "non terminal" et donc */ /* Stopper la subdivision... */ Eblock ECa4 Defo Bblock PRINT_ERREUR("un etat de subdivision de cube n'est pas reconnu"); CAL1(Prer2("(il s'agit de '%c' d'index %d)\n" ,etat_demande_de_subdivision ,index_du_cube_courant ) ); EGAL(etat_de_subdivision_du_cube_courant,VRAI); Eblock EDef Eblock ECho EGAL(SUBDIVISER_UN_CUBE(X,Y,Z,T),etat_de_subdivision_du_cube_courant); Test(IFLT(index_des_cubes,LSTX(PREMIER_CARACTERE,nombre_de_cubes_a_subdiviser))) /* Test introduit le 20171219102357 dans l'idee d'avoir des listes fonction du nombre */ /* d'iterations... */ Bblock INCR(index_des_cubes,I); Eblock ATes Bblock EGAL(index_des_cubes,PREMIER_CARACTERE); Eblock ETes Eblock end_hyper_albumQ(EDoD,EDoI,EDoI,EDoI) CALS(dAinitialisation(album_d_imagesR,niveau_du_fond)); CALS(GenerationDunCube(ADRESSE(origine_du_cube) ,ADRESSE(cote_du_cube) ,album_d_imagesR ,niveau_de_marquage_du_complement_de_l_eponge ,FAUX ,FAUX ,FAUX ,NIVEAU_UNDEF ,ADRESSE(rapport_d_homothetie_cumule) ,nombre_d_iterations ) ); /* Initialisation de l'album Resultat. On notera la modification du 20140916105438 due */ /* au fait que le cube (marque avec 'niveau_de_marquage_du_complement_de_l_eponge') peut */ /* etre plus petit que l'espace (marque avec 'niveau_du_fond')... */ CALS(GenerationDeLEpongeDeMenger(ADRESSE(origine_du_cube) ,ADRESSE(cote_du_cube) ,nombre_d_iterations ,album_d_imagesR ,niveau_de_marquage_de_l_eponge ,marquer_le_bord_X_de_l_eponge ,marquer_le_bord_Y_de_l_eponge ,marquer_le_bord_Z_de_l_eponge ,niveau_de_marquage_du_bord_de_l_eponge ,c_est_le_premier_cube_de_la_profondeur_courante ,ADRESSE(rapport_d_homothetie_cumule) ) ); /* On notera au passage que, par exemple, la premiere image de l'album est un tapis */ /* de Sierpinski... */ /* */ /* Le rapport d'homothetie cumule a ete introduit le 20171117173918... */ Test(IL_FAUT(generer_l_eponge_de_Menger)) /* Test introduit le 20140910084547... */ Bblock CALi(dAupdate_album(nom_imageR ,nom_postfixe ,premiere_image ,pas_des_images ,album_d_imagesR ,nombre_de_chiffres ,FAUX ) ); /* Sortie de l'eponge de Menger... */ Eblock ATes Bblock Test(IL_NE_FAUT_PAS(generer_l_ensemble_triadique_de_Cantor)) /* Test introduit le 20191204115436... */ Bblock CALS(Iupdate_image(nom_imageR,PAGE(album_d_imagesR,Zmin))); /* Sortie du tapis de Sierpinski (introduite le 20140910084547)... */ Eblock ATes Bblock BDEFV(image,ensemble_triadique_de_Cantor_1); BDEFV(image,ensemble_triadique_de_Cantor_2); BDEFV(image,ensemble_triadique_de_Cantor_3); BDEFV(image,ensemble_triadique_de_Cantor_4); DEFV(deltaF_2D,translation); CALi(Imove(ensemble_triadique_de_Cantor_1,PAGE(album_d_imagesR,Zmin))); INITIALISATION_ACCROISSEMENT_2D(translation,FZERO,NEUT(_____lNORMALISE_OY(dimY2))); CALi(Itranslation(ensemble_triadique_de_Cantor_2,ensemble_triadique_de_Cantor_1,ADRESSE(translation),FAUX,FAUX)); INITIALISATION_ACCROISSEMENT_2D(translation,FZERO,NEGA(_____lNORMALISE_OY(SOUS(dimY,pasY)))); CALi(Itranslation(ensemble_triadique_de_Cantor_3,ensemble_triadique_de_Cantor_2,ADRESSE(translation),FAUX,FAUX)); INITIALISATION_ACCROISSEMENT_2D(translation,FZERO,NEUT(_____lNORMALISE_OY(dimY2))); CALi(Itranslation(ensemble_triadique_de_Cantor_4,ensemble_triadique_de_Cantor_3,ADRESSE(translation),FAUX,FAUX)); CALS(Iupdate_image(nom_imageR,ensemble_triadique_de_Cantor_4)); EDEFV(image,ensemble_triadique_de_Cantor_4); EDEFV(image,ensemble_triadique_de_Cantor_3); EDEFV(image,ensemble_triadique_de_Cantor_2); EDEFV(image,ensemble_triadique_de_Cantor_1); Eblock ETes Eblock ETes FdTb4(selecteur_des_cubes_a_subdiviser ,NOMBRE_EFFECTIF_D_ITERATIONS ,NOMBRE_LINEAIRE_DE_CUBES_Z ,NOMBRE_LINEAIRE_DE_CUBES_Y ,NOMBRE_LINEAIRE_DE_CUBES_X ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); /* Introduit le 20171215150111 dans le but, ulterieurement, de selectionner les cubes */ /* a subdiviser... */ EDEFV(album,album_d_imagesR); /* Definition de l'album Resultat. */ Eblock end_nouveau_block Test(IL_FAUT(editer_le_nombre_de_tirages_aleatoires)) /* Test introduit le 20240619093425... */ Bblock CAL3(Prme1("NombreTirageAleatoires=%d\n",nombre_de_tirages_aleatoires)); Eblock ATes Bblock Eblock ETes lGENERATION_D_UN_FICHIER(liste_initiale_des_VALEURS_ALEATOIRES_PRE_CALCULEES,VALEURS_ALEATOIRES_PRE_CALCULEES_IMPLICITE); RETU_Commande; Eblock ECommande