/*************************************************************************************************************************************/ /* */ /* A U T O M A T E C E L L U L A I R E M O N O D I M E N S I O N N E L : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande genere une image */ /* dont le nom est le premier argument */ /* d'appel ; elle est le resultat de */ /* l'evolution de la premiere ligne de */ /* l'image Argument a l'aide de l'automate */ /* cellulaire monodimensionnel Argument. */ /* */ /* */ /* Author of '$xci/AutoC_1DQ.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20021002135359). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_IMAGESF_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... */ #include xci/substitue.01.I" /* Introduit le 20021005212108... */ #define FORCER_L_EXECUTION_EN_CAS_D_ERREUR_DE_LECTURE_DE_L_ALBUM_DE_L_AUTOMATE_CELLULAIRE \ FAUX \ /* Indicateur introduit le 20021004153954 qui permet d'executer le processus de l'automate */ \ /* cellulaire meme si l'album le definissant est incomplet, voire absent. */ #define VALEUR_PAR_DEFAUT_DE_L_AUTOMATE_CELLULAIRE \ BLANC \ /* Valeur a donner a l'automate cellulaire lorsque 'nom_imageP' est absent. */ #define PERTURBER_ALEATOIREMENT \ FAUX #define SEUIL_DE_PERTURBATION_ALEATOIRE \ PROBABILITE_NULLE /* Afin de pouvoir perturber aleatoirement l'automate cellulaire et ce de facon locale */ /* (introduit sous cette forme le 20081207170255). On notera que cette valeur est */ /* destinee a initialiser par defaut l'image 'champ_de_perturbation_aleatoire'... */ #define COMPATIBILITE_20081206 \ FAUX \ /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement */ \ /* au 20081206120905. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.02.I" /* Introduit le 20021005212108... */ #define champ_de_perturbation_aleatoire \ IFmageA /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A U T O M A T E C E L L U L A I R E M O N O D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageC),NOM_UNDEF)); /* Le 20081208110105 'NOM_UNDEF' a remplace 'NOM_PIPE' pour 'nom_imageC'... */ #include xci/substitue.03.I" /* Introduit le 20021005212108... */ DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a placer derriere <nom_imageC><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(forcer_l_execution_en_cas_d_erreur_de_lecture_de_l_album_de_l_automate_cellulaire ,FORCER_L_EXECUTION_EN_CAS_D_ERREUR_DE_LECTURE_DE_L_ALBUM_DE_L_AUTOMATE_CELLULAIRE ) ); /* Indicateur introduit le 20021004153954 qui permet d'executer le processus de l'automate */ /* cellulaire meme si l'album le definissant est incomplet, voire absent. */ DEFV(genere_p,INIT(valeur_par_defaut_de_l_automate_cellulaire,VALEUR_PAR_DEFAUT_DE_L_AUTOMATE_CELLULAIRE)); /* Valeur a donner a l'automate cellulaire lorsque 'nom_imageP' est absent. */ DEFV(Int,INIT(Ymin_de_l_automate_cellulaire_monodimensionnel,UNDEF)); DEFV(Int,INIT(Ymax_de_l_automate_cellulaire_monodimensionnel,UNDEF)); /* Definition des extrema de la coordonnee 'Y'. Evidemment, en general, il s'agira de */ /* {Ymin,Ymax} ; mais des valeurs differentes permettront de repartir d'un automate */ /* "partiel" anterieur et ainsi de changer la definition de 'automate_cellulaire' au cours */ /* de la generation. On pourra ainsi faire, par exemple, les 'N1' premieres lignes avec */ /* 'AUTOMATE1', puis les 'N2' lignes suivantes avec 'AUTOMATE2',... Ceci fut introduit le */ /* 20081013110147... */ DEFV(Logical,INIT(perturber_aleatoirement,PERTURBER_ALEATOIREMENT)); DEFV(Float,INIT(seuil_de_perturbation_aleatoire,SEUIL_DE_PERTURBATION_ALEATOIRE)); /* Afin de pouvoir perturber aleatoirement l'automate cellulaire et ce de facon locale */ /* (introduit sous cette forme le 20081207170255). On notera que cette valeur est */ /* destinee a initialiser par defaut l'image 'champ_de_perturbation_aleatoire'... */ DEFV(CHAR,INIC(POINTERc(nom_imageP),NOM_UNDEF)); /* On notera que lorsque 'nom_imageP' n'est pas specifie explicitement, c'est alors la */ /* valeur de 'seuil_de_perturbation_aleatoire' qui permet de proceder a l'initialisation */ /* de 'champ_de_perturbation_aleatoire'... */ DEFV(Logical,INIT(compatibilite_20081206,COMPATIBILITE_20081206)); /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement */ /* au 20081206120905. */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20081206=",compatibilite_20081206); GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageC=""automate=""C=",nom_imageC); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("imageP=""P=",nom_imageP); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENTS2_I("pas=",pas_des_images,pasZ); /* L'argument 'pasZ' fut introduit le 20110119140223... */ GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_L("forcer=",forcer_l_execution_en_cas_d_erreur_de_lecture_de_l_album_de_l_automate_cellulaire); GET_ARGUMENT_P("vd=""defaut=",valeur_par_defaut_de_l_automate_cellulaire); GET_ARGUMENT_P("vb=""bord=",Iautomate_cellulaire_monodimensionnel_____niveau_hors_processus); GET_ARGUMENT_I("N_voisins=""Nv=",Iautomate_cellulaire_monodimensionnel_____N_voisins); /* Parametres introduits le 20081125184932... */ GET_ARGUMENT_L("periodiser_X=""per_X=",Iautomate_cellulaire_monodimensionnel_____periodiser_X); GET_ARGUMENT_L("symetriser_X=""sym_X=",Iautomate_cellulaire_monodimensionnel_____symetriser_X); GET_ARGUMENT_L("prolonger_X=""pro_X=",Iautomate_cellulaire_monodimensionnel_____prolonger_X); /* Parametres introduits le 20081121181745... */ GET_ARGUMENT_L("editer_les_messages_de_hors_image=""editer_messages=" ,Iautomate_cellulaire_monodimensionnel_____editer_les_messages_de_hors_image ); /* Parametres introduits le 20081118135755... */ GET_ARGUMENT_C("substitution=""s=",nom_substitution); GET_ARGUMENT_C("paletteA=""palette=""pA=""p=",nom_paletteA); /* Parametres mis ici le 20021002135359 en supprimant {seuil_bas,seuil_haut}... */ GET_ARGUMENT_L("perturber_aleatoirement=""aleatoire=""pa=",perturber_aleatoirement); GET_ARGUMENT_F("seuil_de_perturbation_aleatoire=""seuil=""spa=",seuil_de_perturbation_aleatoire); GET_ARGUMENT_I("graine=""g=" ,Iautomate_cellulaire_monodimensionnel_____graine_de_perturbation_aleatoire ); GET_ARGUMENT_I("graine_Gauche=""gG=""gg=" ,Iautomate_cellulaire_monodimensionnel_____graine_du_niveau_du_point_Gauche__anterieur ); GET_ARGUMENT_I("graine_Droite=""gD=""gd=" ,Iautomate_cellulaire_monodimensionnel_____graine_du_niveau_du_point_Droite__anterieur ); /* Parametres introduits le 20081205172947... */ GIT_ARGUMENT_I("YminA=""Ym=",Ymin_de_l_automate_cellulaire_monodimensionnel,Ymin); GIT_ARGUMENT_I("YmaxA=""YM=",Ymax_de_l_automate_cellulaire_monodimensionnel,Ymax); /* Parametres introduits le 20081013110147... */ ) ); CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA)))) /* Chargement de la premiere image Argument. */ Bblock DEFV(automate_cellulaire_monodimensionnel,automate_cellulaire); /* Automate cellulaire... */ Test(IL_NE_FAUT_PAS(compatibilite_20081206)) /* Test introduit le 20081206120905... */ Bblock #include xci/substitue.05.I" /* Introduit le 20021005212108. Le 20081206092901 '$xci/substitue.04$I', reference par */ /* erreur (lors d'une introduction quasi-automatique des ces "include"s dans differents */ /* '$K's), a ete remplace par '$xci/substitue.05$I'. D'ailleurs, a cette date, je ne */ /* comprends toujours pas a quoi ces "include"s servaient avant le 20081205180232... */ /* */ /* Le 20081206093712, l'experience consistant a recalculer l'image 'v $xiird/AC1C.B1' a ete */ /* faite en ajoutant les parametres : */ /* */ /* substitution=L_SUBSTITUTION_ROUGE */ /* p=$xiP/binaire.01 */ /* */ /* cette image ayant ete choisie parce qu'elle est complexe et qu'elle utilise tous les */ /* niveaux de gris. Le resultat a ete sans appel : l'image calculee ainsi etait strictement */ /* identique a 'v $xiird/AC1C.B1' alors qu'avec '$xci/substitue.04$I' l'image ainsi calculee */ /* etait "binaire" (NOIR et BLANC) et ce a cause de '$xiii/di_image$FON iMOVE.evolution_a' */ /* situe a l'entree de la fonction 'Iautomate_cellulaire_monodimensionnel(...) ; je ne */ /* comprends toujours pas l'interet de faire appel a 'Nsubstitution(...)' a l'entree de */ /* cette fonction. Malgre tout 'v $Dhistory/lact14$D/20021007101007 20021005212727' montre */ /* que des tests ont ete fait dans ce sens. En conclusion ces "include"s semblent avoir ete */ /* inutiles avant cette date (mais pourquoi donc les avoir introduits le 20021005212108, */ /* soit trois jours seulement apres la creation de 'v $xci/AutoC_1DQ.01$K 20021002135359 ?). */ /* */ /* Malgre tout, le 20081206120905, j'ai introduit 'compatibilite_20081206' car, en effet, */ /* on ne sait jamais... */ EGAL(Iautomate_cellulaire_monodimensionnel_____num_liste_de_substitution,substitution_courante); /* Introduit le 20081205180232 en notant bien que je ne comprends pas a quoi servaient, */ /* avant cette date, l'ensemble des : */ /* */ /* #include xci/substitue.0?.I" */ /* */ /* (voir a ce propos les remarques du 20081206093712 ci-dessus). */ /* */ /* Donc a cette date, je les utilise pour acceder pleinement a la perturbation aleatoire */ /* des automates cellulaires ('v $xiii/di_image$FON 20081205162240')... */ Eblock ATes Bblock #include xci/substitue.04.I" Test(IL_FAUT(perturber_aleatoirement)) Bblock PRINT_ATTENTION("en mode 'compatibilite_20081206', l'automate cellulaire ne peut etre pertube aleatoirement"); EGAL(perturber_aleatoirement,FAUX); /* Dans le cas ou la compatibilite anterieure au 20081206120905 est demandee, la */ /* perturbation aleatoire de l'automate cellulaire est a priori desactivee... */ Eblock ATes Bblock Eblock ETes Eblock ETes Test(IL_FAUT(perturber_aleatoirement)) Bblock CALi(IFinitialisation(champ_de_perturbation_aleatoire,seuil_de_perturbation_aleatoire)); /* A priori (et en particulier au cas ou il y aurait une erreur dans 'IloadF_image(...)'). */ Test(IFNE_chaine(nom_imageP,NOM_UNDEF)) /* On notera que lorsque 'nom_imageP' n'est pas specifie explicitement, c'est alors la */ /* valeur de 'seuil_de_perturbation_aleatoire' qui permet de proceder a l'initialisation */ /* de 'champ_de_perturbation_aleatoire'... */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(champ_de_perturbation_aleatoire,nom_imageP)))) Bblock Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes PUSH_DIMENSIONS_3D; SET_DIMENSIONS_3D_SANS_VALIDATION(NIVR(NOIR),NIVR(BLANC) ,NIVR(NOIR),NIVR(BLANC) ,NIVR(NOIR),NIVR(BLANC) ); /* L'automate cellulaire est une suite d'images de dimension COULEURSxCOULEURSxCOULEURS. */ begin_nouveau_block Bblock BDEFV(album,album_de_l_automate_cellulaire); /* Definition de l'album d'images contenant la definition de l'automate cellulaire. */ Test(IFNE_chaine(nom_imageC,NOM_UNDEF)) Bblock CALi(dAload_album(album_de_l_automate_cellulaire ,nom_imageC ,nom_postfixe ,premiere_image ,pas_des_images ,nombre_de_chiffres ,FAUX ,UNDEF ,FAUX ) ); /* Chargement de l'album Argument. */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20091125132923... */ INITIALISATION_QUELCONQUE_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire ,Aload_point_valide(album_de_l_automate_cellulaire ,COXA(NIVR(point_a_droite)) ,COYA(NIVR(point_a_gauche)) ,COZA(NIVR(point__courant)) ) ); /* Et initialisation de l'automate cellulaire... */ Eblock ATes Bblock INITIALISATION_QUELCONQUE_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire ,valeur_par_defaut_de_l_automate_cellulaire ); Eblock ETes EDEFV(album,album_de_l_automate_cellulaire); /* Definition de l'album d'images contenant la definition de l'automate cellulaire. */ Eblock end_nouveau_block PULL_DIMENSIONS_3D; /* Restauration des dimensions de travail... */ Test(IFOU(PAS_D_ERREUR(CODE_ERREUR) ,IFET(IL_Y_A_ERREUR(CODE_ERREUR) ,IL_FAUT(forcer_l_execution_en_cas_d_erreur_de_lecture_de_l_album_de_l_automate_cellulaire) ) ) ) /* Le 'IL_FAUT(forcer_l_execution...)' a ete introduit le 20021004153954 dans le 'Test(...)' */ /* afin de permettre l'utilisation d'albums incomplets, ce qui peut etre tres utile lorsque */ /* des automates binaires ({NOIR,BLANC} par exemple) sont utilises, puisqu'alors seules */ /* deux pages de l'album complet sont utiles... */ Bblock CALS(Iautomate_cellulaire_monodimensionnel(ImageR ,ImageA ,automate_cellulaire ,Ymin_de_l_automate_cellulaire_monodimensionnel ,Ymax_de_l_automate_cellulaire_monodimensionnel ,perturber_aleatoirement ,champ_de_perturbation_aleatoire ) ); /* Evolution de 'ImageA' suivant l'automate cellulaire 'automate_cellulaire'... */ /* */ /* On rappelle qu'un automate cellulaire est une table de multiplication tridimensionnelle */ /* ou il est fait l'usage suivant des trois coordonnees : */ /* */ /* point_a_gauche --> Y */ /* point__courant --> Z */ /* point_a_droite --> X */ /* */ /* soit encore : */ /* */ /* X --> point_a_droite */ /* Y --> point_a_gauche */ /* Z --> point__courant */ /* */ CALi(Iupdate_image(nom_imageR,ImageR)); #include xci/substitue.06.I" /* Puis on desactive (introduit le 20081004191008...). */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande