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