/*************************************************************************************************************************************/ /* */ /* C O N S T R U C T I O N D ' U N E F I G U R E D E D I F F R A C T I O N */ /* A V E C C O M P T A G E D E S E V E N E M E N T S : */ /* */ /* */ /* Par deux fentes (pX=1 et pY=0) : */ /* */ /* */ /* . */ /* . .- . . o */ /* . :::.: - :.. . .: : .-+ + +*-.: ...*.+. */ /* .: o .:::-*+o+:..:.. -#o . - .:.-+. -:+ oo+...-+. :. *.: -..-..o */ /* +. .o:# :-..-:+.+:-. :+:-..+*-+-.::++..#-.:.:.-- *+o...+.:.- . */ /* :*.o..* ...+.o: +::#.+ .*.o.#-oo++ +*:-:*#**.:-*+##..:-o .-.:--. */ /* * .... .+.:o #:..#-o--**o- +#. .- o.++ +. : ..+-. + .:#*:.:.. */ /* . .+.o+-*. +#: .:- : ..- .-.o-o.# .:* :o. * + -: . oo */ /* - .# + - * . # o : .. */ /* +. : */ /* .-. .#. o: -. -#.o +.-:#. .: .. ... + -- .. */ /* o .: : . :: ::.: ..*# :* .*- *oo##+..+::o.*#.o-#.+*o :+o++:o */ /* :..- -.:oo**-*+...*.-..*:#+::+--.:-oo *#.+:o.- o .o..+.:o.::..: */ /* -..:.+o--.+...-#++:+.*.*+#:#o*.o.:#+*:*+.*o+#*#.:.:#*+o.-.o:.:.: */ /* :..#- +.:-*...#.-...#o.-oo.:.. o##-o# :o--#o #::.. #-+. -: :::.- */ /* ..o o-:... o ++-.o:# +++#*- **o *. .. :-.* -+ # *..- :. :: */ /* . + . # . o .: # #.: ** +.- * o : . o- o.. . */ /* */ /* . . .- o .. o. . - + :. */ /* - .# -- .-- .oo.##-+ .o * *#.# o+-:+ #. -o.:-#oo.**: */ /* -.#.-++ **:*# .##::o.:+.* :-. .. +--o +*o++ :-. . -o++:. .- */ /* -.-#.:.o::o .o-::oo.-.:.+.-*+*#.:o.++#o.::.*o*..-#...o..- :.:.-. */ /* #.+..- .:+..#...:*. --.+*..#*o+ .::+#. .*+. oo##.*-+-+. .o.:++: */ /* .: o--.: +..+o :-::- ::..-: .o-#+* ..:..::-+- :.-:.-+ :.- */ /* o:.: .o. . : :+. #. #+...- . - - .... */ /* : . */ /* .o .- . . .: - + . */ /* :o:.:.o +- - :: .. . -o*: oooo.+ :.: + .-*oo:-o..* .. */ /* # :..:.-:+ .:# +*- :+ o+ .o:-- *.:*..#.*.++ +.:.-oo.-.o.o.:...# */ /* .+: o::..:+o .:.+.***-.::-...-o+#o .: +*.*++*..-.+ #..o :.:- */ /* :......:+:.--.*. : -.++ **:.:o.-. o* o-:oo+-...:+o:-. -::::.+.o */ /* ..-#-+-..:+o*- . *.-:#... -:**:+.:.:.:-+.. *o.+..#:.+# ..+.:.*.- */ /* */ /* */ /* Par un reseau cubique (pX=0 et pY=0) : */ /* */ /* */ /* .-.. .:: .: . ..-: . +* . +- *.. */ /* .-.oo ..-.-+.* ..+...o--. *- .:o:.-.:. .:..-. o+::. */ /* ..:..+*:..+* : o-::-. ::. . --ooo . -o+ :.-o + */ /* o .:::-+ o. .. o #.*o.-o. : :-.+ oo+.... *.++-..-. */ /* ..# .-. - :+:o: . :+...--.:.:.: +... .:. */ /* o.. .+ o :o .*. .: #* . . -...: */ /* . .. o o .: *. */ /* . .. */ /* . o.- #. * :. . . .-. . .:. ..o */ /* -.*. ..- .+ :.+.::*:. --.o+:*-. #+#oo.o */ /* ..: -:. - -+..+# :.+#*.: .-. +. ++-.o. */ /* ::.-+#.#::. : +.*##:.-o. : *-#*#.:-:o.: *oo ::o++-. */ /* : .- -.:oo**:o .*.o..o:#+ ++.+ *#. :..- # .+.:o.::.. */ /* . :.+.- . . .+:+.*.*+# # # *. +.*o+:+ *: -..:.:.. */ /* ..#+ # .. # o. #o #. #.* . . */ /* . */ /* . . .+ .. :..# .. -+. .:: * : . */ /* .o * .-o o o o-*-## . # - . *:- * # . oo+o.:: : */ /* : +.o.--..- o.-.**-: -..o+.*# - -+ : * : */ /* . .*o-- .. : :#++..+ * + #..o*- o ::-#oo.+:. */ /* ..-- *o.* #.o.:+.* :-. : + +*o+. o+ :. : */ /* . .:.o::o + o .-.:.+ .* +#+.::. o* :o. - :.:. */ /* .... :+ .# -* . # .::.#. + o. . .: : */ /* : .o */ /* : . # + . : */ /* o.. - - o +. ::* *. . + .. # # #o --: */ /* :.+.:-:*** .. :+-*+. .:. .. . +#*: . - - . .:*#. */ /* : : .*.+. .+.. .. o.: #.. ..-++.+.- *- .. : :+:.*-. */ /* -:....-:+ - . .-. :+ +: *.-#.*.+* .. -...o.o: --* */ /* + #+* .:o +.** -.::-.. . .: *.*++* #. * : - */ /* . . . :.* : - + ** .: . :oo+..: *. .. ::+. */ /* .* . ...o . . */ /* */ /* */ /* Author of '$xrq/diffract.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1993??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CPP_____MODULE_NON_DERIVABLE @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.11.I" #include xrv/particule.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F O N C T I O N S U T I L E S ( C O M P A T I B I L I T E ) : */ /* */ /*************************************************************************************************************************************/ #define hXmin_ESPACE \ PARE(0.0) #define hYmin_ESPACE \ PARE(0.0) #define hZmin_ESPACE \ PARE(0.0) #define hXmax_ESPACE \ PARE(1.0) #define hYmax_ESPACE \ PARE(1.0) #define hZmax_ESPACE \ PARE(1.0) /* Inutile, mais pour la compatibilite... */ #define dXmin_ESPACE \ PARE(0.00) #define dYmin_ESPACE \ PARE(0.00) #define dZmin_ESPACE \ PARE(0.00) #define dXmax_ESPACE \ PARE(1.00) #define dYmax_ESPACE \ PARE(1.00) #define dZmax_ESPACE \ PARE(1.00) /* Inutile, mais pour la compatibilite... */ #include xrk/attractor.12.I" #include xrs/surfaces.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A C O N S T R U C T I O N D ' U N E F I G U R E D E D I F F R A C T I O N : */ /* */ /* */ /* Definition : */ /* */ /* Elle est definie par accumulation */ /* de points dont les coordonnees sont */ /* calculees de la facon suivante : */ /* */ /* X = aleatoire dans [hXmin_ESPACE,hXmax_ESPACE] suivant une loi de probabilite donnee, */ /* Y = aleatoire dans [hYmin_ESPACE,hYmax_ESPACE] suivant une loi de probabilite donnee, */ /* Z = Zcentre_espace. */ /* */ /* La loi de probabilite est soit uniforme */ /* (par exemple le long de 'OX' afin de voir */ /* apparaitre des bandes horizontales), soit */ /* "sinusoidale" ; pour ce faire, le long de */ /* l'axe sur lequel cette loi est utilisee, la */ /* fonction suivante : */ /* */ /* 2 */ /* [ sin(N.t) ] */ /* S(t) = [----------] */ /* [ sin(t) ] */ /* */ /* est evaluee (ou 'N' represente le parametre */ /* 'resserrement_de_la_probabilite'). On notera */ /* que pour les petites valeurs de 't' : */ /* */ /* 2 2 */ /* [ sin(N.t) ] [ N.t ] 2 */ /* [----------] ~ [-----] = N */ /* [ sin(t) ] [ t ] */ /* */ /* d'ou : */ /* */ /* 2 */ /* lim[S(t)] = N */ /* t --> 0 */ /* */ /* cette valeur 'N' est utilisee a priori comme */ /* valeur maximale de la fonction 'S(...)' pour */ /* la renormaliser dans [0,1]. */ /* */ /* */ /*************************************************************************************************************************************/ dfTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,fichier_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE,NOMBRE_D_ITERATIONS) /* Definition du fichier des nombres d'iterations. */ #define sNOMBRE_D_ITERATIONS(numero_de_la_periode) \ INTE(sTRANSFORMAT_31(numero_de_la_periode,liste_NOMBRE_D_ITERATIONS)) \ /* Formule generale definissant les variations du nombre d'iterations. */ #define PULSATION \ GRO16(FU) #define PHASE \ FZERO DEFV(Local,DEFV(Float,INIT(pulsation,PULSATION))); DEFV(Local,DEFV(Float,INIT(phase,PHASE))); /* Definition de la valeur de la pulsation et de la phase du generateur aleatoire le long */ /* de l'axe 'OY' au cours du temps. */ #define PRENDRE_UNE_DYNAMIQUE_LOGARITHMIQUE \ FAUX DEFV(Local,DEFV(Logical,INIT(prendre_une_dynamique_logarithmique,PRENDRE_UNE_DYNAMIQUE_LOGARITHMIQUE))); /* Faut-il prendre une dynamique logarithmique ('VRAI') ou laisser la comptabilisation des */ /* collisions telle qu'elle a ete calculee ('FAUX') ? */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */ /* */ /*************************************************************************************************************************************/ dfTRANSFORMAT_31(liste_PULSATION,fichier_PULSATION,PULSATION_IMPLICITE,PULSATION) dfTRANSFORMAT_31(liste_PHASE,fichier_PHASE,PHASE_IMPLICITE,PHASE) /* Definition des fichiers de la pulsation et de la phase du generateur aleatoire le long */ /* de l'axe 'OY'. */ #define sPULSATION(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PULSATION)) #define sPHASE(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PHASE)) /* Formule generale definissant les variations de la pulsation et de la phase du generateur */ /* aleatoire le long de l'axe 'OY' au cours du temps. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S L O I S D E P R O B A B I L I T E : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LC.I" #define PONDERATION_DE_LA_PROBABILITE_LE_LONG_DE_OX \ EVENEMENT_CERTAIN #define PONDERATION_DE_LA_PROBABILITE_LE_LONG_DE_OY \ EVENEMENT_IMPOSSIBLE DEFV(Local,DEFV(Float,INIT(ponderation_de_la_probabilite_le_long_de_OX,PONDERATION_DE_LA_PROBABILITE_LE_LONG_DE_OX))); DEFV(Local,DEFV(Float,INIT(ponderation_de_la_probabilite_le_long_de_OY,PONDERATION_DE_LA_PROBABILITE_LE_LONG_DE_OY))); /* La valeur 'EVENEMENT_CERTAIN' permet d'ignorer les probabilites le long de l'axe */ /* correspondant, alors que 'EVENEMENT_IMPOSSIBLE' les prend en compte... */ #define RESSERREMENT_DE_LA_PROBABILITE \ FDEUX DEFV(Local,DEFV(Float,INIT(resserrement_de_la_probabilite,RESSERREMENT_DE_LA_PROBABILITE))); /* Constante permettant de definir la largeur des pics de fortes probabilites... */ #define ANGLE(coordonnee) \ AXPB(pulsation,coordonnee,phase) \ /* Passge d'une coordonnee a un angle... */ #define PROBABILITE_LE_LONG_D_UN_AXE(coordonnee,ponderation) \ MAX2(ponderation \ ,COND(IZNE(ANGLE(coordonnee)) \ ,EXP2(DIVI(SINX(MUL2(resserrement_de_la_probabilite,ANGLE(coordonnee))) \ ,MUL2(resserrement_de_la_probabilite,SINX(ANGLE(coordonnee))) \ ) \ ) \ ,FU \ ) \ ) \ /* Calcul d'une probabilite le long d'un axe... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R D E S R A I S O N S D E C O M P A T I B I L I T E : */ /* */ /*************************************************************************************************************************************/ #include xrk/integr.1B.vv.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.18.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A C O N V O L U T I O N D ' A N T I - A L I A S I N G : */ /* */ /*************************************************************************************************************************************/ /* Nota : la plupart de ces donnees sont empruntees a la commande 'v $xci/bouche_trou$K'. */ #define CONVOLUER_LES_IMAGES \ FAUX DEFV(Local,DEFV(Logical,INIT(convoluer_les_images,CONVOLUER_LES_IMAGES))); /* Faut-il convoluer les images ('VRAI') afin de les rendre plus visibles, les points etant */ /* alors materialises par des taches "anti-aliasees" suivant le facteur multiplicatif */ /* applique ou pas ('FAUX')... */ #define RAYON_D_ETALEMENT_DES_PARTICULES \ TROIS DEFV(Local,DEFV(Int,INIT(rayon_d_etalement_des_particules,RAYON_D_ETALEMENT_DES_PARTICULES))); /* Rayon entier d'etalement des particules... */ #define ATTENUATION_D_ETALEMENT_AU_BORD_DES_PARTICULES \ GRO5(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(attenuation_d_etalement_au_bord_des_particules,ATTENUATION_D_ETALEMENT_AU_BORD_DES_PARTICULES))); /* Le niveau de marquage n'est pas attenue au centre, et l'est au bord d'un facteur egal */ /* a 'attenuation_d_etalement_au_bord_des_particules'. */ #define NIVEAU_DES_TROUS \ NOIR \ /* Niveau caracterisant les trous. */ /* Nota : 'NOMBRE_DE_POINTS_DU_NOYAU' et 'nombre_de_points' sont deja definis dans */ /* 'v $xrv/champs_5.16$I'. On notera qu'il est impossible de lui faire subir un 'undef' */ /* pour le redefinir en fonction de 'rayon_d_etalement_des_particules' a cause de la */ /* derivation formelle... */ DEFV(Local,DEFV(Logical,DTb1(niveaux_a_epaissir,COULEURS))); /* Definit ainsi pour chaque point courant si son voisinnage est a epaissir ('VRAI') */ /* ou pas ('FAUX'). */ DEFV(Local,DEFV(Logical,DTb1(niveaux_epaississables,COULEURS))); /* Definit ainsi pour chaque point d'une spirale s'il est epaississable ('VRAI') */ /* ou pas ('FAUX'), et ce lorsqu'il est dans le voisinnage d'un point "a epaissir"... */ DEFV(Local,DEFV(Float,DTb1(noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION))); /* Noyau de la convolution, */ DEFV(Local,DEFV(Logical,DTb1(inhibition_du_noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION))); /* Et sa liste d'activite. */ DEFV(Local,DEFV(Int,INIT(index,UNDEF))); /* Index d'initialisation du noyau. */ #define REDUCTION_DES_CCORDONNEES(coordonnee) \ COND(IL_NE_FAUT_PAS(convoluer_les_images) \ ,coordonnee \ ,MULD(coordonnee,DOUB(PRED(rayon_d_etalement_des_particules))) \ ) \ /* Fonction de mise des coordonnees sur un reseau orthogonal dont le pas est le double */ \ /* du rayon d'etalement (si cela est demande bien entendu...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T I O N D ' U N E F I G U R E D E D I F F R A C T I O N : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); /* Nom de la sequence d'images a generer. */ DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF)); /* Nom courant des images. */ /*..............................................................................................................................*/ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ iTRANSFORMAT_31(liste_PULSATION,PULSATION_IMPLICITE); iTRANSFORMAT_31(liste_PHASE,PHASE_IMPLICITE); /* Initialisation de la pulsation et de la phase du generateur aleatoire le long de l'axe */ /* 'OY'. */ iTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE); /* Initialisation du nombre d'iterations. */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES; PROCESS_ARGUMENT_FICHIER("PULSATION=" ,fichier_PULSATION ,liste_PULSATION ,PULSATION_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PHASE=" ,fichier_PHASE ,liste_PHASE ,PHASE_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("NOMBRE_D_ITERATIONS=" ,fichier_NOMBRE_D_ITERATIONS ,liste_NOMBRE_D_ITERATIONS ,NOMBRE_D_ITERATIONS_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENTS_DE_VISUALISATION; GET_ARGUMENT_I("n=""iterations=",nombre_d_iterations); GET_ARGUMENT_I("graine=",graine_du_generateur_d_evenements); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_F("resserrement=",resserrement_de_la_probabilite); GET_ARGUMENT_F("ponderation_OX=""pX=",ponderation_de_la_probabilite_le_long_de_OX); GET_ARGUMENT_F("ponderation_OY=""pY=",ponderation_de_la_probabilite_le_long_de_OY); GET_ARGUMENT_L("logarithmique=""log=",prendre_une_dynamique_logarithmique); GET_ARGUMENT_L("trous=""convolution=",convoluer_les_images); GET_ARGUMENT_I("etalement=",rayon_d_etalement_des_particules); GET_ARGUMENT_F("attenuation=",attenuation_d_etalement_au_bord_des_particules); ) ); #include xrq/synapse.11.I" begin_nouveau_block Bblock DONNEES_DE_RECHERCHE_DES_EXTREMA_GLOBAUX_D_UNE_SEQUENCE_D_IMAGES; /* Extrema globaux de l'ensemble de la sequence... */ BDEFV(imageF,figure_de_diffraction); /* Image flottante dans laquelle on trouve la figure de diffraction avant renormalisation. */ Test(IL_FAUT(convoluer_les_images)) Bblock EGAL(nombre_de_points,EXP2(DOUP(rayon_d_etalement_des_particules))); /* Calcul du nombre de points necessaires pour avoir un noyau de rayon donne... */ Test(IFLE(nombre_de_points,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION)) Bblock Eblock ATes Bblock PRINT_ERREUR("la taille demandee pour le noyau de convolution est incompatible avec les definitions"); EGAL(nombre_de_points,NOMBRE_DE_POINTS_DU_NOYAU); CAL1(Prer1("(la valeur %d par defaut est forcee)\n",nombre_de_points)); /* Introduit le 20111031142053 car, en effet, manquait cruellement... */ Eblock ETes BoIn(niveau,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ITb1(niveaux_a_epaissir,INDX(niveau,NOIR)),VRAI); EGAL(ITb1(niveaux_epaississables,INDX(niveau,NOIR)),FAUX); /* Initialisation telle que tous les niveaux soient "epaississables", */ Eblock EBoI EGAL(ITb1(niveaux_a_epaissir,INDX(NIVEAU_DES_TROUS,NOIR)),FAUX); EGAL(ITb1(niveaux_epaississables,INDX(NIVEAU_DES_TROUS,NOIR)),VRAI); /* Puis caracterisation des trous : c'est la ou se fera l'epaississement (afin de faire */ /* de l'anti-aliasing...). */ DoIn(index,PREMIER_POINT,LSTX(PREMIER_POINT,MIN2(nombre_de_points,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION)),I) Bblock DEFV(Float,INIT(distance_au_centre,FLOT__UNDEF)); /* Distance du point courant au centre... */ DEFV(Int,INIT(X,UNDEF)); DEFV(Int,INIT(Y,UNDEF)); EGAL(X,SPIRALE_X(index,Pconvolution_____nombre_de_points_sautes)); EGAL(Y,SPIRALE_Y(index,Pconvolution_____nombre_de_points_sautes)); /* Definition des coordonnees {X,Y} du point courant relativement au centre de la spirale, */ /* qui s'appelle (Xcentre_SPIRALE,Ycentre_SPIRALE)... */ EGAL(distance_au_centre,RdisI2D(X,Y,Xcentre_SPIRALE,Ycentre_SPIRALE)); /* Distance du point courant au centre... */ EGAL(ITb1(noyau,INDX(index,PREMIER_POINT)) ,BARY(FU ,attenuation_d_etalement_au_bord_des_particules ,DIVI(distance_au_centre ,FLOT(rayon_d_etalement_des_particules) ) ) ); /* Initialisation du noyau avec une valeur proportionnel a la distance au bord (et ne */ /* valant pas 0 sur ce meme bord...). */ Test(IFLE(distance_au_centre,FLOT(rayon_d_etalement_des_particules))) /* Le nombre de points du noyau (soit 'N') donne la surface du carre representant le noyau */ /* de convolution. La moitie de sa racine carre est donc le rayon du cercle inscrit dans le */ /* noyau carre, qui definit donc le noyau circulaire. */ Bblock EGAL(ITb1(inhibition_du_noyau,INDX(index,PREMIER_POINT)),ACTIF); /* Lorsque le noyau de convolution est circulaire, on ne prend que les points qui sont */ /* situes dans le cercle inscrit a l'interieur du noyau carre... */ Eblock ATes Bblock EGAL(ITb1(inhibition_du_noyau,INDX(index,PREMIER_POINT)),INACTIF); /* Lorsque le noyau de convolution est circulaire, on exclue les points qui sont situes a */ /* l'exterieur du cercle inscrit a l'interieur du noyau carre... */ Eblock ETes Eblock EDoI Eblock ATes Bblock Eblock ETes CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock DONNEES_DE_RECHERCHE_DES_EXTREMA_LOCAUX_D_UNE_SEQUENCE_D_IMAGES; /* Extrema locaux de la sequence... */ CALi(IFinitialisation(figure_de_diffraction,FZERO)); /* Initialisation de la figure de diffraction (qui comptera les evenements)... */ FORCAGE_DE_LA_REINITIALISATION_DU_GENERATEUR_D_EVENEMENTS; /* Afin de forcer la (re-)initialisation du generateur d'evenements afin de garantir la */ /* "continuite" entre les differentes images... */ EGAL(pulsation,sPULSATION(numero_de_la_periode_courante)); EGAL(phase,sPHASE(numero_de_la_periode_courante)); /* Calcul de la valeur de la pulsation et de la phase du generateur aleatoire le long de */ /* l'axe 'OY'. */ vTRANSFORMAT_31(nombre_d_iterations ,sNOMBRE_D_ITERATIONS,numero_de_la_periode_courante,fichier_NOMBRE_D_ITERATIONS ); /* Calcul du nombre d'iterations lorsqu'il est variable. */ Komp(numero_de_l_iteration_courante,nombre_d_iterations) Bblock DEFV(Logical,INIT(une_particule_a_ete_creee,FAUX)); /* Cet indicateur permet de savoir si une particule a ete creee ou pas... */ Tant(EST_FAUX(une_particule_a_ete_creee)) Bblock DEFV(Float,INIT(probabilite,FLOT__UNDEF)); /* Pour generer une valeur aleatoire. */ DEFV(Int,INIT(X,UNDEF)); DEFV(Int,INIT(Y,UNDEF)); GENERATION_D_UNE_VALEUR(X,NEUT(FLOT(Xmin)),SUCC(FLOT(Xmax))); GENERATION_D_UNE_VALEUR(Y,NEUT(FLOT(Ymin)),SUCC(FLOT(Ymax))); /* Generation d'un point completement aleatoire dans le plan (OX,OY). On notera la fonction */ /* 'SUCC(...)' portant sur les bornes superieures, et destinee a garantir que cette borne */ /* superieure soit atteinte pour les valeurs entieres (puisque 'X' et 'Y' le sont), car en */ /* effet, sinon, elle sera "frolee" par valeur inferieure, et donc jamais atteinte apres la */ /* prise de la partie entiere... */ GENERATION_D_UNE_PROBABILITE_01(probabilite); /* Generation d'une valeur aleatoire. */ Test(IFET(IFLE(probabilite ,PROBABILITE_LE_LONG_D_UN_AXE(_____cNORMALISE_OX(X) ,ponderation_de_la_probabilite_le_long_de_OX ) ) ,IFLE(probabilite ,PROBABILITE_LE_LONG_D_UN_AXE(_____cNORMALISE_OY(Y) ,ponderation_de_la_probabilite_le_long_de_OY ) ) ) ) Bblock DEFV(Int,INIT(X_reduit,REDUCTION_DES_CCORDONNEES(X))); DEFV(Int,INIT(Y_reduit,REDUCTION_DES_CCORDONNEES(Y))); /* Coordonnees d'acces a 'figure_de_diffraction'... */ storeF_point_valide(ADD2(loadF_point_valide(figure_de_diffraction,X_reduit,Y_reduit),FU) ,figure_de_diffraction ,X_reduit,Y_reduit ); /* Comptage de l'evenement courant. On notera l'utilisation des fonction '..._valide(...)' */ /* destinee au cas ou une coordonnee 'X' ou 'Y atteindrait la valeur 'SUCC(Xmax)' ou */ /* 'SUCC(Ymax)' respectivement (voir 'GENERATION_D_UNE_VALEUR(...)'). */ EGAL(une_particule_a_ete_creee,VRAI); /* Cet indicateur permet de savoir qu'une particule vient d'etre creee. */ Eblock ATes Bblock Eblock ETes Eblock ETan Eblock EKom Test(IL_FAUT(prendre_une_dynamique_logarithmique)) Bblock CALS(IFdynamique_logarithmique_sans_translation_dynamique(figure_de_diffraction ,figure_de_diffraction ,FZERO ) ); /* S'il le faut, la dynamique de la figure de diffraction est reduite par application */ /* d'une fonction logarithme ce qui permet de la "lisser" en attenuant l'effet, lors de */ /* la renormalisation, de points ou regne une forte concentration de collisions... */ Eblock ATes Bblock Eblock ETes RECHERCHE_DES_EXTREMA_D_UNE_SEQUENCE_D_IMAGES(figure_de_diffraction); /* Recherche des extrema locaux et globaux de l'ensemble de la sequence... */ EGAL(nom_image ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,ChaineNumero(numero_de_la_periode_courante ,NOMBRE_DE_CHIFFRES ) ) ); /* Le 20080602134901 fut introduit 'ChaineNumero(...)' afin de pouvoir parametrer */ /* aisement le nombre de chiffres des numeros... */ CALi(IupdateF_image(nom_image,figure_de_diffraction)); /* Sauvegarde du champ sans renormalisation... */ CALZ_FreCC(nom_image); INCR(numero_de_la_periode_courante,I); /* Et passage a l'image suivante... */ Eblock EKom EGAL(numero_de_la_periode_courante,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION); /* Reinitialisation... */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock EGAL(nom_image ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,ChaineNumero(numero_de_la_periode_courante ,NOMBRE_DE_CHIFFRES ) ) ); /* Le 20080602134901 fut introduit 'ChaineNumero(...)' afin de pouvoir parametrer */ /* aisement le nombre de chiffres des numeros... */ Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(figure_de_diffraction,nom_image)))) Bblock CALS(Ifloat_std(ImageR ,figure_de_diffraction ,niveau_minimum_de_la_sequence ,niveau_maximum_de_la_sequence ) ); /* Renormalisation globale des images de la sequence. */ Test(IL_FAUT(convoluer_les_images)) Bblock /* R = image dont on veut boucher les trous. */ CALi(Inoir(ImageA1)); /* A1 = nettoyage... */ CALS(Iepaississement(ImageA1 ,ImageR ,niveaux_a_epaissir,niveaux_epaississables ,nombre_de_points ,noyau,inhibition_du_noyau ) ); /* A1 = image donnant les trous bouches par la convolution. */ CALS(Ior(ImageR,ImageR,ImageA1)); /* R = image Resultat avec les trous bouches, obtenue par superposition de l'image */ /* Argument et de celle de ses trous bouches. */ Eblock ATes Bblock Eblock ETes CALi(Iupdate_image(nom_image,ImageR)); Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes CALZ_FreCC(nom_image); INCR(numero_de_la_periode_courante,I); /* Et passage a l'image suivante... */ Eblock EKom EDEFV(imageF,figure_de_diffraction); /* Image flottante dans laquelle on trouve la figure de diffraction avant renormalisation. */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande