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