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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.