_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   A   D E U X   A L B U M S  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base de gestion et de manipulation de                                                                         */
/*                  deux albums raster, quelle que soit la definition.                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/di_album$FON' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19930000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P L A C E M E N T   D ' U N   A L B U M  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Amove(albumR,albumA))))
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z].                                */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CALS(AMOVE(albumR,albumA));
                                        /* Mis sous cette forme le 20160815082735...                                                 */

     RETA(albumR);
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   A L B U M   S T A N D A R D  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

#define   RECHERCHE_DES_EXTREMA_D_UN_ALBUM_STANDARD(minimum,maximum)                                                                    \
                    Bblock                                                                                                              \
                    EGAL(minimum,BLANC);                                                                                                \
                    EGAL(maximum,NOIR);                                                                                                 \
                                                                                                                                        \
                    begin_album                                                                                                         \
                         Bblock                                                                                                         \
                         DEFV(genere_p,INIT(niveau_courant,Aload_point(albumA,X,Y,Z)));                                                 \
                                                                                                                                        \
                         EGAL(minimum,MIN2(minimum,niveau_courant));                                                                    \
                         EGAL(maximum,MAX2(maximum,niveau_courant));                                                                    \
                         Eblock                                                                                                         \
                    end_album                                                                                                           \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20180509113614...                                                 */

DEFV(Common,DEFV(genere_p,SINT(Anormalisation_____niveau_origine___de_normalisation,NOIR)));
DEFV(Common,DEFV(genere_p,SINT(Anormalisation_____niveau_extremite_de_normalisation,BLANC)));
                                        /* Definition du segment de normalisation...                                                 */

DEFV(Common,DEFV(FonctionP,POINTERp(Anormalisation(albumR,albumA))))
                                        /* Fonction introduite le 20180509113614...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z].                                */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(niveau_origine___effectif,NIVEAU_UNDEF));
     DEFV(genere_Float,INIT(niveau_extremite_effectif,NIVEAU_UNDEF));
     /*..............................................................................................................................*/
     RECHERCHE_DES_EXTREMA_D_UN_ALBUM_STANDARD(niveau_origine___effectif,niveau_extremite_effectif);

     begin_album
          Bblock
          DEFV(genere_p,INIT(niveau_courant,AloadF_point(albumA,X,Y,Z)));
                                        /* Niveau du point courant {X,Y}.                                                            */

          Astore_point(HOMO(niveau_courant
                           ,niveau_origine___effectif
                           ,niveau_extremite_effectif
                           ,Anormalisation_____niveau_origine___de_normalisation
                           ,Anormalisation_____niveau_extremite_de_normalisation
                            )
                      ,albumR
                      ,X,Y,Z
                       );
          Eblock
     end_album

     RETA(albumR);
     Eblock

#undef    RECHERCHE_DES_EXTREMA_D_UN_ALBUM_STANDARD

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   A L B U M   N O N   S T A N D A R D  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Float,SINT(AFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine
                           ,EPSILON_DE_SEUILLAGE_INFERIEUR_PAR_RAPPORT_AU_NIVEAU_ORIGINE_POUR_AFnormalisation
                            )
                 )
     );
                                        /* En augmentant ce seuil, il est possible d'eliminer des "underflows" de normalisation...   */
DEFV(Common,DEFV(genere_Float,SINT(AFnormalisation_____niveau_origine___de_normalisation,COORDONNEE_BARYCENTRIQUE_MINIMALE)));
DEFV(Common,DEFV(genere_Float,SINT(AFnormalisation_____niveau_extremite_de_normalisation,COORDONNEE_BARYCENTRIQUE_MAXIMALE)));
                                        /* Definition du segment de normalisation...                                                 */
DEFV(Common,DEFV(Logical,SINT(AFnormalisation_____conserver_le_zero,FAUX)));
                                        /* Afin de pouvoir conserver le zero de l'album a normaliser.                                */
DEFV(Common,DEFV(Float,SINT(AFnormalisation_____amplitude_des_extrema_en_deca_de_laquelle_il_y_a_nullite,FZERO)));
                                        /* Afin d'eviter des problemes avec 'HOMO(...)'.                                             */

DEFV(Common,DEFV(FonctionF,POINTERF(AFnormalisation(albumR,albumA,niveau_origine,niveau_extremite))))
                                        /* Fonction introduite le 20100504150752...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z].                                */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(genere_Float,niveau_origine));
DEFV(Argument,DEFV(genere_Float,niveau_extremite));
                                        /* Extrema supposes des niveaux de 'albumA'. On notera qu'ils peuvent etre differents        */
                                        /* des extrema reels...                                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(niveau_origine___effectif,niveau_origine));
     DEFV(genere_Float,INIT(niveau_extremite_effectif,niveau_extremite));
                                        /* Afin de conserver la position du zero si besoin est...                                    */
     /*..............................................................................................................................*/
     Test(IFGE(SOUA(niveau_extremite,niveau_origine),AFnormalisation_____amplitude_des_extrema_en_deca_de_laquelle_il_y_a_nullite))
          Bblock
                                        /* Cas ou l'amplitude des extrema ne laisse pas supposer qu'il y a nullite approximative :   */
          Test(IL_FAUT(AFnormalisation_____conserver_le_zero))
               Bblock
               EGAL(niveau_extremite_effectif
                   ,MAX2(ABSO(niveau_origine)
                        ,ABSO(niveau_extremite)
                         )
                    );
               EGAL(niveau_origine___effectif,NEGA(niveau_extremite_effectif));
                                        /* Et ce afin de conserver le zero (introduit le 20050905104340...).                         */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          begin_album
               Bblock
               DEFV(genere_Float,INIT(niveau_courant,AloadF_point(albumA,X,Y,Z)));
                                        /* Niveau du point courant {X,Y}.                                                            */

               Test(IFLE(niveau_courant
                        ,ADD2(niveau_origine,AFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine)
                         )
                    )
                    Bblock
                    EGAL(niveau_courant,niveau_origine);
                                        /* Pour eviter des "underflows" dans 'HOMO(...)'...                                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               AstoreF_point(HOMO(niveau_courant
                                 ,niveau_origine___effectif
                                 ,niveau_extremite_effectif
                                 ,AFnormalisation_____niveau_origine___de_normalisation
                                 ,AFnormalisation_____niveau_extremite_de_normalisation
                                  )
                            ,albumR
                            ,X,Y,Z
                             );
               Eblock
          end_album
          Eblock
     ATes
          Bblock
                                        /* Cas ou l'amplitude des extrema laisse supposer qu'il y a nullite approximative :          */
          CALS(dAFinitialisation(albumR,COORDONNEE_BARYCENTRIQUE_MINIMALE));
                                        /* Ainsi, si l'amplitude [niveau_origine,niveau_extremite] est trop petite, on "unifie" a    */
                                        /* zero arbitrairement (introduit le 20081228101851)...                                      */
          Eblock
     ETes

     RETAF(albumR);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   N E U T R E   ( X , Y , Z )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

                                        /* ATTENTION, jusqu'au 20001214120443, la fonction 'Apermutation_XYZ(...)' etait definie     */
                                        /* assez logiquement par :                                                                   */
                                        /*                                                                                           */
                                        /*   DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_XYZ(albumR,albumA),X,Y,Z))     */
                                        /*                                                                                           */
                                        /* malheureusement, cela empecahit la commande 'v $xci/album$K' de fonctionner avec des      */
                                        /* dimensions des trois axes {X,Y,Z} differentes, meme dans ce cas ou aucune permutation     */
                                        /* des axes etait demandee ; d'ou cette nouvelle definition...                               */

DEFV(Common,DEFV(FonctionP,POINTERp(Apermutation_XYZ(albumR,albumA))))
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z].                                */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CALS(AMOVE(albumR,albumA));
                                        /* La permutation "neutre" {X,Y,Z} --> {X,Y,Z} est en fait un "move"...                      */

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " E P A I S S I S S E M E N T "   D ' U N   A L B U M  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Aepaississement(albumR,albumA,ZminA,ZmaxA))))
                                        /* Fonction introduite le 20210429080350...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat dans lequel les pages de 'albumA' auront ete, par exemple, doublees...     */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(Int,ZminA));
DEFV(Argument,DEFV(Int,ZmaxA));
                                        /* Definition de l'axe 'Z' Argument qui a priori est inclus dans [Zmin,Zmax]...              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(dimZA,DIMENSION(ZminA,ZmaxA)));
                                        /* Definition de l'axe [Zmin,Zmax] Argument...                                               */
     DEFV(Int,INIT(dimZR,DIMENSION(Zmin,Zmax)));
     DEFV(Int,INIT(ZminR,Zmin));
     DEFV(Int,INIT(ZmaxR,Zmax));
                                        /* Definition de l'axe [Zmin,Zmax] Resultat...                                               */
     DEFV(Int,INIT(Zepaississement,Zmax));
                                        /* Definition de la coordonnee 'Z' courante du Resultat...                                   */
     /*..............................................................................................................................*/
     Test(NON_DIVISIBLE(dimZR,dimZA))
          Bblock
          PRINT_ERREUR("l'axe 'Z' Argument ne 'divise' pas exactement l'axe 'Z' Resultat");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     BSaveModifyVariable(Int,Zmin,ZminA);
     BSaveModifyVariable(Int,Zmax,ZmaxA);
                                        /* Positionnement dans [Zmin,Zmax] Argument...                                               */

     begin_fuite_back
          Bblock
          BDEFV(image,page_courante);

          CALS(Imove(page_courante,PAGE(albumA,Z)));
                                        /* Recuperation de la page courant Argument...                                               */

          BSaveModifyVariable(Int,Zmin,ZminR);
          BSaveModifyVariable(Int,Zmax,ZmaxR);
                                        /* Positionnement dans [Zmin,Zmax] Resultat...                                               */

          Repe(DIVI(dimZR,dimZA))
               Bblock
               CALS(Imove(PAGE(albumR,Zepaississement),page_courante));
                                        /* Mise en place de la page courant Resultat...                                              */
               DECR(Zepaississement,pasZ);
               Eblock
          ERep

          ESaveModifyVariable(Int,Zmax);
          ESaveModifyVariable(Int,Zmin);

          EDEFV(image,page_courante);
          Eblock
     end_fuite_back

     ESaveModifyVariable(Int,Zmax);
     ESaveModifyVariable(Int,Zmin);

     Test(IFNE(nSUCZ(Zepaississement,pasZ),Zmin))
          Bblock
          PRINT_ERREUR("l'axe 'Z' Resultat n'a pas ete parcouru correctement");
          CAL1(Prer4("(Zmin=%d Zepaississement+pasZ=%d+%d=%d)\n",Zmin,Zepaississement,pasZ,nSUCZ(Zepaississement,pasZ)));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        B I N A R I S A T I O N   G E N E R A L E   D ' U N   A L B U M  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Abinarisation_generale(albumR,albumA,seuil,niveau_inferieur,niveau_superieur))))
                                        /* Fonction introduite le 20100624165221...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y]=niveau_inferieur si albumA[X][Y] <= seuil,         */
                                        /*                      et :             =niveau_superieur si albumA[X][Y]  > seuil.         */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(genere_p,seuil));
                                        /* Seuil de binarisation : donne le dernier niveau a mettre a 'NOIR', et par exemple         */
                                        /* 'NOIR' (dans ce cas les points 'NOIR's restent 'NOIR's, et tous les autres                */
                                        /* deviennent 'BLANC's...).                                                                  */
DEFV(Argument,DEFV(genere_p,niveau_inferieur));
DEFV(Argument,DEFV(genere_p,niveau_superieur));
                                        /* Niveaux jouant le role du 'NOIR' et du 'BLANC' respectivement...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_fuite
          Bblock
          CALS(Ibinarisation_generale(PAGE(albumR,Z),PAGE(albumA,Z),seuil,niveau_inferieur,niveau_superieur));
                                        /* Binarisation de la page courante...                                                       */
          Eblock
     end_fuite

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        B I N A R I S A T I O N   G E N E R A L E   D ' U N   A L B U M   " F L O A T "  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(AFbinarisation_generale(albumR,albumA,seuil,niveau_inferieur,niveau_superieur))))
                                        /* Fonction introduite le 20100624171934...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y]=niveau_inferieur si albumA[X][Y] <= seuil,         */
                                        /*                      et :             =niveau_superieur si albumA[X][Y]  > seuil.         */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(genere_Float,seuil));
                                        /* Seuil de binarisation : donne le dernier niveau a mettre a 'NOIR', et par exemple         */
                                        /* 'NOIR' (dans ce cas les points 'NOIR's restent 'NOIR's, et tous les autres                */
                                        /* deviennent 'BLANC's...).                                                                  */
DEFV(Argument,DEFV(genere_Float,niveau_inferieur));
DEFV(Argument,DEFV(genere_Float,niveau_superieur));
                                        /* Niveaux jouant le role du 'NOIR' et du 'BLANC' respectivement...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_fuite
          Bblock
          CALS(IFbinarisation_generale(PAGE(albumR,Z),PAGE(albumA,Z),seuil,niveau_inferieur,niveau_superieur));
                                        /* Binarisation de la page courante...                                                       */
          Eblock
     end_fuite

     RETAF(albumR);
     Eblock

EFonctionF

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   " F L O A T "   -->   " S T A N D A R D "   B R U T A L E   D ' U N   A L B U M  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Afloat_std_brutal_____renormaliser_plutot_que_convertir_brutalement,FAUX)));
                                        /* Afin de pouvoir renormaliser si besoin est (introduit le 20100903212348)...               */

DEFV(Common,DEFV(FonctionP,POINTERp(Afloat_std_brutal(albumR,albumA))))
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] converti.                       */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_fuite
          Bblock
          Test(IL_NE_FAUT_PAS(Afloat_std_brutal_____renormaliser_plutot_que_convertir_brutalement))
               Bblock
               CALS(Ifloat_std_brutal(PAGE(albumR,Z),PAGE(albumA,Z)));
                                        /* Conversion brutale de la page courante...                                                 */
               Eblock
          ATes
               Bblock
               CALS(Ifloat_std_avec_renormalisation(PAGE(albumR,Z),PAGE(albumA,Z)));
                                        /* Conversion avec renormalisation de la page courante independamment des autres pages       */
                                        /* (introduite le 20100903212348)...                                                         */
               Eblock
          ETes
          Eblock
     end_fuite

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R I O D I S A T I O N   D ' U N   A L B U M   S T A N D A R D  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Aperiodisation(albumR,albumA))))
                                        /* Fonction introduite le 20150603150137.                                                    */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] periodise.                      */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          Astore_point(MOY8(Aload_point(albumA,NEUT(X),NEUT(Y),NEUT(Z))
                           ,Aload_point(albumA,RENX(X),NEUT(Y),NEUT(Z))
                           ,Aload_point(albumA,RENX(X),RENY(Y),NEUT(Z))
                           ,Aload_point(albumA,NEUT(X),RENY(Y),NEUT(Z))
                           ,Aload_point(albumA,NEUT(X),NEUT(Y),RENZ(Z))
                           ,Aload_point(albumA,RENX(X),NEUT(Y),RENZ(Z))
                           ,Aload_point(albumA,RENX(X),RENY(Y),RENZ(Z))
                           ,Aload_point(albumA,NEUT(X),RENY(Y),RENZ(Z))
                            )
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* La periodisation est obtenue grace a la moyenne des huit sommets d'un cube centre         */
                                        /* et dont l'un des sommets est le point courant {X,Y,Z}...                                  */
          Eblock
     end_album

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R I O D I S A T I O N   D ' U N   A L B U M   N O N   S T A N D A R D  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(AFperiodisation(albumR,albumA))))
                                        /* Fonction introduite le 20150603150137.                                                    */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] periodise.                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          AstoreF_point(MOY8(AloadF_point(albumA,NEUT(X),NEUT(Y),NEUT(Z))
                            ,AloadF_point(albumA,RENX(X),NEUT(Y),NEUT(Z))
                            ,AloadF_point(albumA,RENX(X),RENY(Y),NEUT(Z))
                            ,AloadF_point(albumA,NEUT(X),RENY(Y),NEUT(Z))
                            ,AloadF_point(albumA,NEUT(X),NEUT(Y),RENZ(Z))
                            ,AloadF_point(albumA,RENX(X),NEUT(Y),RENZ(Z))
                            ,AloadF_point(albumA,RENX(X),RENY(Y),RENZ(Z))
                            ,AloadF_point(albumA,NEUT(X),RENY(Y),RENZ(Z))
                             )
                       ,albumR
                       ,X,Y,Z
                        );
                                        /* La periodisation est obtenue grace a la moyenne des huit sommets d'un cube centre         */
                                        /* et dont l'un des sommets est le point courant {X,Y,Z}...                                  */
          Eblock
     end_album

     RETAF(albumR);
     Eblock

EFonctionF

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   P E R M U T A T I O N S   D E S   D I M E N S I O N S   D ' U N   A L B U M  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#pragma   xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction                     GENERE__FonctionP_I_PERMUTATION         POINTERp
                                        /* Introduit le 20040520121147.                                                              */
#define   GENERE__FonctionP_I_PERMUTATION(nom_et_arguments_de_la_fonction,coordonnee_1,coordonnee_2,coordonnee_3)                       \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments ; on trouvera donc :               */ \
                                        /*                                                                                           */ \
                                        /*                  GENERE__FonctionP_I_PERMUTATION(nom_de_la_fonction(albumR,avant,arriere) */ \
                                        /*                                                                                           */ \
DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))                                                                               \
                                        /* ATTENTION, il ne faut pas ecrire :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)))   */ \
                                        /*                                                                                           */ \
                                        /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par :                  */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,GENERE__FonctionP_I_PERMUTATION(...))                        */ \
                                        /*                                                                                           */ \
                                        /* Actuellement cette redondance ne serait pas genante, mais plus tard...                    */ \
DEFV(Argument,DEFV(album,albumR));                                                                                                      \
                                        /* Album Resultat, tel que : albumR=PERMUTATION(albumA).                                     */ \
DEFV(Argument,DEFV(album,albumA));                                                                                                      \
                                        /* Album Argument.                                                                           */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     Test(IFOU(IFID(albumA,albumR),I3OU(IFNE(dimX,dimY),IFNE(dimY,dimZ),IFNE(dimZ,dimX))))                                              \
          Bblock                                                                                                                        \
          PRINT_ERREUR("les albums Argument et Resultat sont identiques, ou les dimensions en 'X' et 'Y' et 'Z' sont inegales");        \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          begin_album                                                                                                                   \
               Bblock                                                                                                                   \
               Astore_point(Aload_point(albumA,coordonnee_1,coordonnee_2,coordonnee_3),albumR,X,Y,Z);                                   \
               Eblock                                                                                                                   \
          end_album                                                                                                                     \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
     RETA(albumR);                                                                                                                      \
     Eblock

                                        /* ATTENTION, jusqu'au 20001214120443, la fonction 'Apermutation_XYZ(...)' etait definie     */
                                        /* ici et assez logiquement par :                                                            */
                                        /*                                                                                           */
                                        /*   DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_XYZ(albumR,albumA),X,Y,Z))     */
                                        /*                                                                                           */
                                        /* malheureusement, cela empecahit la commande 'v $xci/album$K' de fonctionner avec des      */
                                        /* dimensions des trois axes {X,Y,Z} differentes, meme dans ce cas ou aucune permutation     */
                                        /* des axes etait demandee ; d'ou cette nouvelle definition...                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   ( X , Z , Y )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_XZY(albumR,albumA),X,Z,Y))                 /* Common,DEFV(Fonction,) :      */

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   ( Y , Z , X )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_YZX(albumR,albumA),Y,Z,X))                 /* Common,DEFV(Fonction,) :      */

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   ( Y , X , Z )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_YXZ(albumR,albumA),Y,X,Z))                 /* Common,DEFV(Fonction,) :      */

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   ( Z , X , Y )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_ZXY(albumR,albumA),Z,X,Y))                 /* Common,DEFV(Fonction,) :      */

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R M U T A T I O N   ( Z , Y , X )   D E S   D I M E N S I O N S   D ' U N   A L B U M  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,GENERE__FonctionP_I_PERMUTATION(Apermutation_ZYX(albumR,albumA),Z,Y,X))                 /* Common,DEFV(Fonction,) :      */

EFonctionP

#undef    GENERE__FonctionP_I_PERMUTATION

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O U P E   P L A N E   D ' U N   A L B U M  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Acoupe_plane_____utiliser_la_super_echelle,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Acoupe_plane_____faire_un_IZLE,VRAI)));
                                        /* AFin de pouvoir choisir entre garder le dessous du plan ('IZLE(...)') et le dessus        */
                                        /* ('IZGT(...)')...                                                                          */

DEFV(Common,DEFV(FonctionP,POINTERp(Acoupe_plane(albumR,albumA,coefficientA,coefficientB,coefficientC,coefficientD,niveau_efface))))
                                        /* Fonction introduite le 20140913095201...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat.                                                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(Float,coefficientA));
DEFV(Argument,DEFV(Float,coefficientB));
DEFV(Argument,DEFV(Float,coefficientC));
DEFV(Argument,DEFV(Float,coefficientD));
                                        /* Definition du plan de coupe :                                                             */
                                        /*                                                                                           */
                                        /*                  AX+BY+CZ+D=0                                                             */
                                        /*                                                                                           */
DEFV(Argument,DEFV(genere_p,niveau_efface));
                                        /* Niveau attribue aux points effaces.                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          DEFV(Float,INIT(Xf
                         ,OPC1(IL_FAUT(Acoupe_plane_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OX
                              ,_____cNORMALISE_OX
                              ,X
                               )
                          )
               );
          DEFV(Float,INIT(Yf
                         ,OPC1(IL_FAUT(Acoupe_plane_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OY
                              ,_____cNORMALISE_OY
                              ,Y
                               )
                          )
               );
          DEFV(Float,INIT(Zf
                         ,OPC1(IL_FAUT(Acoupe_plane_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OZ
                              ,_____cNORMALISE_OZ
                              ,Z
                               )
                          )
               );

          DEFV(Float,INIT(equation_locale,FLOT__UNDEF));

          DEFV(genere_p,INIT(nouveau_niveau,niveau_efface));
                                        /* Niveau par defaut...                                                                      */

          EGAL(equation_locale
              ,LIN3(coefficientA,Xf
                   ,coefficientB,Yf
                   ,coefficientC,Zf
                   ,coefficientD
                    )
               );

          Test(OPC1(IL_FAUT(Acoupe_plane_____faire_un_IZLE)
                   ,IZLE
                   ,IZGT
                   ,equation_locale
                    )
               )
               Bblock
               EGAL(nouveau_niveau,Aload_point(albumA,X,Y,Z));
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  AX+BY+CZ+D <= 0                                                          */
                                        /*                                                                                           */
                                        /* (test par defaut...).                                                                     */
               Eblock
          ATes
               Bblock
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  AX+BY+CZ+D > 0                                                           */
                                        /*                                                                                           */
               Eblock
          ETes

          Astore_point(nouveau_niveau
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* Et mise a jour de l'album Resultat.                                                       */
          Eblock
     end_album

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   B O I T E   ( T O T A L E   O U   P A R T I E L L E )   D ' U N   A L B U M  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_X0,BLANC)));
DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_X1,BLANC)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____epaisseur_X,UN)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Xmin,ZERO)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Xmax,ZERO)));

DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_Y0,BLANC)));
DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_Y1,BLANC)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____epaisseur_Y,UN)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Ymin,ZERO)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Ymax,ZERO)));

DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_Z0,BLANC)));
DEFV(Common,DEFV(genere_p,SINT(Amise_en_boite_____niveau_plan_Z1,BLANC)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____epaisseur_Z,UN)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Zmin,ZERO)));
DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____translation_Zmax,ZERO)));

#define   MARQUAGE_DE_LA_BOITE(marquer_le_plan,coordonnee_courante,coordonnee_du_plan,niveau_de_marquage)                               \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(marquer_le_plan))                                                                                      \
                         Bblock                                                                                                         \
                         Test(IFEQ(coordonnee_courante,coordonnee_du_plan))                                                             \
                              Bblock                                                                                                    \
                              EGAL(niveau_posterieur,niveau_de_marquage);                                                               \
                                        /* On notera que ce niveau peut prendre successivement plusieurs valeurs differentes pour    */ \
                                        /* un meme jeu de coordonnees {X,Y,Z}. C'est par exemple le cas d'un sommet de la boite...   */ \
                              EGAL(au_moins_un_marquage_de_la_boite_a_eu_lieu,VRAI);                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

DEFV(Common,DEFV(FonctionP,POINTERp(Amise_en_boite(albumR
                                                  ,albumA
                                                  ,plan_X0,plan_X1
                                                  ,plan_Y0,plan_Y1
                                                  ,plan_Z0,plan_Z1
                                                   )
                                    )
                 )
     )
                                        /* Fonction introduite le 20240701080123...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat.                                                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(Logical,plan_X0));
DEFV(Argument,DEFV(Logical,plan_X1));
DEFV(Argument,DEFV(Logical,plan_Y0));
DEFV(Argument,DEFV(Logical,plan_Y1));
DEFV(Argument,DEFV(Logical,plan_Z0));
DEFV(Argument,DEFV(Logical,plan_Z1));
                                        /* Selecteurs des plans a marquer pour former la boite qui est definie par les six           */
                                        /* plans suivants :                                                                          */
                                        /*                                                                                           */
                                        /*                  X = Xmin                                                                 */
                                        /*                  X = Xmax                                                                 */
                                        /*                                                                                           */
                                        /*                  Y = Ymin                                                                 */
                                        /*                  Y = Ymax                                                                 */
                                        /*                                                                                           */
                                        /*                  Z = Zmin                                                                 */
                                        /*                  Z = Zmax                                                                 */
                                        /*                                                                                           */
                                        /* par defaut, mais modifiables via six translations. On notera que l'on ne peut pas         */
                                        /* utiliser :                                                                                */
                                        /*                                                                                           */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Xmin,Xmin)));               */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Xmax,Xmax)));               */
                                        /*                                                                                           */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Ymin,Ymin)));               */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Ymax,Ymax)));               */
                                        /*                                                                                           */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Zmin,Zmin)));               */
                                        /*                  DEFV(Common,DEFV(Int,SINT(Amise_en_boite_____Zmax,Zmax)));               */
                                        /*                                                                                           */
                                        /* pour remplacer les '????(????,Amise_en_boite_____translation_????)' ci-apres, car         */
                                        /* en effet, {Xmin,Xmax,Ymin,Ymax,Zmin,Zmax} sont des variables et non pas des constantes... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          DEFV(genere_p,INIT(niveau_anterieur,Aload_point(albumA,X,Y,Z)));
          DEFV(genere_p,INIT(niveau_posterieur,NIVEAU_UNDEF));

          DEFV(Logical,INIT(au_moins_un_marquage_de_la_boite_a_eu_lieu,FAUX));

          MARQUAGE_DE_LA_BOITE(plan_X0,X,ADD2(Xmin,Amise_en_boite_____translation_Xmin),Amise_en_boite_____niveau_plan_X0);
          MARQUAGE_DE_LA_BOITE(plan_X1,X,SOUS(Xmax,Amise_en_boite_____translation_Xmax),Amise_en_boite_____niveau_plan_X1);

          MARQUAGE_DE_LA_BOITE(plan_Y0,Y,ADD2(Ymin,Amise_en_boite_____translation_Ymin),Amise_en_boite_____niveau_plan_Y0);
          MARQUAGE_DE_LA_BOITE(plan_Y1,Y,SOUS(Ymax,Amise_en_boite_____translation_Ymax),Amise_en_boite_____niveau_plan_Y1);

          MARQUAGE_DE_LA_BOITE(plan_Z0,Z,ADD2(Zmin,Amise_en_boite_____translation_Zmin),Amise_en_boite_____niveau_plan_Z0);
          MARQUAGE_DE_LA_BOITE(plan_Z1,Z,SOUS(Zmax,Amise_en_boite_____translation_Zmax),Amise_en_boite_____niveau_plan_Z1);

          Test(EST_VRAI(au_moins_un_marquage_de_la_boite_a_eu_lieu))
               Bblock

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

               begin_albumQ(DoIn,nPREZ(Zc,Amise_en_boite_____epaisseur_Z),nSUCZ(Zc,Amise_en_boite_____epaisseur_Z),PasZ
                           ,DoIn,nPREY(Yc,Amise_en_boite_____epaisseur_Y),nSUCY(Yc,Amise_en_boite_____epaisseur_Y),PasY
                           ,DoIn,nPREX(Xc,Amise_en_boite_____epaisseur_X),nSUCX(Xc,Amise_en_boite_____epaisseur_X),PasX
                            )
                    Bblock
                    Astore_point_valide(niveau_posterieur
                                       ,albumR
                                       ,X,Y,Z
                                        );
                                        /* Et mise a jour de l'album Resultat avec la boite (epaissie)...                            */
                                        /*                                                                                           */
                                        /* Cet "epaississement" est lie a la remarque 'v $xiirv/.PIPO.31.3.$U Il.semblerait.que'     */
                                        /* qui n'a peut-etre plus d'interet a la date du 20240701080123...                           */
                    Eblock
               end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

               Eblock
          ATes
               Bblock
               Astore_point(niveau_anterieur
                           ,albumR
                           ,X,Y,Z
                            );
                                        /* Et mise a jour de l'album Resultat avec l'album Argument...                               */
               Eblock
          ETes
          Eblock
     end_album

     RETA(albumR);
     Eblock

#undef    MARQUAGE_DE_LA_BOITE

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O U P E   R E L A T I V E M E N T   Q U E L C O N Q U E   D ' U N   A L B U M                                            */
/*        A   L ' A I D E   D ' U N   P O L Y N O M E   E N   { X , Y , Z }   D U   T R O I S I E M E   D E G R E  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Acoupe_quelconque_____utiliser_la_super_echelle,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Acoupe_quelconque_____faire_un_IZLE,VRAI)));
                                        /* AFin de pouvoir choisir entre garder le dessous du plan ('IZLE(...)') et le dessus        */
                                        /* ('IZGT(...)')...                                                                          */

DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a333,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a332,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a331,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a330,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a323,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a322,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a321,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a320,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a313,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a312,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a311,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a310,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a303,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a302,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a301,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a300,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a233,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a232,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a231,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a230,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a223,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a222,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a221,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a220,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a213,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a212,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a211,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a210,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a203,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a202,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a201,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a200,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a133,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a132,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a131,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a130,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a123,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a122,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a121,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a120,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a113,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a112,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a111,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a110,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a103,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a102,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a101,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a100,NEUT(FDEUX))));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a033,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a032,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a031,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a030,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a023,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a022,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a021,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a020,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a013,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a012,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a011,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a010,NEGA(FDEUX))));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a003,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a002,FZERO)));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a001,NEUT(FDEUX))));
DEFV(Common,DEFV(Float,SINT(Acoupe_quelconque_____a000,NEGA(FU))));
                                        /* Definition du polynome HORNER_3_03(X,Y,Z) initialise par defaut par :                     */
                                        /*                                                                                           */
                                        /*                  HORNER_3_03(X,Y,Z) = 2.X - 2.Y + 2.Z - 1                                 */
                                        /*                                                                                           */
                                        /* (afin d'assurer la compatibilite avec 'v $xiirf/.MENG.31.1.$U _____Coefficient') avec     */
                                        /* les associations suivantes :                                                              */
                                        /*                                                                                           */
                                        /*                  A = a001    -->     X                                                    */
                                        /*                  B = a010    -->     Y                                                    */
                                        /*                  C = a100    -->     Z                                                    */
                                        /*                  D = a000    -->     constante                                            */
                                        /*                                                                                           */
                                        /* ({A,B,C,D} etant le parametrage de 'Acoupe_plane(...)' ci-dessus...).                     */
                                        /*                                                                                           */
                                        /* Le 20171027163301, grace a 'v $xtc/HORNER_3_03.01$c', j'ai pu verifier qu'avec les        */
                                        /* valeurs par defaut, 'HORNER_3_03(...)' et 'LIN3(...)' donnaient les memes resultats...    */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Le 20200127150342, grace a 'v $xiirv/.STRX.31.2.$U', on notera que les parametres         */
                                        /* suivants :                                                                                */
                                        /*                                                                                           */
                                        /*                  a100=0    a010=0    a001=0                                               */
                                        /*                  a003=0    a002=+1   a001=-1                                              */
                                        /*                  a030=0    a020=+1   a010=-1                                              */
                                        /*                  a300=0    a200=+1   a100=-1                                              */
                                        /*                  a000=...                                                                 */
                                        /*                                                                                           */
                                        /* definissent une sphere de rayon 'a000'...                                                 */

DEFV(Common,DEFV(FonctionP,POINTERp(Acoupe_quelconque(albumR,albumA,niveau_efface))))
                                        /* Fonction introduite le 20171027112309...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat.                                                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(genere_p,niveau_efface));
                                        /* Niveau attribue aux points effaces.                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          DEFV(Float,INIT(Xf
                         ,OPC1(IL_FAUT(Acoupe_quelconque_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OX
                              ,_____cNORMALISE_OX
                              ,X
                               )
                          )
               );
          DEFV(Float,INIT(Yf
                         ,OPC1(IL_FAUT(Acoupe_quelconque_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OY
                              ,_____cNORMALISE_OY
                              ,Y
                               )
                          )
               );
          DEFV(Float,INIT(Zf
                         ,OPC1(IL_FAUT(Acoupe_quelconque_____utiliser_la_super_echelle)
                              ,SUPER_cNORMALISE_OZ
                              ,_____cNORMALISE_OZ
                              ,Z
                               )
                          )
               );

          DEFV(Float,INIT(equation_locale,FLOT__UNDEF));

          DEFV(genere_p,INIT(nouveau_niveau,niveau_efface));
                                        /* Niveau par defaut...                                                                      */

          EGAL(equation_locale,HORNER_3_03__COUPE_QUELCONQUE_ALBUM(Xf,Yf,Zf));
                                        /* Mis sous cette forme le 20171117134156...                                                 */

          Test(OPC1(IL_FAUT(Acoupe_quelconque_____faire_un_IZLE)
                   ,IZLE
                   ,IZGT
                   ,equation_locale
                    )
               )
               Bblock
               EGAL(nouveau_niveau,Aload_point(albumA,X,Y,Z));
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  HORNER_3_03(X,Y,Z) <= 0                                                  */
                                        /*                                                                                           */
                                        /* (test par defaut...).                                                                     */
               Eblock
          ATes
               Bblock
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  HORNER_3_03(X,Y,Z) > 0                                                   */
                                        /*                                                                                           */
               Eblock
          ETes

          Astore_point(nouveau_niveau
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* Et mise a jour de l'album Resultat.                                                       */
          Eblock
     end_album

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        J E U   D E   L A   V I E   S T A N D A R D  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Int,SINT(Ajeu_de_la_vie_____NpasX,UN)));
DEFV(Common,DEFV(Int,SINT(Ajeu_de_la_vie_____NpasY,UN)));
DEFV(Common,DEFV(Int,SINT(Ajeu_de_la_vie_____NpasZ,UN)));
                                        /* Afin de pouvoir "etaler" la definition des premiers et seconds voisins (ceci a ete        */
                                        /* introduit le 20120305145648...                                                            */

#define   COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(x,y,z)                                                             \
                    Bblock                                                                                                              \
                    DEFV(genere_p,INIT(niveau_courant_du_voisinage                                                                      \
                                      ,FAload_point(albumA                                                                              \
                                                   ,x,y,z                                                                               \
                                                   ,Ajeu_de_la_vie_____periodiser_X                                                     \
                                                   ,Ajeu_de_la_vie_____periodiser_Y                                                     \
                                                   ,Ajeu_de_la_vie_____periodiser_Z                                                     \
                                                   ,Ajeu_de_la_vie_____symetriser_X                                                     \
                                                   ,Ajeu_de_la_vie_____symetriser_Y                                                     \
                                                   ,Ajeu_de_la_vie_____symetriser_Z                                                     \
                                                   ,Ajeu_de_la_vie_____prolonger_X                                                      \
                                                   ,Ajeu_de_la_vie_____prolonger_Y                                                      \
                                                   ,Ajeu_de_la_vie_____prolonger_Z                                                      \
                                                   ,Ajeu_de_la_vie_____niveau_hors_album                                                \
                                                    )                                                                                   \
                                       )                                                                                                \
                         );                                                                                                             \
                                        /* Niveau courant du voisinage du point courant {X,Y,Z}.                                     */ \
                                                                                                                                        \
                    Test(IFNE(niveau_courant_du_voisinage,Ajeu_de_la_vie_____niveau_de_mort))                                           \
                         Bblock                                                                                                         \
                         INCR(nombre_de_voisins,I);                                                                                     \
                                        /* Le point {x,y,z} est un voisin de {X,Y,Z} quel que soit son niveau a condition qu'il soit */ \
                                        /* different de 'Ajeu_de_la_vie_____niveau_de_mort'.                                         */ \
                         EGAL(niveau_minimal_du_voisinage,MIN2(niveau_minimal_du_voisinage,niveau_courant_du_voisinage));               \
                         EGAL(niveau_maximal_du_voisinage,MAX2(niveau_maximal_du_voisinage,niveau_courant_du_voisinage));               \
                                        /* Niveaux extremaux du voisinage du point courant {X,Y,Z}.                                  */ \
                         EGAL(niveau_OUEX_du_voisinage,VEOR(niveau_OUEX_du_voisinage,niveau_courant_du_voisinage));                     \
                                        /* Niveau "plaisant" du voisinage du point courant {X,Y,Z}.                                  */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Comptage des voisins du point courant {X,Y,Z}.                                            */

#define   NIVEAU_DE_MORT_DE_Ajeu_de_la_vie                                                                                              \
                    NOIR
#define   NIVEAU_DE_VIE_DE_Ajeu_de_la_vie                                                                                               \
                    BLANC
                                        /* Niveaux "speciaux"...                                                                     */

DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721103950).             */
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_p,SINT(Ajeu_de_la_vie_____niveau_hors_album,NIVEAU_DE_MORT_DE_Ajeu_de_la_vie)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(genere_p,SINT(Ajeu_de_la_vie_____niveau_de_mort,NIVEAU_DE_MORT_DE_Ajeu_de_la_vie)));
DEFV(Common,DEFV(genere_p,SINT(Ajeu_de_la_vie_____niveau_de_vie,NIVEAU_DE_VIE_DE_Ajeu_de_la_vie)));
                                        /* Definition des niveaux associes a la mort et a la vie. ATTENTION, de ces deux niveaux     */
                                        /* seul 'Ajeu_de_la_vie_____niveau_de_mort' a un sens "absolu" : un site qui possede ce      */
                                        /* niveau est bien mort. Alors que 'Ajeu_de_la_vie_____niveau_de_vie' n'est pas le seul      */
                                        /* niveau a designer l'etat vivant (en fait, tout niveau qui a une valeur differente de      */
                                        /* 'Ajeu_de_la_vie_____niveau_de_mort' designe un etat "vivant"). En fait, le niveau         */
                                        /* 'Ajeu_de_la_vie_____niveau_de_vie' ne sert qu'eventuellement lors de la naissance d'un    */
                                        /* site, lorsqu'il n'y a pas d'autre niveau a lui attribuer...                               */

#define   LA_CELLULE_EST_MORTE__                                                                                                        \
                    IFEQ(niveau_de_la_generation_courante,Ajeu_de_la_vie_____niveau_de_mort)
#define   LA_CELLULE_EST_VIVANTE                                                                                                        \
                    IFNE(niveau_de_la_generation_courante,Ajeu_de_la_vie_____niveau_de_mort)
                                        /* Comment sait-on qu'une cellule est vivante ou morte (introduit le 20120229135036) ?       */

DEFV(Common,DEFV(Positive,SINT(Ajeu_de_la_vie_____seuil_de_solitude,HUIT)));
DEFV(Common,DEFV(Positive,SINT(Ajeu_de_la_vie_____seuil_inferieur_de_naissance,DIX)));
DEFV(Common,DEFV(Positive,SINT(Ajeu_de_la_vie_____seuil_superieur_de_naissance,QUATORZE)));
DEFV(Common,DEFV(Positive,SINT(Ajeu_de_la_vie_____seuil_d_etouffement,SEIZE)));
                                        /* Quelques seuils utiles...                                                                 */

#define   LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT                                                                                      \
                    NBRE(NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie)                       \
                                        /* Definition introduite le 20120303081804...                                                */
#define   ACCES_LISTE_DE_CHANGEMENT_D_ETAT(liste,nombre_de_voisins)                                                                     \
                    ITb0(liste                                                                                                          \
                        ,TRON(ADD2(SOUS(nombre_de_voisins,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie),PREMIER_CARACTERE)               \
                             ,PREMIER_CARACTERE                                                                                         \
                             ,LSTX(PREMIER_CARACTERE,chain_Xtaille(liste))                                                              \
                              )                                                                                                         \
                         )
DEFV(Common,DEFV(Positive,SINT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes,FAUX)));
DEFV(Common,DEFV(CHAR,INIT(POINTERc(Ajeu_de_la_vie_____liste_pour_les_cellules_mortes__)
                          ,"000000000011111000000000000"
                           )
                 )
     );
DEFV(Common,DEFV(CHAR,INIT(POINTERc(Ajeu_de_la_vie_____liste_pour_les_cellules_vivantes)
                          ,"111111110000000001111111111"
                           )
                 )
     );
                                        /* Definition des seuils via des listes (introduites le 20120229135036).                     */
                                        /*                                                                                           */
                                        /* La definition de ces listes est la suivante :                                             */
                                        /*                                                                                           */
                                        /*        NombreVoisins     :     0     0123456789    2                                      */
                                        /*                            0123456789    1     0123456                                    */
                                        /*                                                                                           */
                                        /*        CellulesMortes    : 000000000011111000000000000                                    */
                                        /*                                      |   |                                                */
                                        /*        CellulesVivantes  : 111111110000000001111111111                                    */
                                        /*                                    | |   | |                                              */
                                        /*                                    | |   |  ------> seuil_d_etouffement=SEIZE             */
                                        /*                                    | |   |                                                */
                                        /*                                    | |    --------> seuil_superieur_de_naissance=QUATORZE */
                                        /*                                    | |                                                    */
                                        /*                                    |  ------------> seuil_inferieur_de_naissance=DIX      */
                                        /*                                    |                                                      */
                                        /*                                     --------------> seuil_de_solitude=HUIT                */
                                        /*                                                                                           */
                                        /* Ces deux listes sont donc indexee par 'NombreVoisins'...                                  */
                                        /*                                                                                           */
                                        /* Le 20120308105251, en redigeant les commentaires precedents, j'ai note une anomalie       */
                                        /* dans la liste "CellulesVivantes" qui valait avant cette date :                            */
                                        /*                                                                                           */
                                        /*                  111111110000000011111111111                                              */
                                        /*                                                                                           */
                                        /* et qui a donc du etre remplacee par :                                                     */
                                        /*                                                                                           */
                                        /*                  111111110000000001111111111                                              */
                                        /*                                                                                           */
                                        /* ATTENTION : 'v $xcg/gen.ext$Z' demande a ce que la valeur initiale des pointeurs ne soit  */
                                        /* pas sur la meme ligne que le pointeur lui-meme...                                         */

DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_minimum,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_maximum,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_OUEX,FAUX)));
                                        /* Choix du coloriage de la naissance.                                                       */

DEFV(Common,DEFV(FonctionP,POINTERp(Ajeu_de_la_vie(albumR,albumA))))
                                        /* Fonction introduite le 20120223132118...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, telle que : albumR=vie(albumA).                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument donnant l'etat courant de l'espace avant son evolution...                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IL_FAUT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes))
                                        /* Test introduit le 20120303080714...                                                       */
          Bblock
          Test(IFNE(chain_Xtaille(Ajeu_de_la_vie_____liste_pour_les_cellules_mortes__),LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT))
               Bblock
               PRINT_ERREUR("la longueur de la liste des cellules mortes est incorrecte, elle est donc ignoree");
               CAL1(Prer1("(la longueur 'standard' est %d)\n",LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT));

               EGAL(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes,FAUX);
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFNE(chain_Xtaille(Ajeu_de_la_vie_____liste_pour_les_cellules_vivantes),LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT))
               Bblock
               PRINT_ERREUR("la longueur de la liste des cellules vivantes est incorrecte, elle est donc ignoree");
               CAL1(Prer1("(la longueur 'standard' est %d)\n",LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT));

               EGAL(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes,FAUX);
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes))
                                        /* Test introduit le 20120229164501...                                                       */
          Bblock
          DEFV(Int,INIT(index_de_validation,UNDEF));
                                        /* Index d'extraction dans les deux listes...                                                */

          DoIn(index_de_validation,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie),I)
               Bblock
               DEFV(CHAR,INIT(caractere_liste__cellules_vivantes
                             ,ITb0(Ajeu_de_la_vie_____liste_pour_les_cellules_vivantes
                                  ,INDX(index_de_validation,PREMIER_CARACTERE)
                                   )
                              )
                    );
               DEFV(CHAR,INIT(caractere_liste__cellules_mortes__
                             ,ITb0(Ajeu_de_la_vie_____liste_pour_les_cellules_mortes__
                                  ,INDX(index_de_validation,PREMIER_CARACTERE)
                                   )
                              )
                    );

               Test(IFET(IFNE(caractere_liste__cellules_vivantes,CONSERVER_L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE)
                        ,IFNE(caractere_liste__cellules_vivantes,CHANGER___L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE)
                         )
                    )
                    Bblock
                    PRINT_ERREUR("la liste des cellules vivantes contient des caracteres non reconnus, elle est donc ignoree");
                    CAL1(Prer2("(caractere '%c' a l'index %d)\n",caractere_liste__cellules_vivantes,index_de_validation));

                    EGAL(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes,FAUX);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IFNE(caractere_liste__cellules_mortes__,CONSERVER_L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE)
                        ,IFNE(caractere_liste__cellules_mortes__,CHANGER___L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE)
                         )
                    )
                    Bblock
                    PRINT_ERREUR("la liste des cellules mortes contient des caracteres non reconnus, elle est donc ignoree");
                    CAL1(Prer2("(caractere '%c' a l'index %d)\n",caractere_liste__cellules_mortes__,index_de_validation));

                    EGAL(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes,FAUX);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          EDoI
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes))
                                        /* Test introduit le 20120229164501...                                                       */
          Bblock
          Eblock
     ATes
          Bblock
          Test(IFEXff(Ajeu_de_la_vie_____seuil_de_solitude
                     ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                     ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                      )
               )
                                        /* Validation introduite le 20120227140933...                                                */
               Bblock
               PRINT_ERREUR("le seuil de solitude est en-dehors de ses bornes naturelles");
               CAL1(Prer3("(il vaut %d alors que ses bornes inferieure et superieure sont [%d,%d])\n"
                         ,Ajeu_de_la_vie_____seuil_de_solitude
                         ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                         ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                          )
                    );
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFEXff(Ajeu_de_la_vie_____seuil_inferieur_de_naissance
                     ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                     ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                      )
               )
                                        /* Validation introduite le 20120227140933...                                                */
               Bblock
               PRINT_ERREUR("le seuil de naissance inferieur est en-dehors de ses bornes naturelles");
               CAL1(Prer3("(il vaut %d alors que ses bornes inferieure et superieure sont [%d,%d])\n"
                         ,Ajeu_de_la_vie_____seuil_inferieur_de_naissance
                         ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                         ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                          )
                    );
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFEXff(Ajeu_de_la_vie_____seuil_superieur_de_naissance
                     ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                     ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                      )
               )
                                        /* Validation introduite le 20120227140933...                                                */
               Bblock
               PRINT_ERREUR("le seuil de naissance superieur est en-dehors de ses bornes naturelles");
               CAL1(Prer3("(il vaut %d alors que ses bornes inferieure et superieure sont [%d,%d])\n"
                         ,Ajeu_de_la_vie_____seuil_superieur_de_naissance
                         ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                         ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                          )
                    );
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFEXff(Ajeu_de_la_vie_____seuil_d_etouffement
                     ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                     ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                      )
               )
                                        /* Validation introduite le 20120227140933...                                                */
               Bblock
               PRINT_ERREUR("le seuil d'etouffement est en-dehors de ses bornes naturelles");
               CAL1(Prer3("(il vaut %d alors que ses bornes inferieure et superieure sont [%d,%d])\n"
                         ,Ajeu_de_la_vie_____seuil_d_etouffement
                         ,NOMBRE_MINIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                         ,NOMBRE_MAXIMAL_DE_VOISINS_DE_Ajeu_de_la_vie
                          )
                    );
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     begin_album
                                        /* Le 20240830121814, je note qu'ici on n'utilise pas :                                      */
                                        /*                                                                                           */
                                        /*                  begin_album_AvecEditionProgression                                       */
                                        /*                  (...)                                                                    */
                                        /*                  end_album_AvecEditionProgression                                         */
                                        /*                                                                                           */
                                        /* En effet, en general la fonction 'Ajeu_de_la_vie(...)' est appelee a l'interieur d'une    */
                                        /* boucle d'iterations ('v $xci/jeu_vie.12$K CALS.Ajeu_de_la_vie'). Et ainsi, editer ici     */
                                        /* la progression ferait que ces messages seraient extremement nombreux et de peu d'utilite. */
                                        /* Il serait en fait plus utile que cette progression soit geree par la boucle 'Repe(...)'   */
                                        /* elle-meme, mais cela n'est pas prevu...                                                   */
          Bblock
          DEFV(genere_p,INIT(niveau_de_la_generation_courante,Aload_point(albumA,X,Y,Z)));
                                        /* Niveau courant au point courant de la generation courante.                                */
          DEFV(Int,INIT(nombre_de_voisins,ZERO));
                                        /* Nombre de voisins du point courant.                                                       */
          DEFV(genere_p,INIT(niveau_minimal_du_voisinage,BLANC));
          DEFV(genere_p,INIT(niveau_maximal_du_voisinage,NOIR));
                                        /* Niveaux extremaux du voisinage du point courant.                                          */
          DEFV(genere_p,INIT(niveau_OUEX_du_voisinage,NOIR));
                                        /* Niveau "plaisant"...                                                                      */
          DEFV(genere_p,INIT(niveau_de_la_generation_suivante,NIVEAU_UNDEF));
                                        /* Niveau courant au point courant de la generation suivante.                                */

#define   nNEUT(xyz,pasXYZ)                                                                                                             \
                    NEUT(xyz)
#define   _____NpasX                                                                                                                    \
                    Ajeu_de_la_vie_____NpasX
#define   _____NpasY                                                                                                                    \
                    Ajeu_de_la_vie_____NpasY
#define   _____NpasZ                                                                                                                    \
                    Ajeu_de_la_vie_____NpasZ
                                        /* Afin de raccourcir les lignes qui suivent...                                              */

          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nNEUT(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nNEUT(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nSUCY(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nSUCY(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nSUCY(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nNEUT(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nPREY(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nPREY(Y,_____NpasY),nPREZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nPREY(Y,_____NpasY),nPREZ(Z,_____NpasZ));

          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nNEUT(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nSUCY(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nSUCY(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nSUCY(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nNEUT(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nPREY(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nPREY(Y,_____NpasY),nNEUT(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nPREY(Y,_____NpasY),nNEUT(Z,_____NpasZ));

          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nNEUT(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nNEUT(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nSUCY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nSUCY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nSUCY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nNEUT(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nPREX(X,_____NpasX),nPREY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nNEUT(X,_____NpasX),nPREY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
          COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL(nSUCX(X,_____NpasX),nPREY(Y,_____NpasY),nSUCZ(Z,_____NpasZ));
                                        /* Comptage des (3^3)-1=26 voisins eventuels.                                                */

#undef    _____NpasZ
#undef    _____NpasY
#undef    _____NpasX
#undef    nNEUT

          Test(IFET(LA_CELLULE_EST_MORTE__
                   ,IFOU(IFET(IL_NE_FAUT_PAS(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes)
                             ,IFINff(nombre_de_voisins
                                    ,Ajeu_de_la_vie_____seuil_inferieur_de_naissance
                                    ,Ajeu_de_la_vie_____seuil_superieur_de_naissance
                                     )
                              )
                        ,IFET(IL_FAUT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes)
                             ,IFEQ(ACCES_LISTE_DE_CHANGEMENT_D_ETAT(Ajeu_de_la_vie_____liste_pour_les_cellules_mortes__
                                                                   ,nombre_de_voisins
                                                                    )
                                  ,CHANGER___L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE
                                   )
                              )
                         )
                    )
               )
               Bblock
               EGAL(niveau_de_la_generation_suivante
                   ,COND(IL_FAUT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_minimum)
                        ,niveau_minimal_du_voisinage
                        ,COND(IL_FAUT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_maximum)
                             ,niveau_maximal_du_voisinage
                             ,COND(IL_FAUT(Ajeu_de_la_vie_____marquer_la_naissance_avec_le_OUEX)
                                  ,niveau_OUEX_du_voisinage
                                  ,Ajeu_de_la_vie_____niveau_de_vie
                                   )
                              )
                         )
                    );
                                        /* Naissance du point courant {X,Y,Z}.                                                       */

               Test(IFEQ(niveau_de_la_generation_suivante,Ajeu_de_la_vie_____niveau_de_mort))
                    Bblock
                    EGAL(niveau_de_la_generation_suivante,Ajeu_de_la_vie_____niveau_de_vie);
                                        /* Ou cas ou 'VEOR(...)' nous ferait des miseres en donnant le niveau de mort...             */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test(IFET(LA_CELLULE_EST_VIVANTE
                        ,IFOU(IFET(IL_NE_FAUT_PAS(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes)
                                  ,IFEXff(nombre_de_voisins
                                         ,Ajeu_de_la_vie_____seuil_de_solitude
                                         ,Ajeu_de_la_vie_____seuil_d_etouffement
                                          )
                                   )
                             ,IFET(IL_FAUT(Ajeu_de_la_vie_____definir_les_seuils_a_l_aide_de_listes)
                                  ,IFEQ(ACCES_LISTE_DE_CHANGEMENT_D_ETAT(Ajeu_de_la_vie_____liste_pour_les_cellules_vivantes
                                                                        ,nombre_de_voisins
                                                                         )
                                       ,CHANGER___L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE
                                        )
                                   )
                              )
                         )
                    )
                                        /* ATTENTION, on ecrit :                                                                     */
                                        /*                                                                                           */
                                        /*                  IFNE(niveau_de_la_generation_courante,Ajeu_de_la_vie_____niveau_de_mort) */
                                        /*                                                                                           */
                                        /* et non pas :                                                                              */
                                        /*                                                                                           */
                                        /*                  IFEQ(niveau_de_la_generation_courante,Ajeu_de_la_vie_____niveau_de_vie)  */
                                        /*                                                                                           */
                                        /* car en effet de 'Ajeu_de_la_vie_____niveau_de_mort' et 'Ajeu_de_la_vie_____niveau_de_vie' */
                                        /* seul 'Ajeu_de_la_vie_____niveau_de_mort' a un sens "absolu" : un site qui possede ce      */
                                        /* niveau est bien mort. Alors que 'Ajeu_de_la_vie_____niveau_de_vie' n'est pas le seul      */
                                        /* niveau a designer l'etat vivant (en fait, tout niveau qui a une valeur differente de      */
                                        /* 'Ajeu_de_la_vie_____niveau_de_mort' designe un etat "vivant"). En fait, le niveau         */
                                        /* 'Ajeu_de_la_vie_____niveau_de_vie' ne sert qu'eventuellement lors de la naissance d'un    */
                                        /* site, lorsqu'il n'y a pas d'autre niveau a lui attribuer...                               */
                    Bblock
                    EGAL(niveau_de_la_generation_suivante,Ajeu_de_la_vie_____niveau_de_mort);
                                        /* Mort du point courant {X,Y,Z}.                                                            */
                    Eblock
               ATes
                    Bblock
                    EGAL(niveau_de_la_generation_suivante,niveau_de_la_generation_courante);
                                        /* Etat stationnaire du point courant {X,Y,Z}.                                               */
                    Eblock
               ETes
               Eblock
          ETes

          Astore_point(niveau_de_la_generation_suivante
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* Et on calcule la generation suivante...                                                   */
          Eblock
     end_album

     RETA(albumR);
     Eblock

#undef    ACCES_LISTE_DE_CHANGEMENT_D_ETAT
#undef    LONGUEUR_DES_LISTES_DE_CHANGEMENT_D_ETAT

#undef    LA_CELLULE_EST_VIVANTE
#undef    LA_CELLULE_EST_MORTE__

#undef    NIVEAU_DE_MORT_DE_Ajeu_de_la_vie
#undef    NIVEAU_DE_VIE_DE_Ajeu_de_la_vie

#undef    COMPTAGE_DES_VOISINS_DANS_LE_JEU_DE_LA_VIE_TRIDIMENSIONNEL

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*        :Debut_listMN_ISING_TRIDIMENSIONNEL_11:                                                                                    */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   D E   I S I N G   T R I D I M E N S I O N N E L  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Considerons un ensemble de points                                                                              */
/*                  'P(i)' porteurs chacun d'un spin 'S(i)'                                                                          */
/*                  (valant en general -1/2 ou +1/2)                                                                                 */
/*                  et disposes sur un reseau cubique.                                                                               */
/*                  A chaque pas de temps, on choisira                                                                               */
/*                  aleatoirement quelques points pour                                                                               */
/*                  lesquels on evalue la quantite :                                                                                 */
/*                                                                                                                                   */
/*                                                  _____                                                                            */
/*                                                  \                                                                                */
/*                                                   \                                                                               */
/*                                      dE(i) = f.J. /    S(i).S(j)                                                                  */
/*                                                  /____                                                                            */
/*                                                    j                                                                              */
/*                                                                                                                                   */
/*                  ou l'indice 'j' parcourt les 6 premiers                                                                          */
/*                  voisins de 'P(i)' et ou 'J' designe la constante                                                                 */
/*                  de couplage (c'est-a-dire la force de celui-ci) et                                                               */
/*                  'f' une constante (positive en general, une valeur                                                               */
/*                  negative simulant l'anti-ferromagnetisme). Alors :                                                               */
/*                                                                                                                                   */
/*                                      si dE(i) <= 0, 'S(i)' est inverse : S(i) = -S(i)                                             */
/*                                                                                                                                   */
/*                                                                                   dE(i)                                           */
/*                                                                                - -------                                          */
/*                                                                                    k.T                                            */
/*                                      sinon, 'S(i)' n'est inverse que si : p < e                                                   */
/*                                                                                                                                   */
/*                  ou 'p' est un nombre aleatoire (dans [0,1], 'k'                                                                  */
/*                  designe la constante de Boltzmann (dont la valeur est                                                            */
/*                  1.38066e-23 J^1K^-1 mais qui sera en general remplacee                                                           */
/*                  par 1 dans les simulations effectuees) et enfin 'T'                                                              */
/*                  est la temperature "locale".                                                                                     */
/*                                                                                                                                   */
/*                    Il existe une temperature critique, mais contrairement                                                         */
/*                  au cas bidimensionnel, elle n'est pas encore connue                                                              */
/*                  (a la date du 20001213105228...).                                                                                */
/*                                                                                                                                   */
/*                    Il s'agit d'un systeme auto-organise, ainsi qu'il                                                              */
/*                  possible de le voir dans les simulations.                                                                        */
/*                                                                                                                                   */
/*                    Appelons "noyau" (ou "voisinage") le tenseur                                                                   */
/*                  3x3x3 defini comme suit :                                                                                        */
/*                                                                                                                                   */
/*                                                  /-------/                                                                        */
/*                                                 /| 0 0 0 |                                                                        */
/*                                                / | 0 1 0 |                                                                        */
/*                                               /  | 0 0 0 |                                                                        */
/*                                              /   /-------/                                                                        */
/*                                             /   /       /                                                                         */
/*                                            /-------/   /                                                                          */
/*                                           /| 0 1 0 |  /                                                                           */
/*                                          / | 1 0 1 | /                                                                            */
/*                                         /  | 0 1 0 |/                                                                             */
/*                                        /   /-------/                                                                              */
/*                                       /   /       /                                                                               */
/*                                      /-------/   /                                                                                */
/*                                      | 0 0 0 |  /                                                                                 */
/*                                      | 0 1 0 | /                                                                                  */
/*                                      | 0 0 0 |/                                                                                   */
/*                                      /-------/                                                                                    */
/*                                                                                                                                   */
/*                  et qui sert a ponderer les spins des (3x3x3)-1=26 points                                                         */
/*                  voisins d'un point donne (represente par l'element                                                               */
/*                  central de cette matrice). La configuration                                                                      */
/*                  ci-dessus correspond effectivement a la recherche                                                                */
/*                  des 6 premiers voisins. Il est alors possible de                                                                 */
/*                  generaliser cela et de definir ainsi des noyaux                                                                  */
/*                  de dimensions quelconques et contenant des valeurs                                                               */
/*                  arbitraires. Une application de cela est la generation                                                           */
/*                  de certains types de textures tridimensionnelles.                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
/*        :Fin_listMN_ISING_TRIDIMENSIONNEL_11:                                                                                      */

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____Amodele_d_Ising_3D_a_temperature_locale_VERSION_01));
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____Amodele_d_Ising_3D_a_temperature_locale_VERSION_02));
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#define   GENERATION_D_UN_NOMBRE_ALEATOIRE_DU_MODELE_D_ISING_3D(valeur_aleatoire,borne_inferieure,borne_superieure,graine_courante)     \
                    Bblock                                                                                                              \
                    DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage);                                                           \
                    INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,X,Y,Z);                                            \
                                        /* Point courant de l'espace de parametrage.                                                 */ \
                                                                                                                                        \
                    EGAL(valeur_aleatoire                                                                                               \
                        ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage)                                                       \
                               ,graine_courante                                                                                         \
                               ,RDN_INIT_AND_GENERE                                                                                     \
                               ,FLOT(borne_inferieure),FLOT(borne_superieure)                                                           \
                                )                                                                                                       \
                         );                                                                                                             \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */ \
                                        /* par le point courant de l'espace de parametrage. On notera que les 'FLOT(...)' relatifs   */ \
                                        /* a 'borne_inferieure' et 'borne_superieure' sont essentiels car, en effet, on ne connait   */ \
                                        /* pas a priori leur type (aussi bien 'Float' que 'Int'...).                                 */ \
                    Eblock                                                                                                              \
                                        /* Generation d'une valeur aleatoire.                                                        */

#define   ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin,x,dx,y,dy,z,dz,ponderation_de_ce_point)                                            \
                    Bblock                                                                                                              \
                    DEFV(Float,INIT(niveau_normalise,FLOT__UNDEF));                                                                     \
                    EGAL(niveau_normalise                                                                                               \
                        ,______NORMALISE_NIVEAU(FAload_point(albumA                                                                     \
                                                            ,ADD2(x,dx),ADD2(y,dy),ADD2(z,dz)                                           \
                                                            ,Amodele_d_Ising_3D_____periodiser_X                                        \
                                                            ,Amodele_d_Ising_3D_____periodiser_Y                                        \
                                                            ,Amodele_d_Ising_3D_____periodiser_Z                                        \
                                                            ,Amodele_d_Ising_3D_____symetriser_X                                        \
                                                            ,Amodele_d_Ising_3D_____symetriser_Y                                        \
                                                            ,Amodele_d_Ising_3D_____symetriser_Z                                        \
                                                            ,Amodele_d_Ising_3D_____prolonger_X                                         \
                                                            ,Amodele_d_Ising_3D_____prolonger_Y                                         \
                                                            ,Amodele_d_Ising_3D_____prolonger_Z                                         \
                                                            ,Amodele_d_Ising_3D_____niveau_hors_album                                   \
                                                             )                                                                          \
                                                )                                                                                       \
                         );                                                                                                             \
                    EGAL(spin                                                                                                           \
                        ,MUL2(ponderation_de_ce_point                                                                                   \
                             ,HOMO(niveau_normalise                                                                                     \
                                  ,______________NOIR_NORMALISE,______________BLANC_NORMALISE                                           \
                                  ,Amodele_d_Ising_3D_____spin_negatif,Amodele_d_Ising_3D_____spin_positif                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                                                                                                                        \
                    INCR(nombre_de_spins_negatifs,COND(IZLT(spin),I,ZERO));                                                             \
                    INCR(nombre_de_spins_____nuls,COND(IZEQ(spin),I,ZERO));                                                             \
                    INCR(nombre_de_spins_positifs,COND(IZGT(spin),I,ZERO));                                                             \
                                        /* Comptabilite des differents signes possibles du "spin" (inutile au 20011203143813).       */ \
                    Eblock                                                                                                              \
                                        /* Acces au spin associe a un point {x,y,z}.                                                 */

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#    define    ACCES_A_LA_TEMPERATURE_DU_MODELE_D_ISING_3D(x,y,z)                                                                       \
                         temperature_locale                                                                                             \
                                        /* Acces a la temperature associee a un point {x,y,z}.                                       */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#    define    ACCES_A_LA_TEMPERATURE_DU_MODELE_D_ISING_3D(x,y,z)                                                                       \
                         AloadF_point(temperature_locale,x,y,z)                                                                         \
                                        /* Acces a la temperature associee a un point {x,y,z}.                                       */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02

#define   NIVEAU_HORS_ALBUM_DANS_Amodele_d_Ising_3D                                                                                     \
                    NOIR                                                                                                                \
                                        /* Niveaux "speciaux"...                                                                     */

DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721104900).             */
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_p,ZINT(Amodele_d_Ising_3D_____niveau_hors_album,NIVEAU_HORS_ALBUM_DANS_Amodele_d_Ising_3D)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(Logical,ZINT(Amodele_d_Ising_3D_____utiliser_un_noyau,FAUX)));
                                        /* Options par defaut de choix entre la methode "des six plus proches voisins" ('FAUX')      */
                                        /* et la methode dite "a noyau" ('VRAI').                                                    */

DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point_sX__Y__Z,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point__X_sY__Z,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point__X__Y_sZ,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point_pX__Y__Z,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point__X_pY__Z,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____ponderation_du_point__X__Y_pZ,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D)));
                                        /* Definition des facteurs des points du voisinage du point courant {X,Y,Z}.                 */

DEFV(Common,DEFV(Logical,INIT(Amodele_d_Ising_3D_____initialiser_le_noyau,VRAI)));
DEFV(Common,DEFV(Int,ZINT(Amodele_d_Ising_3D_____demi_dimension_effective_du_noyau
                         ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Amodele_d_Ising_3D
                          )
                 )
     );
DEFV(Common,DEFV(Float,DTb3(Amodele_d_Ising_3D_____noyau,DimNo_Amodele_d_Ising_3D,DimNo_Amodele_d_Ising_3D,DimNo_Amodele_d_Ising_3D)));
DEFV(Common,DEFV(Float,INIT(POINTERf(PAmodele_d_Ising_3D_____noyau)
                           ,ADRESSE(ACCES_NOYAU_DANS_Amodele_d_Ising_3D(Amodele_d_Ising_3D_____XYZmin
                                                                       ,Amodele_d_Ising_3D_____XYZmin
                                                                       ,Amodele_d_Ising_3D_____XYZmin
                                                                        )
                                    )
                            )
                 )
     );
                                        /* Definition du noyau a utiliser dans 'Amodele_d_Ising_3D(...)', ainsi que d'un indicateur  */
                                        /* precisant si l'initialisation doit etre faite et de la demi-dimension effective           */
                                        /* (inferieure ou egale a 'DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Amodele_d_Ising_3D'         */
                                        /* de ce dernier.                                                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, la ligne relative a 'DTb3(...)' doit tenir sur une seule ligne a cause de      */
                                        /* '$xcg/gen.ext$Z'...                                                                       */
                                        /*                                                                                           */
                                        /* Le pointeur 'PAmodele_d_Ising_3D_____noyau' a ete introduit le 20010222110806 pour        */
                                        /* permettre des acces de type 'dAloadF_album(...)' au noyau...                              */
                                        /*                                                                                           */
                                        /* On notera le 20050920143825 que seule le centre du noyau (celui-ci etant defini grace a   */
                                        /* 'Amodele_d_Ising_3D_____demi_dimension_effective_du_noyau') est utilise. Ainsi, la        */
                                        /* matrice 'Amodele_d_Ising_3D_____noyau' pourra n'etre initialisee qu'en son centre (ce     */
                                        /* point existant bien puisque ses dimensions sont impaires...).                             */

DEFV(Common,DEFV(Int,ZINT(Amodele_d_Ising_3D_____delta_X,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Amodele_d_Ising_3D_____delta_Y,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Amodele_d_Ising_3D_____delta_Z,ZERO)));
                                        /* Translation des points du voisinage du point courant {X,Y,Z}.                             */

DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____spin_negatif,NEGA(VALEUR_ABSOLUE_DU_SPIN_DU_MODELE_D_ISING))));
DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____spin_positif,NEUT(VALEUR_ABSOLUE_DU_SPIN_DU_MODELE_D_ISING))));
                                        /* Definition des deux spins "extremes"...                                                   */

DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____facteur_de_la_variation_d_energie,NEUT(FU))));
                                        /* Facteur multiplicatif de la variation d'energie. Une valeur positive donne un             */
                                        /* comportement de type "ferromagnetique" alors qu'une valeur negative donne quant           */
                                        /* a elle un comportement de type "anti-ferromagnetique"...                                  */

DEFV(Common,DEFV(Float,ZINT(Amodele_d_Ising_3D_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN)));
                                        /* Constante de Boltzmann (J*K^(-1)). Une valeur de 1 simplifiera les utilisations           */
                                        /* ('v $xci/Ising_3D.11$K CONSTANTE_DE_BOLTZMANN_ISING_3D') des divers parametres (la        */
                                        /* temperature du modele en particulier).                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   D E   I S I N G   T R I D I M E N S I O N N E L   A   T E M P E R A T U R E   L O C A L E  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Amodele_d_Ising_3D_a_temperature_locale(albumR
                                                                           ,albumA
                                                                           ,graine_de_selection_des_points_a_tester
                                                                           ,probabilite_de_selection_des_points_a_tester
                                                                           ,graine_de_selection_des_points_a_basculer
                                                                           ,constante_de_couplage_J
                                                                           ,temperature_locale
                                                                            )
                                    )
                 )
     )
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR=Ising(albumA).                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument a traiter par le modele d'Ising tridimensionnel.                           */

                                        /* La notion d'increment des graines ci-apres a ete introduite le 20001211134636 afin de     */
                                        /* permettre des appels "iteratifs" de 'Amodele_d_Ising_3D(...)' avec la meme graine et      */
                                        /* sans que cela cree des artefacts. Une application de cela est de faire une simulation     */
                                        /* en deux temps en conservant donc une image intermediaire 'I' ; la poursuite du calcul     */
                                        /* sur l'image 'I' se fera en reprenant les memes graines que pour le calcul de 'I', mais    */
                                        /* en les incrementant de 'N' ou 'N' est le nombre d'iterations ayant conduit a 'I'...       */

DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_tester));
DEFV(Argument,DEFV(Float,probabilite_de_selection_des_points_a_tester));
                                        /* Pour choisir les points a tester.                                                         */
                                        /*                                                                                           */
                                        /* Le 20050830123056, je note qu'une valeur trop importante (par exemple 1/10 telle que la   */
                                        /* valeur par defaut de 'v $xci/Ising_3D.11$K PROBABILITE_DE_SELECTION_DES_POINTS_A_TESTER') */
                                        /* pose des problemes ('v $Dcourrier_in/20001208174958 N.est.trop.grand') ; une valeur plus  */
                                        /* faible (par exemple 1/100) semble mieux convenir, en particulier au voisinage de la       */
                                        /* temperature critique.                                                                     */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_basculer));
                                        /* Pour determiner le basculement du spin des points a tester.                               */
DEFV(Argument,DEFV(Float,constante_de_couplage_J));
                                        /* Constante de couplage 'J'.                                                                */
                                        /*                                                                                           */
                                        /* Le 20050831112804, le symbole 'energie_positive_J' a ete remplace par quelque chose de    */
                                        /* plus logique, a savoir 'constante_de_couplage_J'...                                       */
DEFV(Argument,DEFV(Float,temperature_locale));
                                        /* Temperature locale du modele (c'est-a-dire en chaque point {X,Y,Z}).                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01                    /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Amodele_d_Ising_3D_a_temperature_locale(albumR
                                                                           ,albumA
                                                                           ,graine_de_selection_des_points_a_tester
                                                                           ,probabilite_de_selection_des_points_a_tester
                                                                           ,graine_de_selection_des_points_a_basculer
                                                                           ,constante_de_couplage_J
                                                                           ,temperature_locale
                                                                            )
                                    )
                 )
     )
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR=Ising(albumA).                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument a traiter par le modele d'Ising tridimensionnel.                           */

                                        /* La notion d'increment des graines ci-apres a ete introduite le 20001211134636 afin de     */
                                        /* permettre des appels "iteratifs" de 'Amodele_d_Ising_3D(...)' avec la meme graine et      */
                                        /* sans que cela cree des artefacts. Une application de cela est de faire une simulation     */
                                        /* en deux temps en conservant donc une image intermediaire 'I' ; la poursuite du calcul     */
                                        /* sur l'image 'I' se fera en reprenant les memes graines que pour le calcul de 'I', mais    */
                                        /* en les incrementant de 'N' ou 'N' est le nombre d'iterations ayant conduit a 'I'...       */

DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_tester));
DEFV(Argument,DEFV(Float,probabilite_de_selection_des_points_a_tester));
                                        /* Pour choisir les points a tester.                                                         */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_basculer));
                                        /* Pour determiner le basculement du spin des points a tester.                               */
DEFV(Argument,DEFV(Float,constante_de_couplage_J));
                                        /* Constante de couplage 'J'.                                                                */
                                        /*                                                                                           */
                                        /* Le 20050831112804, le symbole 'energie_positive_J' a ete remplace par quelque chose de    */
                                        /* plus logique, a savoir 'constante_de_couplage_J'...                                       */
DEFV(Argument,DEFV(albumF,temperature_locale));
                                        /* Temperature locale du modele (c'est-a-dire en chaque point {X,Y,Z}).                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02                    /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

     Bblock
     /*..............................................................................................................................*/
     INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Amodele_d_Ising_3D;
                                        /* Initialisation si necessaire du noyau (dans le cas ou il est de plus utilise...).         */

     begin_album
          Bblock
          DEFV(Float,INIT(valeur_aleatoire_courante,FLOT__UNDEF));
                                        /* Valeur aleatoire "multi-usage" courante.                                                  */

          GENERATION_D_UN_NOMBRE_ALEATOIRE_DU_MODELE_D_ISING_3D(valeur_aleatoire_courante
                                                               ,PROBABILITE_NULLE
                                                               ,PROBABILITE_UNITE
                                                               ,graine_de_selection_des_points_a_tester
                                                                );

          Test(IFLE(valeur_aleatoire_courante,probabilite_de_selection_des_points_a_tester))
               Bblock
               DEFV(Positive,INIT(nombre_de_spins_negatifs,ZERO));
               DEFV(Positive,INIT(nombre_de_spins_____nuls,ZERO));
               DEFV(Positive,INIT(nombre_de_spins_positifs,ZERO));
                                        /* Comptabilite des differents signes possibles du "spin" (inutile au 20011203143813).       */
                                        /*                                                                                           */
                                        /* Le 20061122165341 je note que les trois variables precedentes ont le nom qu'elles ont     */
                                        /* afin que ceux-ci aient la meme longueur et ainsi ameliorent la mise en page...            */

               DEFV(Float,INIT(spin__X__Y__Z,FLOT__UNDEF));
                                        /* Spin du point courant {X,Y,Z}.                                                            */
               DEFV(Float,INIT(nouveau_spin__X__Y__Z,FLOT__UNDEF));
                                        /* Nouveau spin du point {X,Y,Z}.                                                            */
               DEFV(Float,INIT(cumul_des_spins_des_voisins_du_point__X__Y__Z,FZERO));
                                        /* Cumul des spins des voisins du point {X,Y,Z}. L'initialisation a 'FZERO' (et non pas      */
                                        /* a 'FLOT__UNDEF') est due a l'eventuelle utilisation d'un noyau...                         */
               DEFV(Float,INIT(variation_d_energie,FLOT__UNDEF));
                                        /* Valeur de la variation d'energie.                                                         */

               Test(IL_FAUT(Amodele_d_Ising_3D_____utiliser_un_noyau))
                                        /* On notera que l'introduction de ce 'Test(...)' le 20010220100000 a provoque un phenomene  */
                                        /* bizarre lors du traitement de l'image 'v $xiit/JFC.13$ROUGE' a des fins de test. Ainsi,   */
                                        /* ce test etant FAUX, ce qui saute la sequence "a noyau", le code execute est bien celui    */
                                        /* qui existait avant ("avec les six plus proches voisins") et doit donc donner les memes    */
                                        /* resultats qu'avant. Or il n'en est rien (des differences d'une unite apparaissent lors    */
                                        /* du 'Astore_point(...)' final), meme si la sequence suivante ("a noyau") est purement et   */
                                        /* simplement supprimee (puisqu'elle ne sert a rien dans ce test). Par contre, en            */
                                        /* supprimant ensuite les instructions :                                                     */
                                        /*                                                                                           */
                                        /*                  Test(IL_FAUT(Amodele_d_Ising_3D_____utiliser_un_noyau))                  */
                                        /*                       Bblock                                                              */
                                        /*                       Eblock                                                              */
                                        /*                  ATes                                                                     */
                                        /*                       Bblock                                                              */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                       Eblock                                                              */
                                        /*                  ETes                                                                     */
                                        /*                                                                                           */
                                        /* les resultats anterieurs (sur 'v $xiit/JFC.13$ROUGE') sont retrouves. Au passage, ce      */
                                        /* phenomene ne semble pas apparaitre si l'image de test est une image binaire (par          */
                                        /* exemple issue de '$xci/random.02$X'), alors que '$xiit/JFC.13$ROUGE' n'est pas binaire... */
                                        /*                                                                                           */
                                        /* Ces tests ont eu lieu sur 'SYSTEME_APC_LinuxDebian_GCC'...                                */
                    Bblock

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

                    DEFV(Float,INIT(spin_iX_jY_kZ,FLOT__UNDEF));
                                        /* Spin du point courant du voisinage du point {Xc,Yc,Zc}.                                   */

                    begin_albumQ(DoIn,Amodele_d_Ising_3D_____XYZmin_effectif,Amodele_d_Ising_3D_____XYZmax_effectif,PasZ
                                ,DoIn,Amodele_d_Ising_3D_____XYZmin_effectif,Amodele_d_Ising_3D_____XYZmax_effectif,PasY
                                ,DoIn,Amodele_d_Ising_3D_____XYZmin_effectif,Amodele_d_Ising_3D_____XYZmax_effectif,PasX
                                 )
                         Bblock
                                        /* ATTENTION : dans cette boucle {X,Y,Z} designent l'element courant du noyau, alors que     */
                                        /* {Xc,Yc,Zc} designent le point courant dont on etudie le voisinage...                      */

                         Test(I3ET(IZEQ(X),IZEQ(Y),IZEQ(Z)))
                              Bblock
                              ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X__Y__Z
                                                                   ,NEUT(Xc),ZERO
                                                                   ,NEUT(Yc),ZERO
                                                                   ,NEUT(Zc),ZERO
                                                                   ,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D
                                                                    );
                                        /* Traitement du point courant {Xc,Yc,Zc}.                                                   */
                              Eblock
                         ATes
                              Bblock
                              ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin_iX_jY_kZ
                                                                   ,ADD2(Xc,X),Amodele_d_Ising_3D_____delta_X
                                                                   ,ADD2(Yc,Y),Amodele_d_Ising_3D_____delta_Y
                                                                   ,ADD2(Zc,Z),Amodele_d_Ising_3D_____delta_Z
                                                                   ,ACCES_NOYAU_DANS_Amodele_d_Ising_3D(X,Y,Z)
                                                                    );
                                        /* Traitement du point courant {Xc+X,Yc+Y,Zc+Z} du voisinage du point {Xc,Yc,Zc}.            */
                              INCR(cumul_des_spins_des_voisins_du_point__X__Y__Z,spin_iX_jY_kZ);
                                        /* Et cumul des spins (ponderes...).                                                         */
                              Eblock
                         ETes
                         Eblock
                    end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

                    Eblock
               ATes
                    Bblock
                    DEFV(Float,INIT(spin_sX__Y__Z,FLOT__UNDEF));
                    DEFV(Float,INIT(spin__X_sY__Z,FLOT__UNDEF));
                    DEFV(Float,INIT(spin__X__Y_sZ,FLOT__UNDEF));
                    DEFV(Float,INIT(spin_pX__Y__Z,FLOT__UNDEF));
                    DEFV(Float,INIT(spin__X_pY__Z,FLOT__UNDEF));
                    DEFV(Float,INIT(spin__X__Y_pZ,FLOT__UNDEF));
                                        /* Spins des voisins du point {X,Y,Z}.                                                       */

                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X__Y__Z
                                                         ,NEUT(X),ZERO
                                                         ,NEUT(Y),ZERO
                                                         ,NEUT(Z),ZERO
                                                         ,PONDERATION_D_UN_POINT_DANS_Amodele_d_Ising_3D
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin_sX__Y__Z
                                                         ,SUCX(X),Amodele_d_Ising_3D_____delta_X
                                                         ,NEUT(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,NEUT(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point_sX__Y__Z
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X_sY__Z
                                                         ,NEUT(X),Amodele_d_Ising_3D_____delta_X
                                                         ,SUCY(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,NEUT(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point__X_sY__Z
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X__Y_sZ
                                                         ,NEUT(X),Amodele_d_Ising_3D_____delta_X
                                                         ,NEUT(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,SUCZ(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point__X__Y_sZ
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin_pX__Y__Z
                                                         ,PREX(X),Amodele_d_Ising_3D_____delta_X
                                                         ,NEUT(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,NEUT(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point_pX__Y__Z
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X_pY__Z
                                                         ,NEUT(X),Amodele_d_Ising_3D_____delta_X
                                                         ,PREY(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,NEUT(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point__X_pY__Z
                                                          );
                    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D(spin__X__Y_pZ
                                                         ,NEUT(X),Amodele_d_Ising_3D_____delta_X
                                                         ,NEUT(Y),Amodele_d_Ising_3D_____delta_Y
                                                         ,PREZ(Z),Amodele_d_Ising_3D_____delta_Z
                                                         ,Amodele_d_Ising_3D_____ponderation_du_point__X__Y_pZ
                                                          );
                                        /* Spins des points utiles avec ponderation eventuelle.                                      */

                    EGAL(cumul_des_spins_des_voisins_du_point__X__Y__Z
                        ,ADD6(spin_sX__Y__Z
                             ,spin__X_sY__Z
                             ,spin__X__Y_sZ
                             ,spin_pX__Y__Z
                             ,spin__X_pY__Z
                             ,spin__X__Y_pZ
                              )
                         );
                                        /* Cumul des spins des voisins du point {X,Y,Z}.                                             */
                    Eblock
               ETes

               EGAL(variation_d_energie
                   ,MUL3(Amodele_d_Ising_3D_____facteur_de_la_variation_d_energie
                        ,constante_de_couplage_J
                        ,MUL2(spin__X__Y__Z
                             ,cumul_des_spins_des_voisins_du_point__X__Y__Z
                              )
                         )
                    );
                                        /* Valeur de la variation d'energie obtenue principalement avec les spins des 6 plus proches */
                                        /* voisins.                                                                                  */

               Test(IZLE(variation_d_energie))
                    Bblock
                    EGAL(nouveau_spin__X__Y__Z,NEGA(spin__X__Y__Z));
                                        /* Lorsque la variation d'energie est negative le spin est inverse a priori, puisque cela    */
                                        /* abaisse donc l'energie du systeme, ce qu'il "prefere"...                                  */
                    Eblock
               ATes
                    Bblock
                                        /* Lorsque la variation d'energie est positive, l'inversion du spin est aleatoire :          */
                    GENERATION_D_UN_NOMBRE_ALEATOIRE_DU_MODELE_D_ISING_3D(valeur_aleatoire_courante
                                                                         ,PROBABILITE_NULLE
                                                                         ,PROBABILITE_UNITE
                                                                         ,graine_de_selection_des_points_a_basculer
                                                                          );

                    Test(IFLE(valeur_aleatoire_courante
                             ,EXPX(NEGA(DIVZ(variation_d_energie
                                            ,MUL2(Amodele_d_Ising_3D_____constante_de_Boltzmann
                                                 ,ACCES_A_LA_TEMPERATURE_DU_MODELE_D_ISING_3D(X,Y,Z)
                                                  )
                                             )
                                        )
                                   )
                              )
                         )
                         Bblock
                         EGAL(nouveau_spin__X__Y__Z,NEGA(spin__X__Y__Z));
                                        /* Le spin est inverse aleatoirement...                                                      */
                         Eblock
                    ATes
                         Bblock
                         EGAL(nouveau_spin__X__Y__Z,NEUT(spin__X__Y__Z));
                                        /* Le spin est conserve aleatoirement...                                                     */
                         Eblock
                    ETes
                    Eblock
               ETes

               Astore_point(__DENORMALISE_NIVEAU(HOMO(nouveau_spin__X__Y__Z
                                                     ,Amodele_d_Ising_3D_____spin_negatif,Amodele_d_Ising_3D_____spin_positif
                                                     ,______________NOIR_NORMALISE,______________BLANC_NORMALISE
                                                      )
                                                 )
                           ,albumR
                           ,X,Y,Z
                            );
                                        /* Le point courant {X,Y,Z} est modifie...                                                   */
               Eblock
          ATes
               Bblock
               Astore_point(Aload_point(albumA,X,Y,Z)
                           ,albumR
                           ,X,Y,Z
                            );
                                        /* Le point courant {X,Y,Z} n'est pas modifie...                                             */
               Eblock
          ETes
          Eblock
     end_album

     RETA(albumR);
     Eblock

EFonctionP

#undef    NIVEAU_HORS_ALBUM_DANS_Amodele_d_Ising_3D

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#    undef     ACCES_A_LA_TEMPERATURE_DU_MODELE_D_ISING_3D
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#    undef     ACCES_A_LA_TEMPERATURE_DU_MODELE_D_ISING_3D
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02

#undef    ACCES_A_UN_POINT_DU_MODELE_D_ISING_3D
#undef    GENERATION_D_UN_NOMBRE_ALEATOIRE_DU_MODELE_D_ISING_3D

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   D E   I S I N G   T R I D I M E N S I O N N E L   A   T E M P E R A T U R E   G L O B A L E  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Amodele_d_Ising_3D(albumR
                                                      ,albumA
                                                      ,graine_de_selection_des_points_a_tester
                                                      ,probabilite_de_selection_des_points_a_tester
                                                      ,graine_de_selection_des_points_a_basculer
                                                      ,constante_de_couplage_J
                                                      ,temperature_globale
                                                       )
                                    )
                 )
     )
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR=Ising(albumA).                                           */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument a traiter par le modele d'Ising tridimensionnel.                           */

                                        /* La notion d'increment des graines ci-apres a ete introduite le 20001211134636 afin de     */
                                        /* permettre des appels "iteratifs" de 'Amodele_d_Ising_3D(...)' avec la meme graine et      */
                                        /* sans que cela cree des artefacts. Une application de cela est de faire une simulation     */
                                        /* en deux temps en conservant donc une image intermediaire 'I' ; la poursuite du calcul     */
                                        /* sur l'image 'I' se fera en reprenant les memes graines que pour le calcul de 'I', mais    */
                                        /* en les incrementant de 'N' ou 'N' est le nombre d'iterations ayant conduit a 'I'...       */

DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_tester));
DEFV(Argument,DEFV(Float,probabilite_de_selection_des_points_a_tester));
                                        /* Pour choisir les points a tester.                                                         */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_basculer));
                                        /* Pour determiner le basculement du spin des points a tester.                               */
DEFV(Argument,DEFV(Float,constante_de_couplage_J));
                                        /* Constante de couplage 'J'.                                                                */
                                        /*                                                                                           */
                                        /* Le 20050831112804, le symbole 'energie_positive_J' a ete remplace par quelque chose de    */
                                        /* plus logique, a savoir 'constante_de_couplage_J'...                                       */
DEFV(Argument,DEFV(Float,temperature_globale));
                                        /* Temperature globale du modele (c'est-a-dire la meme quel que soit le point {X,Y,Z}).      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
     DEFV(Float,INIT(temperature_locale,FLOT__UNDEF));
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
     BDEFV(albumF,temperature_locale);
                                        /* Album flottant donnant la temperature en chaque point {X,Y,Z}, meme si dans le cas de     */
                                        /* 'Amodele_d_Ising_3D(...)', la temperature locale est uniforme (c'est-a-dire independante  */
                                        /* du point {X,Y,Z}).                                                                        */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02

     /*..............................................................................................................................*/

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
     EGAL(temperature_locale,temperature_globale);
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
     CALS(dAFinitialisation(temperature_locale,temperature_globale));
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02

     CALS(Amodele_d_Ising_3D_a_temperature_locale(albumR
                                                 ,albumA
                                                 ,graine_de_selection_des_points_a_tester
                                                 ,probabilite_de_selection_des_points_a_tester
                                                 ,graine_de_selection_des_points_a_basculer
                                                 ,constante_de_couplage_J
                                                 ,temperature_locale
                                                  )
          );
                                        /* Et calcul avec la meme temperature en chaque point {X,Y,Z}.                               */

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_01

#ifdef    Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
     EDEFV(albumF,temperature_locale);
                                        /* Album flottant donnant la temperature en chaque point {X,Y,Z}, meme si dans le cas de     */
                                        /* 'Amodele_d_Ising_3D(...)', la temperature locale est uniforme (c'est-a-dire independante  */
                                        /* du point {X,Y,Z}).                                                                        */
#Aifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02
#Eifdef   Amodele_d_Ising_3D_a_temperature_locale_VERSION_02

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   " S T A N D A R D "   -->   " F L O A T "   B R U T A L E   D ' U N   A L B U M  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Astd_float_brutal(albumR,albumA))))
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] converti.                       */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_fuite
          Bblock
          CALS(Istd_float_brutal(PAGE(albumR,Z),PAGE(albumA,Z)));
                                        /* Conversion de la page courante...                                                         */
          Eblock
     end_fuite

     RETAF(albumR);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P L A C E M E N T   D ' U N   A L B U M   N O N   S T A N D A R D  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(AFmove(albumR,albumA))))
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z].                                */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album
          Bblock
          AstoreF_point(AloadF_point(albumA,X,Y,Z),albumR,X,Y,Z);
          Eblock
     end_album

     RETAF(albumR);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E N S I T E   D ' U N   A L B U M  :                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    En chaque point {X,Y,Z} on definit une                                                                         */
/*                  densite par :                                                                                                    */
/*                                                          ______                                                                   */
/*                                                          \                        -Ke.distance({X,Y,Z},{X ,Y ,Z })                */
/*                                                           \                                              c  c  c                  */
/*                                      densite(X,Y,Z) = Kn. /     niveau(X ,Y ,Z ).e                                                */
/*                                                          /_____         c  c  c                                                   */
/*                                                                                                                                   */
/*                  ou les points {Xc,Yc,Zc} sont les points                                                                         */
/*                  d'un voisinage spherique de {X,Y,Z}.                                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   DIMENSION_DE_LA_BOITE_X                                                                                                       \
                    DOUP(demi_dim_X)
#define   DIMENSION_DE_LA_BOITE_Y                                                                                                       \
                    DOUP(demi_dim_Y)
#define   DIMENSION_DE_LA_BOITE_Z                                                                                                       \
                    DOUP(demi_dim_Z)
                                        /* Dimension de la boite a utiliser.                                                         */

#define   ACCES_EXPONENTIELLE_PONDEREE_D_UNE_DISTANCE(Xc,Yc,Zc,x,y,z)                                                                   \
                    IdTb3(matrice_des_distances                                                                                         \
                         ,INDX(SOUS(x,Xc),X_gauche)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_X                                                                                       \
                         ,INDX(SOUS(y,Yc),Y_bas___)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_Y                                                                                       \
                         ,INDX(SOUS(z,Zc),Z_front_)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_Z                                                                                       \
                          )                                                                                                             \
                                        /* Acces a la distance entre le point courant {x,y,z} et le centre {Xc,Yc,Zc} de la boite.   */

#define   DENS__cNORMALISE_OX(x)                                                                                                        \
                    MUL2(NomDeLaFonctionCourante QD@@__ _____facteur_de_normalisation_OX                                                \
                        ,OPC1(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_la_super_echelle)                                    \
                             ,SUPER_cNORMALISE_OX                                                                                       \
                             ,_____cNORMALISE_OX                                                                                        \
                             ,x                                                                                                         \
                              )                                                                                                         \
                         )
#define   DENS__cNORMALISE_OY(y)                                                                                                        \
                    MUL2(NomDeLaFonctionCourante QD@@__ _____facteur_de_normalisation_OY                                                \
                        ,OPC1(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_la_super_echelle)                                    \
                             ,SUPER_cNORMALISE_OY                                                                                       \
                             ,_____cNORMALISE_OY                                                                                        \
                             ,y                                                                                                         \
                              )                                                                                                         \
                         )
#define   DENS__cNORMALISE_OZ(z)                                                                                                        \
                    MUL2(NomDeLaFonctionCourante QD@@__ _____facteur_de_normalisation_OZ                                                \
                        ,OPC1(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_la_super_echelle)                                    \
                             ,SUPER_cNORMALISE_OZ                                                                                       \
                             ,_____cNORMALISE_OZ                                                                                        \
                             ,z                                                                                                         \
                              )                                                                                                         \
                         )
                                        /* Definitions introduites le 20101203153211...                                              */

#define   RENORM_EXPONENTIELLES(exponentielle)                                                                                          \
                    Bblock                                                                                                              \
                    EGAL(exponentielle                                                                                                  \
                        ,NORZ(exponentielle                                                                                             \
                             ,minimum_des_exponentielles                                                                                \
                             ,maximum_des_exponentielles                                                                                \
                             ,ZNE2(minimum_des_exponentielles                                                                           \
                                  ,maximum_des_exponentielles                                                                           \
                                  ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                    \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20140103083835...                                                 */

#define   DENSITE_TRIDIMENSIONNELLE_D_UN_ALBUM                                                                                          \
                    Bblock                                                                                                              \
                    DEFV(Float,DdTb3(POINTERf                                                                                           \
                                    ,matrice_des_distances                                                                              \
                                    ,DIMENSION_DE_LA_BOITE_X                                                                            \
                                    ,DIMENSION_DE_LA_BOITE_Y                                                                            \
                                    ,DIMENSION_DE_LA_BOITE_Z                                                                            \
                                    ,ADRESSE_NON_ENCORE_DEFINIE                                                                         \
                                     )                                                                                                  \
                         );                                                                                                             \
                                        /* Definition de la matrice des distances.                                                   */ \
                                                                                                                                        \
                    DEFV(Float,INIT(exponentielle_du_rayon_de_la_sphere_inscrite                                                        \
                                   ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_2014010310)                          \
                                        ,F_MOINS_L_INFINI                                                                               \
                                        ,F_INFINI                                                                                       \
                                         )                                                                                              \
                                    )                                                                                                   \
                         );                                                                                                             \
                                        /* Exponentielle du rayon de la sphere inscrite dans la boite.                               */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : jusqu'au 20091124115251 il y avait ci-dessus 'F_INFINI' par erreur. Mais      */ \
                                        /* le 20140103104022, je me suis rendu compte que ce n'etait pas une erreur !                */ \
                                                                                                                                        \
                    DEFV(Float,INIT(fXcentre_album,FLOT__UNDEF));                                                                       \
                    DEFV(Float,INIT(fYcentre_album,FLOT__UNDEF));                                                                       \
                    DEFV(Float,INIT(fZcentre_album,FLOT__UNDEF));                                                                       \
                                        /* Introduit le 20101205135947 apres avoir note une grave confusion entre le point           */ \
                                        /* {Xcentre,Ycentre,Zcentre} qui est le centre de l'album et le point                        */ \
                                        /* {X_centre,Y_centre,Z_centre} qui est le centre de la boite courante...                    */ \
                                                                                                                                        \
                    DEFV(Int,INIT(X_gauche,NEGA(demi_dim_X)));                                                                          \
                    DEFV(Int,INIT(X_centre,UNDEF));                                                                                     \
                    DEFV(Int,INIT(X_droite,NEUT(demi_dim_X)));                                                                          \
                                        /* Points interessants de l'axe 'OX' de la boite de calcul de la densite.                    */ \
                    DEFV(Int,INIT(Y_bas___,NEGA(demi_dim_Y)));                                                                          \
                    DEFV(Int,INIT(Y_centre,UNDEF));                                                                                     \
                    DEFV(Int,INIT(Y_haut__,NEUT(demi_dim_Y)));                                                                          \
                                        /* Points interessants de l'axe 'OY' de la boite de calcul de la densite.                    */ \
                    DEFV(Int,INIT(Z_front_,NEGA(demi_dim_Z)));                                                                          \
                    DEFV(Int,INIT(Z_centre,UNDEF));                                                                                     \
                    DEFV(Int,INIT(Z_back__,NEUT(demi_dim_Z)));                                                                          \
                                        /* Points interessants de l'axe 'OZ' de la boite de calcul de la densite.                    */ \
                                                                                                                                        \
                    DEFV(Float,INIT(minimum_des_exponentielles,F_INFINI));                                                              \
                    DEFV(Float,INIT(maximum_des_exponentielles,F_MOINS_L_INFINI));                                                      \
                                        /* Extrema des exponentielles en vue d'une eventuelle renormalisation...                     */ \
                                                                                                                                        \
                    MdTb3(matrice_des_distances                                                                                         \
                         ,DIMENSION_DE_LA_BOITE_X                                                                                       \
                         ,DIMENSION_DE_LA_BOITE_Y                                                                                       \
                         ,DIMENSION_DE_LA_BOITE_Z                                                                                       \
                         ,Float                                                                                                         \
                         ,ADRESSE_NON_ENCORE_DEFINIE                                                                                    \
                          );                                                                                                            \
                                        /* Allocation de la matrice des distances.                                                   */ \
                                                                                                                                        \
                    SAUVEGARDE_DE_LA_SUPER_ECHELLE;                                                                                     \
                                        /* ATTENTION : 'SAUVEGARDE_DE_LA_SUPER_ECHELLE' ne peut etre dans le 'Test(...)' qui         */ \
                                        /* suit a cause de 'v $xiii/vecteurs$DEF SAUVEGARDE_DE_LA_SUPER_ECHELLE'...                  */ \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_la_super_echelle))                                        \
                                        /* Test introduit le 20101203153211...                                                       */ \
                         Bblock                                                                                                         \
                         SUPER_ECHELLE_PETIT_CARRE;                                                                                     \
                                        /* De facon a ce que le referentiel soit norme...                                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    CALS(dAFinitialisation(albumR,FZERO));                                                                              \
                                        /* Initialisation a priori...                                                                */ \
                                                                                                                                        \
                    EGAL(X_centre,MOYE(X_gauche,X_droite));                                                                             \
                    EGAL(Y_centre,MOYE(Y_bas___,Y_haut__));                                                                             \
                    EGAL(Z_centre,MOYE(Z_front_,Z_back__));                                                                             \
                                        /* Calcul des centres relatifs aux axes 'OX', 'OY' et 'OZ'.                                  */ \
                                                                                                                                        \
                    Test(I3OU(IZNE(X_centre),IZNE(Y_centre),IZNE(Z_centre)))                                                            \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("le centre 'relatif' de la boite de calcul de la densite doit etre {0,0,0}");                     \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(fXcentre_album,DENS__cNORMALISE_OX(Xcentre));                                                                  \
                    EGAL(fYcentre_album,DENS__cNORMALISE_OY(Ycentre));                                                                  \
                    EGAL(fZcentre_album,DENS__cNORMALISE_OZ(Zcentre));                                                                  \
                                        /* Calcul introduit le 20101203112910...                                                     */ \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____faire_une_rotation))                                               \
                                        /* Possibilite introduite le 20101203112910...                                               */ \
                         Bblock                                                                                                         \
                         GENERATION_DE_LA_MATRICE_DE_ROTATION(vecteurs_____ordre_de_la_ROTATION_0X                                      \
                                                             ,T_ROTATION_X(NomDeLaFonctionCourante QD@@__ _____angle_de_ROTATION_OX);   \
                                                             ,vecteurs_____ordre_de_la_ROTATION_0Y                                      \
                                                             ,T_ROTATION_Y(NomDeLaFonctionCourante QD@@__ _____angle_de_ROTATION_OY);   \
                                                             ,vecteurs_____ordre_de_la_ROTATION_0Z                                      \
                                                             ,T_ROTATION_Z(NomDeLaFonctionCourante QD@@__ _____angle_de_ROTATION_OZ);   \
                                                              );                                                                        \
                                        /* Mise en place du produit des trois rotations relatives aux trois axes.                    */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    begin_albumQ(DoIn,Z_front_,Z_back__,PasZ                                                                            \
                                ,DoIn,Y_bas___,Y_haut__,PasY                                                                            \
                                ,DoIn,X_gauche,X_droite,PasX                                                                            \
                                 )                                                                                                      \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(exponentielle_de_la_distance_courante                                                          \
                                        ,MUL2(facteurN                                                                                  \
                                             ,EXEX(NEGA(MUL2(facteurD                                                                   \
                                                            ,PUIX(LIO2(NomDeLaFonctionCourante QD@@__ _____ponderation_RdisF3D          \
                                                                      ,RdisF3D(DENS__cNORMALISE_OX(X_centre)                            \
                                                                              ,DENS__cNORMALISE_OY(Y_centre)                            \
                                                                              ,DENS__cNORMALISE_OZ(Z_centre)                            \
                                                                              ,DENS__cNORMALISE_OX(X)                                   \
                                                                              ,DENS__cNORMALISE_OY(Y)                                   \
                                                                              ,DENS__cNORMALISE_OZ(Z)                                   \
                                                                               )                                                        \
                                                                      ,NomDeLaFonctionCourante QD@@__ _____ponderation_ASdisF3D         \
                                                                      ,ASdisF3D(DENS__cNORMALISE_OX(X_centre)                           \
                                                                               ,DENS__cNORMALISE_OY(Y_centre)                           \
                                                                               ,DENS__cNORMALISE_OZ(Z_centre)                           \
                                                                               ,DENS__cNORMALISE_OX(X)                                  \
                                                                               ,DENS__cNORMALISE_OY(Y)                                  \
                                                                               ,DENS__cNORMALISE_OZ(Z)                                  \
                                                                                )                                                       \
                                                                      ,FZERO                                                            \
                                                                       )                                                                \
                                                                 ,exposantD                                                             \
                                                                  )                                                                     \
                                                             )                                                                          \
                                                        )                                                                               \
                                                   )                                                                                    \
                                              )                                                                                         \
                                         )                                                                                              \
                              );                                                                                                        \
                                        /* Exponentielle distance entre le point courant et le centre de la boite.                   */ \
                                        /*                                                                                           */ \
                                        /* On notera au passage que le calcul de la racine carree dans 'RdisF3D(...)' pourrait etre  */ \
                                        /* considere comme redondant avec le calcul de puissance 'PUIX(RdisF3D(...),exposantD)'.     */ \
                                        /* En fait, cela n'est vrai que si l'exposant 'exposantD' est egal a 2 (cas par defaut) ;    */ \
                                        /* n'oublions pas le soucis de generalite...                                                 */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20100623110315 qu'en fait la fonction 'PUIX(RdisF3D(...))' donne en general  */ \
                                        /* des valeurs petites (de l'ordre de 0.0001). Ainsi pour que 'facteurD' est un effet        */ \
                                        /* significatif, il convient que sa valeur soit importante (de l'ordre de 1000 par exemple). */ \
                                        /*                                                                                           */ \
                                        /* Le 20140102115613 fut introduite la possibilite d'avoir des exponentielles "plates"       */ \
                                        /* (c'est-a-dire "tout ou rien', 0 ou 1) pour essayer de comprendre un probleme de non       */ \
                                        /* connexite de 'v $xiirv/PIPO.F1.21' lorsque la coordonnee 'Z' est renormalisee dans [0,1]. */ \
                                                                                                                                        \
                         EGAL(ACCES_EXPONENTIELLE_PONDEREE_D_UNE_DISTANCE(X_centre,Y_centre,Z_centre,X,Y,Z)                             \
                             ,exponentielle_de_la_distance_courante                                                                     \
                              );                                                                                                        \
                                        /* Initialisation de la matrice des distances.                                               */ \
                                                                                                                                        \
                         Test(IL_FAUT(renorm))                                                                                          \
                              Bblock                                                                                                    \
                              EGAL(minimum_des_exponentielles                                                                           \
                                  ,MIN2(exponentielle_de_la_distance_courante,minimum_des_exponentielles)                               \
                                   );                                                                                                   \
                              EGAL(maximum_des_exponentielles                                                                           \
                                  ,MAX2(exponentielle_de_la_distance_courante,maximum_des_exponentielles)                               \
                                   );                                                                                                   \
                                        /* Extrema des exponentielles en vue de leur renormalisation...                              */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(I3OU(I3ET(IFEQ(X,CHOI(X_gauche,X_droite))                                                                 \
                                       ,IFEQ(Y,Y_centre)                                                                                \
                                       ,IFEQ(Z,Z_centre)                                                                                \
                                        )                                                                                               \
                                  ,I3ET(IFEQ(X,X_centre)                                                                                \
                                       ,IFEQ(Y,CHOI(Y_bas___,Y_haut__))                                                                 \
                                       ,IFEQ(Z,Z_centre)                                                                                \
                                        )                                                                                               \
                                  ,I3ET(IFEQ(X,X_centre)                                                                                \
                                       ,IFEQ(Y,Y_centre)                                                                                \
                                       ,IFEQ(Z,CHOI(Z_front_,Z_back__))                                                                 \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              EGAL(exponentielle_du_rayon_de_la_sphere_inscrite                                                         \
                                  ,OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_2014010310)                           \
                                       ,MAX2                                                                                            \
                                       ,MIN2                                                                                            \
                                       ,exponentielle_de_la_distance_courante                                                           \
                                       ,exponentielle_du_rayon_de_la_sphere_inscrite                                                    \
                                        )                                                                                               \
                                   );                                                                                                   \
                                        /* L'exponentielle du rayon de la sphere inscrite dans la boite est calculee pour les points */ \
                                        /* extremes de la boite, c'est-a-dire les points situes sur les axes.                        */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : jusqu'au 20091124115251 il y avait ci-dessus 'MIN2(...)' par erreur car, en   */ \
                                        /* effet, il y a ci-apres un 'IFGE(...,exponentielle_du_rayon_de_la_sphere_inscrite)'...     */ \
                                        /* Mais le 20140103104022, je me suis rendu compte que ce n'etait pas une erreur !           */ \
                                        /*                                                                                           */ \
                                        /* On notera de plus que le rapport du nombre de points du cube (de cote 2) a celui de la    */ \
                                        /* sphere isncrite dans ce cube (de diametre 2 et donc de rayon 1) vaut :                    */ \
                                        /*                                                                                           */ \
                                        /*                       3          3                                                        */ \
                                        /*                      2          2                                                         */ \
                                        /*                  ---------- = ------- ~ 1.90                                              */ \
                                        /*                    4     3      4                                                         */ \
                                        /*                   ---pi.1      ---pi                                                      */ \
                                        /*                    3            3                                                         */ \
                                        /*                                                                                           */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    end_albumQ(EDoI,EDoI,EDoI)                                                                                          \
                                                                                                                                        \
                    Test(IL_FAUT(renorm))                                                                                               \
                         Bblock                                                                                                         \
                         begin_albumQ(DoIn,Z_front_,Z_back__,PasZ                                                                       \
                                     ,DoIn,Y_bas___,Y_haut__,PasY                                                                       \
                                     ,DoIn,X_gauche,X_droite,PasX                                                                       \
                                      )                                                                                                 \
                              Bblock                                                                                                    \
                              RENORM_EXPONENTIELLES(ACCES_EXPONENTIELLE_PONDEREE_D_UNE_DISTANCE(X_centre,Y_centre,Z_centre,X,Y,Z));     \
                                        /* Renormalisation des exponentielles...                                                     */ \
                              Eblock                                                                                                    \
                         end_albumQ(EDoI,EDoI,EDoI)                                                                                     \
                                                                                                                                        \
                         RENORM_EXPONENTIELLES(exponentielle_du_rayon_de_la_sphere_inscrite);                                           \
                                        /* Renormalisation du rayon de la sphere inscrite dans la boite...                           */ \
                                                                                                                                        \
                         Test(IFNE(minimum_des_exponentielles,maximum_des_exponentielles));                                             \
                              Bblock                                                                                                    \
                              EGAL(minimum_des_exponentielles,COORDONNEE_BARYCENTRIQUE_MINIMALE);                                       \
                              EGAL(maximum_des_exponentielles,COORDONNEE_BARYCENTRIQUE_MAXIMALE);                                       \
                                        /* Introduit le 20110907171331 pour preparer l'avenir...                                     */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(minimum_des_exponentielles,COORDONNEE_BARYCENTRIQUE_MAXIMALE);                                       \
                              EGAL(maximum_des_exponentielles,COORDONNEE_BARYCENTRIQUE_MAXIMALE);                                       \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    RESTAURATION_DE_LA_SUPER_ECHELLE;                                                                                   \
                                        /* Restauration du referentiel a priori (et systematique...).                                */ \
                                                                                                                                        \
                    begin_album_AvecEditionProgression                                                                                  \
                                        /* L'edition de la progression a ete introduite tardivement le 20170727102732...             */ \
                         Bblock                                                                                                         \
                         DEFV(Int,INIT(centre_boite_X,X));                                                                              \
                         DEFV(Int,INIT(centre_boite_Y,Y));                                                                              \
                         DEFV(Int,INIT(centre_boite_Z,Z));                                                                              \
                                        /* Definition du centre de la boite courante.                                                */ \
                         DEFV(Float,INIT(densite_courante,FZERO));                                                                      \
                                        /* Definition de la densite dans la boite courante...                                        */ \
                         DEFV(Int,INIT(nombre_de_points_dans_la_boite_interieurs_a_l_album,ZERO));                                      \
                                        /* Definition du nombre de points interieurs a l'album 'albumA' dans la boite (introduit     */ \
                                        /* le 20170818113438)...                                                                     */ \
                                                                                                                                        \
                         begin_albumQ(DoIn                                                                                              \
                                     ,COZA(SOUS(COZR(centre_boite_Z),demi_dim_Z))                                                       \
                                     ,COZA(ADD2(COZR(centre_boite_Z),demi_dim_Z))                                                       \
                                     ,PasZ                                                                                              \
                                     ,DoIn                                                                                              \
                                     ,COYA(SOUS(COYR(centre_boite_Y),demi_dim_Y))                                                       \
                                     ,COYA(ADD2(COYR(centre_boite_Y),demi_dim_Y))                                                       \
                                     ,PasY                                                                                              \
                                     ,DoIn                                                                                              \
                                     ,COXA(SOUS(COXR(centre_boite_X),demi_dim_X))                                                       \
                                     ,COXA(ADD2(COXR(centre_boite_X),demi_dim_X))                                                       \
                                     ,PasX                                                                                              \
                                      )                                                                                                 \
                              Bblock                                                                                                    \
                              DEFV(Float,INIT(exponentielle_de_la_distance_courante                                                     \
                                             ,ACCES_EXPONENTIELLE_PONDEREE_D_UNE_DISTANCE(centre_boite_X,centre_boite_Y,centre_boite_Z  \
                                                                                         ,X,Y,Z                                         \
                                                                                          )                                             \
                                              )                                                                                         \
                                   );                                                                                                   \
                              DEFV(Float,INIT(exponentielle_de_la_distance_courante_eventuellement_renormalisee,FLOT__UNDEF));          \
                                        /* Exponentielle de la distance entre le point courant et le centre de la boite.             */ \
                                                                                                                                        \
                              EGAL(exponentielle_de_la_distance_courante_eventuellement_renormalisee                                    \
                                  ,exponentielle_de_la_distance_courante                                                                \
                                   );                                                                                                   \
                                                                                                                                        \
                              Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_2014010308))                               \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IL_FAUT(renorm))                                                                                \
                                        Bblock                                                                                          \
                                        RENORM_EXPONENTIELLES(exponentielle_de_la_distance_courante_eventuellement_renormalisee);       \
                                        /* Introduit le 20140103083835 car, en effet, cela manquait...                               */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              Test(IFGE(exponentielle_de_la_distance_courante_eventuellement_renormalisee                               \
                                       ,exponentielle_du_rayon_de_la_sphere_inscrite                                                    \
                                        )                                                                                               \
                                   )                                                                                                    \
                                        /* Seuls les points situes a l'interieur de la sphere inscrite dans la boite courante vont   */ \
                                        /* etre traites. On notera au passage le test 'IFGE(...)' qui est inverse de celui que l'on  */ \
                                        /* ferait, a savoir 'IFLE(...)', si l'on testait directement les distances et non pas leurs  */ \
                                        /* exponentielles apres changement de signe...                                               */ \
                                   Bblock                                                                                               \
                                   DEFV(Float,INIT(exponentielle_de_la_distance_courante_dans_la_sphere_inscrite                        \
                                                  ,exponentielle_de_la_distance_courante                                                \
                                                   )                                                                                    \
                                        );                                                                                              \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20110908))                            \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_2014010308))                     \
                                             Bblock                                                                                     \
                                             EGAL(exponentielle_de_la_distance_courante_dans_la_sphere_inscrite                         \
                                                 ,HOMZ(exponentielle_de_la_distance_courante                                            \
                                                      ,exponentielle_du_rayon_de_la_sphere_inscrite                                     \
                                                      ,maximum_des_exponentielles                                                       \
                                                      ,minimum_des_exponentielles                                                       \
                                                      ,maximum_des_exponentielles                                                       \
                                                      ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                \
                                                       )                                                                                \
                                                  );                                                                                    \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             EGAL(exponentielle_de_la_distance_courante_dans_la_sphere_inscrite                         \
                                                 ,exponentielle_de_la_distance_courante_eventuellement_renormalisee                     \
                                                  );                                                                                    \
                                        /* En effet, le minimum n'est pas dans la sphere inscrite, mais a l'exterieur (et localise   */ \
                                        /* aux huit coins de la boite...). En fait, le minimum "effectif" est situe sur la           */ \
                                        /* circonference de la sphere, d'ou cette renormalisation...                                 */ \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____faire_une_rotation))                                \
                                        /* Possibilite introduite le 20101203112910...                                               */ \
                                        Bblock                                                                                          \
                                        DEFV(Float,INIT(Xf,SOUS(DENS__cNORMALISE_OX(X),fXcentre_album)));                               \
                                        DEFV(Float,INIT(Yf,SOUS(DENS__cNORMALISE_OY(Y),fYcentre_album)));                               \
                                        DEFV(Float,INIT(Zf,SOUS(DENS__cNORMALISE_OZ(Z),fZcentre_album)));                               \
                                        DEFV(Float,INIT(Xft,FLOT__UNDEF));                                                              \
                                        DEFV(Float,INIT(Yft,FLOT__UNDEF));                                                              \
                                        DEFV(Float,INIT(Zft,FLOT__UNDEF));                                                              \
                                        EGAL(Xft,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Xf,Yf,Zf,fXcentre_album));                            \
                                        EGAL(Yft,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Xf,Yf,Zf,fYcentre_album));                            \
                                        EGAL(Zft,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Xf,Yf,Zf,fZcentre_album));                            \
                                        /* Rotation des coordonnees.                                                                 */ \
                                        INCR(densite_courante                                                                           \
                                            ,MUL2(ACCES_A_UN_POINT_01_DE_L_ALBUM(Xft,Yft,Zft)                                           \
                                                 ,exponentielle_de_la_distance_courante_dans_la_sphere_inscrite                         \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Calcul de la densite dans la boite courante avec rotation (introduit le 20101203112910).  */ \
                                                                                                                                        \
                                        Test(ETL03(IFINff(Xft,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)      \
                                                  ,IFINff(Yft,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)      \
                                                  ,IFINff(Zft,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)      \
                                                   )                                                                                    \
                                             )                                                                                          \
                                        /* Test introduit le 20170818113438...                                                       */ \
                                             Bblock                                                                                     \
                                             INCR(nombre_de_points_dans_la_boite_interieurs_a_l_album,I);                               \
                                        /* Comptage des points effectivement utilises (introduit le 20170818113438)...               */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        INCR(densite_courante                                                                           \
                                            ,MUL2(COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____version_simplifiee)                  \
                                                      ,ACCES_SIMPLIFIE_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                     \
                                                      ,ACCES_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                               \
                                                       )                                                                                \
                                                 ,exponentielle_de_la_distance_courante_dans_la_sphere_inscrite                         \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Calcul de la densite dans la boite courante sans rotation...                              */ \
                                                                                                                                        \
                                        Test(TEST_DANS_L_ALBUM(X,Y,Z))                                                                  \
                                        /* Test introduit le 20170818113438...                                                       */ \
                                             Bblock                                                                                     \
                                             INCR(nombre_de_points_dans_la_boite_interieurs_a_l_album,I);                               \
                                        /* Comptage des points effectivement utilises (introduit le 20170818113438)...               */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         end_albumQ(EDoI,EDoI,EDoI)                                                                                     \
                                                                                                                                        \
                         Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20170818))                                      \
                                        /* Test introduit le 20170818113438...                                                       */ \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IZNE(nombre_de_points_dans_la_boite_interieurs_a_l_album))                                           \
                                   Bblock                                                                                               \
                                   EGAL(densite_courante,DIVI(densite_courante,nombre_de_points_dans_la_boite_interieurs_a_l_album));   \
                                        /* La normalisation de la densite relativement au nombre de points effectivement dans        */ \
                                        /* l'album 'albumA' a ete introduite le 20170818113438 lors de la mise au point de           */ \
                                        /* l'image 'v $xiirf/FRB3.z4.8.21'...                                                        */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   EGAL(densite_courante,FZERO);                                                                        \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         AstoreF_point(densite_courante,albumR,X,Y,Z);                                                                  \
                                        /* Memorisation de la densite au point {X,Y,Z}...                                            */ \
                         Eblock                                                                                                         \
                    end_album_AvecEditionProgression                                                                                    \
                                        /* L'edition de la progression a ete introduite tardivement le 20170727102732...             */ \
                                                                                                                                        \
                    FdTb3(matrice_des_distances                                                                                         \
                         ,DIMENSION_DE_LA_BOITE_X                                                                                       \
                         ,DIMENSION_DE_LA_BOITE_Y                                                                                       \
                         ,DIMENSION_DE_LA_BOITE_Z                                                                                       \
                         ,Float                                                                                                         \
                         ,ADRESSE_NON_ENCORE_DEFINIE                                                                                    \
                          );                                                                                                            \
                                        /* Liberation de la matrice des distances.                                                   */ \
                                        /*                                                                                           */ \
                                        /* Le 'ADRESSE_NON_ENCORE_DEFINIE' a ete introduit le 20050221164554...                      */ \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20091210080145 afin de creer 'AFdensite_standard(...)'.           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E N S I T E   D ' U N   A L B U M   " S T A N D A R D "  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____calculer_effectivement_une_densite,VRAI)));
                                        /* Permet de ne pas generer de densite et donc d'etre neutre (introduit le 20240829184232).  */

DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____compatibilite_20110908,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20110908083219 en           */
                                        /* ce qui concerne une seconde renormalisation des exponentielles a l'interieur de           */
                                        /* sphere inscrite...                                                                        */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____compatibilite_2014010308,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20140103083835...           */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____compatibilite_2014010310,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20140103104022...           */
                                        /*                                                                                           */
                                        /* Lorsque cette option n'est pas activee (ce qui est evidemment le cas par defaut...),      */
                                        /* les densites generees sont plus "epaisses" que ce qu'elles etaient avant la date du       */
                                        /* 20140103104022. Une solution est alors de diminuer les 'demi_dimension_?'s pour           */
                                        /* compenser : ainsi passer de "demi_dimension_?=4" a "demi_dimension_?=2" donne quelque     */
                                        /* chose d'un peu plus "maigre" mais assez comparable, comme le montrent les experiences     */
                                        /* faites aux environs du 20140103222349 avec 'v $xiirv/HILB.34.21' en mode 'Std' et 256     */
                                        /* couches...                                                                                */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que passer de "demi_dimension_?=4" a "demi_dimension_?=2" ne        */
                                        /* signifie pas diviser par 2 'demi_dimension_?', mais RETRANCHER 2...                       */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____compatibilite_20170818,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20170818113438...           */

#define   ACCES_SIMPLIFIE_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                                                                  \
                    FLOT(Aload_point_valide(albumA,X,Y,Z))                                                                              \
                                        /* Procedure introduite le 20170730100936...                                                 */
#define   ACCES_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                                                                            \
                    FLOT(FAload_point(albumA                                                                                            \
                                     ,X,Y,Z                                                                                             \
                                     ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                                  \
                                     ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                   \
                                     ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                   \
                                     ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                   \
                                     ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_hors_album)                                       \
                                      )                                                                                                 \
                         )                                                                                                              \
                                        /* Procedure introduite le 20091210080145...                                                 */ \
                                        /*                                                                                           */ \
                                        /* Le 'GENP(...)' fut introduit le 20091218110248 car, en effet, il manquait ! Cela s'est    */ \
                                        /* vu uniquement sur 'maubert.polytechnique.fr' (equivalent a '$CMAP28') ou les densites     */ \
                                        /* calculees presentaient des anomalies sur les quatre bords...). Au passage, j'ai du mal    */ \
                                        /* a comprendre pourquoi seule 'maubert.polytechnique.fr' etait victime de ce probleme et    */ \
                                        /* non pas toutes les MACHINEs '$CMAP28'. On notera qu'a cette date, ces MACHINEs            */ \
                                        /* fonctionnaient en mode '$FoncArgs_VERSION_01' donc sans le "cast" automatique des         */ \
                                        /* des arguments des fonctions (que fournit le mode '$FoncArgs_VERSION_02') et donc          */ \
                                        /* cela aurait du provoquer la meme anomalie sur toutes les MACHINEs '$CMAP28' ce qui ne     */ \
                                        /* fut pas le cas (a ce propos voir 'v $xtc/CastArgumentsFonction.01$c' qui met en evidence  */ \
                                        /* des differences de comportement sur toutes les MACHINEs '$CMAP28' a partir d'un meme      */ \
                                        /* executable '$X'...).                                                                      */
#define   ACCES_A_UN_POINT_01_DE_L_ALBUM(Xf,Yf,Zf)                                                                                      \
                    FLOT(FAload_point_coordonnees_01(albumA                                                                             \
                                                    ,Xf,Yf,Zf                                                                           \
                                                    ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                   \
                                                    ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                    \
                                                    ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                    \
                                                    ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                    \
                                                    ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_hors_album)                        \
                                                     )                                                                                  \
                         )                                                                                                              \
                                        /* Procedure introduite le 20091210080145...                                                 */

DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____version_simplifiee,FAUX)));
                                        /* Afin de pouvoir acceder a une version simplifiee introduite le 20170730100936...          */

DEFV(Common,DEFV(genere_Float,SINT(AFdensite_standard_____ponderation_RdisF3D,FU)));
DEFV(Common,DEFV(genere_Float,SINT(AFdensite_standard_____ponderation_ASdisF3D,FZERO)));
                                        /* Choix de la distance {RdisF3D,ASdisF3D} introduit le 20170730105155...                    */

DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____facteur_de_normalisation_OX,FU)));
DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____facteur_de_normalisation_OY,FU)));
DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____facteur_de_normalisation_OZ,FU)));
                                        /* Possibilite introduite le 20140103110807. On notera qu'en general seul le facteur         */
                                        /* relatif a 'OZ' sera utile et sa valeur (inferieure a 1) correspondra au fait que          */
                                        /* cet axe 'OZ' est le plupart du temps plus court que les deux autres. Sa valeur sera       */
                                        /* alors egal au rapport 'dimZ/dimX' ou 'dimZ/dimY'...                                       */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____utiliser_la_super_echelle,VRAI)));
                                        /* Possibilite introduite le 20101203153211...                                               */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____faire_une_rotation,FAUX)));
DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____angle_de_ROTATION_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____angle_de_ROTATION_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFdensite_standard_____angle_de_ROTATION_OZ,FZERO)));
                                        /* Possibilite introduite le 20101203112910...                                               */

DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721104900).             */
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_standard_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_Float,SINT(AFdensite_standard_____niveau_hors_album,FZERO)));
                                        /* Options par defaut du niveau "hors-album".                                                */
                                        /*                                                                                           */
                                        /* On notera qu'il s'agit d'un 'genere_Float' (et non pas d'un 'genere_p' comme il           */
                                        /* conviendrait) a cause de 'v $xci/densite_3D.11$K GET_ARGUMENTS2_F..niveau_hors_image..'.  */

DEFV(Common,DEFV(FonctionF,POINTERF(AFdensite_standard(albumR
                                                      ,albumA
                                                      ,demi_dim_X,demi_dim_Y,demi_dim_Z
                                                      ,facteurN
                                                      ,facteurD,exposantD
                                                      ,renorm
                                                       )
                                    )
                 )
     )
                                        /* Fonction introduite le 20091210080145...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=densite(albumA[X][Y][Z]).                       */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(Positive,demi_dim_X));
DEFV(Argument,DEFV(Positive,demi_dim_Y));
DEFV(Argument,DEFV(Positive,demi_dim_Z));
                                        /* Demi-dimension de la boite centree en chaque point {X,Y,Z} dans laquelle on calcule la    */
                                        /* densite.                                                                                  */
DEFV(Argument,DEFV(Float,facteurN));
                                        /* Facteur du niveau.                                                                        */
DEFV(Argument,DEFV(Float,facteurD));
                                        /* Facteur de la distance.                                                                   */
                                        /*                                                                                           */
                                        /* On notera le 20100623110315 qu'en fait la fonction 'PUIX(RdisF3D(...))' donne en general  */
                                        /* des valeurs petites (de l'ordre de 0.0001). Ainsi pour que 'facteurD' est un effet        */
                                        /* significatif, il convient que sa valeur soit importante (de l'ordre de 1000 par exemple). */
DEFV(Argument,DEFV(Float,exposantD));
                                        /* Exposant de la distance.                                                                  */
DEFV(Argument,DEFV(Logical,renorm));
                                        /* Faut-il renormaliser les exponentielles ?                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IL_FAUT(AFdensite_standard_____calculer_effectivement_une_densite))
                                        /* Test introduit le 20240829184232...                                                       */
          Bblock
          DENSITE_TRIDIMENSIONNELLE_D_UN_ALBUM;
          Eblock
     ATes
          Bblock
          CALS(Astd_float_brutal(albumR,albumA));
                                        /* Cas ou la nature "neutre" de la densite est demandee (introduit le 20240829184232         */
                                        /* afin d'accelerer 'v $xiirc/.MANE.41.2.$U .xci.densite_3D.11.X'...).                       */
          Eblock
     ETes

     RETAF(albumR);
     Eblock

#undef    ACCES_A_UN_POINT_01_DE_L_ALBUM
#undef    ACCES_A_UN_POINT_DE_L_ALBUM
#undef    ACCES_SIMPLIFIE_A_UN_POINT_DE_L_ALBUM

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E N S I T E   D ' U N   A L B U M   " N O N   S T A N D A R D "  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____calculer_effectivement_une_densite,VRAI)));
                                        /* Permet de ne pas generer de densite et donc d'etre neutre (introduit le 20240829184232).  */

DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____compatibilite_20110908,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20110908083219 en           */
                                        /* ce qui concerne une seconde renormalisation des exponentielles a l'interieur de           */
                                        /* sphere inscrite...                                                                        */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____compatibilite_2014010308,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20140103083835...           */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____compatibilite_2014010310,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20140103104022...           */
                                        /*                                                                                           */
                                        /* Lorsque cette option n'est pas activee (ce qui est evidemment le cas par defaut...),      */
                                        /* les densites generees sont plus "epaisses" que ce qu'elles etaient avant la date du       */
                                        /* 20140103104022. Une solution est alors de diminuer les 'demi_dimension_?'s pour           */
                                        /* compenser : ainsi passer de "demi_dimension_?=4" a "demi_dimension_?=2" donne quelque     */
                                        /* chose d'un peu plus "maigre" mais assez comparable, comme le montrent les experiences     */
                                        /* faites aux environs du 20140103222349 avec 'v $xiirv/HILB.34.21' en mode 'Std' et 256     */
                                        /* couches...                                                                                */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que passer de "demi_dimension_?=4" a "demi_dimension_?=2" ne        */
                                        /* signifie pas diviser par 2 'demi_dimension_?', mais RETRANCHER 2...                       */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____compatibilite_20170818,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20170818113438...           */

#define   ACCES_SIMPLIFIE_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                                                                  \
                    AloadF_point_valide(albumA,X,Y,Z)                                                                                   \
                                        /* Procedure introduite le 20170730100936...                                                 */
#define   ACCES_A_UN_POINT_DE_L_ALBUM(X,Y,Z)                                                                                            \
                    FFAload_point(albumA                                                                                                \
                                 ,X,Y,Z                                                                                                 \
                                 ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                                      \
                                 ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                       \
                                 ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                       \
                                 ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                       \
                                 ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album                                                 \
                                  )                                                                                                     \
                                        /* Procedure introduite le 20091210080145...                                                 */
#define   ACCES_A_UN_POINT_01_DE_L_ALBUM(Xf,Yf,Zf)                                                                                      \
                    FFAload_point_coordonnees_01(albumA                                                                                 \
                                                ,Xf,Yf,Zf                                                                               \
                                                ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                       \
                                                ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                        \
                                                ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                        \
                                                ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                        \
                                                ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album                                  \
                                                 )                                                                                      \
                                        /* Procedure introduite le 20101203112910...                                                 */

DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____version_simplifiee,FAUX)));
                                        /* Afin de pouvoir acceder a une version simplifiee introduite le 20170730100936...          */

DEFV(Common,DEFV(genere_Float,SINT(AFdensite_non_standard_____ponderation_RdisF3D,FU)));
DEFV(Common,DEFV(genere_Float,SINT(AFdensite_non_standard_____ponderation_ASdisF3D,FZERO)));
                                        /* Choix de la distance {RdisF3D,ASdisF3D} introduit le 20170730105155...                    */

DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____facteur_de_normalisation_OX,FU)));
DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____facteur_de_normalisation_OY,FU)));
DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____facteur_de_normalisation_OZ,FU)));
                                        /* Possibilite introduite le 20140103110807. On notera qu'en general seul le facteur         */
                                        /* relatif a 'OZ' sera utile et sa valeur (inferieure a 1) correspondra au fait que          */
                                        /* cet axe 'OZ' est le plupart du temps plus court que les deux autres. Sa valeur sera       */
                                        /* alors egal au rapport 'dimZ/dimX' ou 'dimZ/dimY'...                                       */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____utiliser_la_super_echelle,VRAI)));
                                        /* Possibilite introduite le 20101203153211...                                               */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____faire_une_rotation,FAUX)));
DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____angle_de_ROTATION_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____angle_de_ROTATION_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFdensite_non_standard_____angle_de_ROTATION_OZ,FZERO)));
                                        /* Possibilite introduite le 20101203112910...                                               */

DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721104900).             */
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdensite_non_standard_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_Float,SINT(AFdensite_non_standard_____niveau_hors_album,FZERO)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(FonctionF,POINTERF(AFdensite_non_standard(albumR
                                                          ,albumA
                                                          ,demi_dim_X,demi_dim_Y,demi_dim_Z
                                                          ,facteurN
                                                          ,facteurD,exposantD
                                                          ,renorm
                                                           )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=densite(albumA[X][Y][Z]).                       */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(Positive,demi_dim_X));
DEFV(Argument,DEFV(Positive,demi_dim_Y));
DEFV(Argument,DEFV(Positive,demi_dim_Z));
                                        /* Demi-dimension de la boite centree en chaque point {X,Y,Z} dans laquelle on calcule la    */
                                        /* densite.                                                                                  */
DEFV(Argument,DEFV(Float,facteurN));
                                        /* Facteur du niveau.                                                                        */
DEFV(Argument,DEFV(Float,facteurD));
                                        /* Facteur de la distance.                                                                   */
                                        /*                                                                                           */
                                        /* On notera le 20100623110315 qu'en fait la fonction 'PUIX(RdisF3D(...))' donne en general  */
                                        /* des valeurs petites (de l'ordre de 0.0001). Ainsi pour que 'facteurD' est un effet        */
                                        /* significatif, il convient que sa valeur soit importante (de l'ordre de 1000 par exemple). */
DEFV(Argument,DEFV(Float,exposantD));
                                        /* Exposant de la distance.                                                                  */
DEFV(Argument,DEFV(Logical,renorm));
                                        /* Faut-il renormaliser les exponentielles ?                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IL_FAUT(AFdensite_non_standard_____calculer_effectivement_une_densite))
                                        /* Test introduit le 20240829184232...                                                       */
          Bblock
          DENSITE_TRIDIMENSIONNELLE_D_UN_ALBUM;
          Eblock
     ATes
          Bblock
          CALS(AFmove(albumR,albumA));
                                        /* Cas ou la nature "neutre" de la densite est demandee (introduit le 20240829184232         */
                                        /* afin d'accelerer 'v $xiirc/.MANE.41.2.$U .xci.densite_3D.11.X'...).                       */
          Eblock
     ETes

     RETAF(albumR);
     Eblock

#undef    ACCES_A_UN_POINT_01_DE_L_ALBUM
#undef    ACCES_A_UN_POINT_DE_L_ALBUM
#undef    ACCES_SIMPLIFIE_A_UN_POINT_DE_L_ALBUM

EFonctionF

#undef    DENSITE_TRIDIMENSIONNELLE_D_UN_ALBUM

#undef    RENORM_EXPONENTIELLES

#undef    DENS__cNORMALISE_OZ
#undef    DENS__cNORMALISE_OY
#undef    DENS__cNORMALISE_OX

#undef    ACCES_EXPONENTIELLE_PONDEREE_D_UNE_DISTANCE

#undef    DIMENSION_DE_LA_BOITE_Z
#undef    DIMENSION_DE_LA_BOITE_Y
#undef    DIMENSION_DE_LA_BOITE_X

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   N O Y A U   G E N E R A L   E T   C O M M U N   D E   C O N V O L U T I O N                    */
/*        D E S   A L B U M S   N O N   S T A N D A R D S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721104900).             */
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(AFFconvolution_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */

#define   NIVEAU_HORS_ALBUM_DANS_AFFconvolution                                                                                         \
                    FZERO                                                                                                               \
                                        /* Niveaux "speciaux"...                                                                     */
DEFV(Common,DEFV(genere_Float,ZINT(AFFconvolution_____niveau_hors_album,NIVEAU_HORS_ALBUM_DANS_AFFconvolution)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(Logical,INIT(AFFconvolution_____initialiser_le_noyau,VRAI)));
DEFV(Common,DEFV(Int,ZINT(AFFconvolution_____demi_dimension_effective_du_noyau
                         ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_AFFconvolution
                          )
                 )
     );
DEFV(Common,DEFV(Float,DTb3(AFFconvolution_____noyau,DimNo_AFFconvolution,DimNo_AFFconvolution,DimNo_AFFconvolution)));
DEFV(Common,DEFV(Float,INIT(POINTERf(PAFFconvolution_____noyau)
                           ,ADRESSE(ACCES_NOYAU_DANS_AFFconvolution(AFFconvolution_____XYZmin
                                                                   ,AFFconvolution_____XYZmin
                                                                   ,AFFconvolution_____XYZmin
                                                                    )
                                    )
                            )
                 )
     );
                                        /* Definition du noyau a utiliser dans 'AFFconvolution(...)', ainsi que d'un indicateur      */
                                        /* precisant si l'initialisation doit etre faite et de la demi-dimension effective           */
                                        /* (inferieure ou egale a 'DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_AFFconvolution'             */
                                        /* de ce dernier.                                                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, la ligne relative a 'DTb3(...)' doit tenir sur une seule ligne a cause de      */
                                        /* '$xcg/gen.ext$Z'...                                                                       */

#undef    NIVEAU_HORS_ALBUM_DANS_AFFconvolution

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   F L O T T A N T E   S I M P L I F I E E   D ' U N   A L B U M   N O N   S T A N D A R D  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

#define   ACCES_A_UN_POINT_DE_AFFconvolution(x,y,z,ponderation_de_ce_point)                                                             \
                    Bblock                                                                                                              \
                    DEFV(genere_Float,INIT(niveau_courant,FLOT__NIVEAU_UNDEF));                                                         \
                                        /* Niveau du point courant du voisinage du point {Xc,Yc,Zc}.                                 */ \
                    DEFV(Float,INIT(ponderation_courante,ponderation_de_ce_point));                                                     \
                                        /* Ponderation associee au point {x,y,z} donnee par le noyau...                              */ \
                                                                                                                                        \
                    EGAL(niveau_courant                                                                                                 \
                        ,MUL2(ponderation_courante                                                                                      \
                             ,FFAload_point(albumA                                                                                      \
                                           ,x,y,z                                                                                       \
                                           ,AFFconvolution_____periodiser_X                                                             \
                                           ,AFFconvolution_____periodiser_Y                                                             \
                                           ,AFFconvolution_____periodiser_Z                                                             \
                                           ,AFFconvolution_____symetriser_X                                                             \
                                           ,AFFconvolution_____symetriser_Y                                                             \
                                           ,AFFconvolution_____symetriser_Z                                                             \
                                           ,AFFconvolution_____prolonger_X                                                              \
                                           ,AFFconvolution_____prolonger_Y                                                              \
                                           ,AFFconvolution_____prolonger_Z                                                              \
                                           ,AFFconvolution_____niveau_hors_album                                                        \
                                            )                                                                                           \
                              )                                                                                                         \
                         );                                                                                                             \
                                                                                                                                        \
                    INCR(cumul_ponderes_des_niveaux_des_points,niveau_courant);                                                         \
                                        /* Et cumul des niveaux (ponderes...).                                                       */ \
                    INCR(nombre_de_points_utilises_dans_le_noyau,COND(IZNE(ponderation_courante),I,ZERO));                              \
                                        /* Et comptage des points correspondant a une valeur non nulle du noyau...                   */ \
                    Eblock                                                                                                              \
                                        /* Acces au spin associe a un point {x,y,z}.                                                 */

DEFV(Common,DEFV(FonctionF,POINTERF(AFFconvolution(albumR,albumA))))
                                        /* On notera que :                                                                           */
                                        /*                                                                                           */
                                        /*                  AFFconvolution_____demi_dimension_effective_du_noyau                     */
                                        /*                  PAFFconvolution_____noyau                                                */
                                        /*                                                                                           */
                                        /* constituent deux Arguments implicites de 'AFFconvolution(...)'...                         */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=convolution(albumA).                                     */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a convoluer.                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_AFFconvolution;
                                        /* Initialisation si necessaire du noyau (dans le cas ou il est de plus utilise...).         */

     begin_album
          Bblock
          DEFV(Float,INIT(cumul_ponderes_des_niveaux_des_points,FZERO));
                                        /* Cumul des niveaux ponderes dans le voisinage du point {Xc,Yc,Zc}.                         */
          DEFV(Positive,INIT(nombre_de_points_utilises_dans_le_noyau,ZERO));
                                        /* Et nombre de points utilises dans le voisinage du point {Xc,Yc,Zc}, c'est-a-dire de       */
                                        /* points pour lesquels la ponderation correspondante dans le noyau n'est pas nulle...       */

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

          begin_albumQ(DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasZ
                      ,DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasY
                      ,DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasX
                       )
               Bblock
                                        /* ATTENTION : dans cette boucle {X,Y,Z} designent l'element courant du noyau, alors que     */
                                        /* {Xc,Yc,Zc} designent le point courant dont on etudie le voisinage...                      */

               ACCES_A_UN_POINT_DE_AFFconvolution(ADD2(Xc,X)
                                                 ,ADD2(Yc,Y)
                                                 ,ADD2(Zc,Z)
                                                 ,ACCES_NOYAU_DANS_AFFconvolution(X,Y,Z)
                                                  );
                                        /* Traitement du point courant {Xc+X,Yc+Y,Zc+Z} du voisinage du point {Xc,Yc,Zc}.            */
               Eblock
          end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

          AstoreF_point(DIVZ(cumul_ponderes_des_niveaux_des_points,FLOT(nombre_de_points_utilises_dans_le_noyau))
                       ,albumR
                       ,X,Y,Z
                        );
                                        /* Memorisation du cumul pondere des niveaux dans le voisinage du point {Xc,Yc,Zc}.          */

          Eblock
     end_album

     RETAF(albumR);
     Eblock

#undef    ACCES_A_UN_POINT_DE_AFFconvolution

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   F L O T T A N T E   D E   S E U I L L A G E                                                        */
/*        D ' U N   A L B U M   N O N   S T A N D A R D  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(AFFconvolution_de_seuillage(albumR
                                                               ,albumA
                                                               ,seuil
                                                               ,niveau_inferieur
                                                               ,niveau_median
                                                               ,niveau_superieur
                                                                )
                                    )
                 )
     )
                                        /* On notera que :                                                                           */
                                        /*                                                                                           */
                                        /*                  AFFconvolution_____demi_dimension_effective_du_noyau                     */
                                        /*                  PAFFconvolution_____noyau                                                */
                                        /*                                                                                           */
                                        /* constituent deux Arguments implicites de 'AFFconvolution_de_seuillage(...)'...            */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=convolution(albumA).                                     */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a convoluer.                                                               */
DEFV(Argument,DEFV(genere_Float,seuil));
                                        /* Seuil de selection de l'un des trois {niveau_inferieur,niveau_median,niveau_superieur}.   */
DEFV(Argument,DEFV(genere_Float,niveau_inferieur));
DEFV(Argument,DEFV(genere_Float,niveau_median));
DEFV(Argument,DEFV(genere_Float,niveau_superieur));
                                        /* Niveaux de marquage de la position de 'niveau_minimal_dans_le_voisinage' et de            */
                                        /* 'niveau_maximal_dans_le_voisinage' par rapport a 'seuil'.                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_AFFconvolution;
                                        /* Initialisation si necessaire du noyau (dans le cas ou il est de plus utilise...).         */

     begin_album
          Bblock
          DEFV(genere_Float,INIT(niveau_de_marquage,FLOT__NIVEAU_UNDEF));
                                        /* Futur niveau de marquage du point {X,Y,Z}.                                                */
          DEFV(genere_Float,INIT(niveau_minimal_dans_le_voisinage,F_INFINI));
          DEFV(genere_Float,INIT(niveau_maximal_dans_le_voisinage,F_MOINS_L_INFINI));
                                        /* Extrema des niveaux dans le voisinage du point {X,Y,Z}.                                   */

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

          begin_albumQ(DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasZ
                      ,DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasY
                      ,DoIn,AFFconvolution_____XYZmin_effectif,AFFconvolution_____XYZmax_effectif,PasX
                       )
               Bblock
                                        /* ATTENTION : dans cette boucle {X,Y,Z} designent l'element courant du noyau, alors que     */
                                        /* {Xc,Yc,Zc} designent le point courant dont on etudie le voisinage...                      */
               Test(IZNE(ACCES_NOYAU_DANS_AFFconvolution(X,Y,Z)))
                                        /* C'est la non nullite du noyau qui assure la selection des points qui vont etre testes     */
                                        /* dans le voisinage du point {Xc,Yc,Zc}.                                                    */
                    Bblock
                    DEFV(genere_Float,INIT(niveau_courant
                                          ,FFAload_point(albumA
                                                        ,ADD2(Xc,X),ADD2(Yc,Y),ADD2(Zc,Z)
                                                        ,AFFconvolution_____periodiser_X
                                                        ,AFFconvolution_____periodiser_Y
                                                        ,AFFconvolution_____periodiser_Z
                                                        ,AFFconvolution_____symetriser_X
                                                        ,AFFconvolution_____symetriser_Y
                                                        ,AFFconvolution_____symetriser_Z
                                                        ,AFFconvolution_____prolonger_X
                                                        ,AFFconvolution_____prolonger_Y
                                                        ,AFFconvolution_____prolonger_Z
                                                        ,AFFconvolution_____niveau_hors_album
                                                         )
                                           )
                         );
                                        /* Niveau du point courant du voisinage du point {Xc,Yc,Zc}.                                 */

                    EGAL(niveau_minimal_dans_le_voisinage,MIN2(niveau_courant,niveau_minimal_dans_le_voisinage));
                    EGAL(niveau_maximal_dans_le_voisinage,MAX2(niveau_courant,niveau_maximal_dans_le_voisinage));
                                        /* Extrema des niveaux dans le voisinage du point {Xc,Yc,Zc}.                                */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

          Test(IFET(IFLT(niveau_minimal_dans_le_voisinage,seuil)
                   ,IFGT(niveau_maximal_dans_le_voisinage,seuil)
                    )
               )
               Bblock
               EGAL(niveau_de_marquage,niveau_median);
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  minimum < seuil < maximum                                                */
                                        /*                                                                                           */
               Eblock
          ATes
               Bblock
               Test(IFET(IFLT(niveau_minimal_dans_le_voisinage,seuil)
                        ,IFLE(niveau_maximal_dans_le_voisinage,seuil)
                         )
                    )
                    Bblock
                    EGAL(niveau_de_marquage,niveau_inferieur);
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  minimum < maximum <= seuil                                               */
                                        /*                                                                                           */
                    Eblock
               ATes
                    Bblock
                    Test(IFET(IFGE(niveau_minimal_dans_le_voisinage,seuil)
                             ,IFGT(niveau_maximal_dans_le_voisinage,seuil)
                              )
                         )
                         Bblock
                         EGAL(niveau_de_marquage,niveau_superieur);
                                        /* Cas :                                                                                     */
                                        /*                                                                                           */
                                        /*                  seuil <= minimum < maximum                                               */
                                        /*                                                                                           */
                         Eblock
                    ATes
                         Bblock
                         PRINT_ATTENTION("relation d'ordre non prevue entre {minimum,maximum} et le seuil");
                         Eblock
                    ETes
                    Eblock
               ETes
               Eblock
          ETes

          AstoreF_point(niveau_de_marquage
                       ,albumR
                       ,X,Y,Z
                        );
                                        /* Et on convolue point par point en marquant la position par rapport a 'seuil'...           */

          Eblock
     end_album

     RETAF(albumR);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   E R O S I O N  :                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce modele est tres inspire de celui                                                                            */
/*                  de Andrea Baldassarri et de Bernard                                                                              */
/*                  Sapoval. Il consiste en espace tridimensionnel                                                                   */
/*                  de points P(x,y,z). Les points a valeurs negatives                                                               */
/*                  correspond a la terre et les points a valeurs                                                                    */
/*                  positives a la mer. Les points de la terre qui                                                                   */
/*                  sont proches de la mer s'affaiblissent au cours                                                                  */
/*                  du temps et la force de la mer diminue lorsque                                                                   */
/*                  la surface de la cote augmente...                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01));
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02));
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#define   UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA_TERRE(etat)                                                                         \
                    IFLT(etat,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D)
#define   UN_POINT_D_ERODE______COTES_3D_EST__INDETERMINE(etat)                                                                         \
                    IFEQ(etat,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D)
#define   UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA___MER(etat)                                                                         \
                    IFGT(etat,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D)
                                        /* Pour connaitre le type de localisation du point courant...                                */

#define   ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat,x,dx,y,dy,z,dz,ponderation_de_ce_point)                                           \
                    Bblock                                                                                                              \
                    EGAL(etat                                                                                                           \
                        ,MUL2(ponderation_de_ce_point                                                                                   \
                             ,FFAload_point(albumA                                                                                      \
                                           ,ADD2(x,dx),ADD2(y,dy),ADD2(z,dz)                                                            \
                                           ,Aerode__CoastLines_3D_____periodiser_X                                                      \
                                           ,Aerode__CoastLines_3D_____periodiser_Y                                                      \
                                           ,Aerode__CoastLines_3D_____periodiser_Z                                                      \
                                           ,Aerode__CoastLines_3D_____symetriser_X                                                      \
                                           ,Aerode__CoastLines_3D_____symetriser_Y                                                      \
                                           ,Aerode__CoastLines_3D_____symetriser_Z                                                      \
                                           ,Aerode__CoastLines_3D_____prolonger_X                                                       \
                                           ,Aerode__CoastLines_3D_____prolonger_Y                                                       \
                                           ,Aerode__CoastLines_3D_____prolonger_Z                                                       \
                                           ,Aerode__CoastLines_3D_____niveau_hors_album                                                 \
                                            )                                                                                           \
                              )                                                                                                         \
                         );                                                                                                             \
                                                                                                                                        \
                    INCR(nombre_d_etats_de_type_terre,COND(UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA_TERRE(etat),I,ZERO));              \
                    INCR(nombre_d_etats__indetermines,COND(UN_POINT_D_ERODE______COTES_3D_EST__INDETERMINE(etat),I,ZERO));              \
                    INCR(nombre_d_etats_de_type___mer,COND(UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA___MER(etat),I,ZERO));              \
                                        /* Comptabilite des differents signes possibles de l'"etat".                                 */ \
                                                                                                                                        \
                    INCR(moyenne_des_etats_de_type_terre,COND(UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA_TERRE(etat),etat,FZERO));       \
                    INCR(moyenne_des_etats__indetermines,COND(UN_POINT_D_ERODE______COTES_3D_EST__INDETERMINE(etat),etat,FZERO));       \
                    INCR(moyenne_des_etats_de_type___mer,COND(UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA___MER(etat),etat,FZERO));       \
                                        /* Comptabilite des differents "etat"s en vue de calculer leur moyenne.                      */ \
                    Eblock                                                                                                              \
                                        /* Acces a l'etat associe a un point {x,y}.                                                  */

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01                   /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01));
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01                   /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01                   /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02                   /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02));
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02                   /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02                   /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01));
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01                /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02));
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : objets statiques.        */

#    ifdef     GESTION_DES_IMAGES_STATIQUES_VERSION_01
DEFV(Local,DEFV(Statique,DEFV(albumF,Aerode__CoastLines_3D_____albumA_convolue_initial)));
#    Aifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_01
#    Eifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_01

#    ifdef     GESTION_DES_IMAGES_STATIQUES_VERSION_02                          /* Common,DEFV(Fonction,) : objets statiques.        */
DEFV(Common,DEFV(Statique,DEFV(albumF,Aerode__CoastLines_3D_____albumA_convolue_initial)));
                                        /* Album Argument initial apres la convolution. ATTENTION, il doit etre 'Common' a cause     */
                                        /* de 'v $xcc/cpp$Z D_STATIK' (alors qu'en toute logique 'Local' serait preferable...).      */
#    Aifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_02                          /* Common,DEFV(Fonction,) : objets statiques.        */
#    Eifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_02                          /* Common,DEFV(Fonction,) : objets statiques.        */

#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : objets statiques.        */
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02                /* Common,DEFV(Fonction,) : objets statiques.        */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____utiliser_la_surface_globale,VRAI)));
                                        /* Afin de savoir si l'on utilise la surface globale (correspondant au fonctionnement        */
                                        /* anterieur au 20011218141239) ou bien la surface au voisinage de chaque point...           */

DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____amplificateur_de_la_force,FU)));
                                        /* Amplificateur de la force de la mer (introduit le 20020116095643).                        */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____la_force_depend_du_niveau_local_de_la_mer,FAUX)));
                                        /* Afin de savoir si l'on fait un calcul "independant du temps" (correspondant au            */
                                        /* fonctionnement anterieur au 20020111161044), ou bien si le calcul de la force au          */
                                        /* point {X,Y,Z} depend du niveau moyen de la mer dans le voisinage de ce point...           */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____marquer_les_points_erodes_avec_la_force,VRAI)));
DEFV(Common,DEFV(genere_Float,ZINT(Aerode__CoastLines_3D_____marqueur_des_points_erodes
                                  ,NIVEAU_DE_LA___MER_DANS_Aerode__CoastLines_3D
                                   )
                 )
     );
                                        /* Afin de pouvoir marquer les points erodes avec la valeur courante de la force de la mer   */
                                        /* ou bien a l'aide d'une valeur arbitraire...                                               */

DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____demi_dimension_X_du_domaine_de_calcul_de_la_surface_locale,CINQ)));
DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____demi_dimension_Y_du_domaine_de_calcul_de_la_surface_locale,CINQ)));
DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____demi_dimension_Z_du_domaine_de_calcul_de_la_surface_locale,TROIS)));
                                        /* Definition de la taille du domaine de calcul de la surface locale dans le cas ou          */
                                        /* 'IL_FAUT(Aerode__CoastLines_3D_____utiliser_la_surface_globale)'. On notera que cela ne   */
                                        /* devrait exister qu'en 'CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02', mais que  */
                                        /* cela existe systematiquement pour simplifier 'v $xci/CoastL_3D.11$K'...                   */
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____agrandissement_du_domaine_de_calcul_de_la_surface_locale,FDEUX)));
                                        /* Definition du facteur d'agrandissement du domaine de calcul de la surface locale dans     */
                                        /* le cas ou l'on ne trouve pas de points de la cote initiale...                             */

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    define    CONVOLUTION_DE_MESURE_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue)                                    \
                         Bblock                                                                                                         \
                         CALS(AFFconvolution(albumA_convolue                                                                            \
                                            ,albumA                                                                                     \
                                             )                                                                                          \
                              );                                                                                                        \
                         Eblock
#    define    RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D                                                           \
                         UN
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    define    CONVOLUTION_DE_MESURE_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue)                                    \
                         Bblock                                                                                                         \
                         CALS(AFFconvolution_de_seuillage(albumA_convolue                                                               \
                                                         ,albumA                                                                        \
                                                         ,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D                                 \
                                                         ,MIN2(Aerode__CoastLines_3D_____niveau_de_la_terre                             \
                                                              ,Aerode__CoastLines_3D_____niveau_de_la___mer                             \
                                                               )                                                                        \
                                                         ,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D                                 \
                                                         ,MAX2(Aerode__CoastLines_3D_____niveau_de_la_terre                             \
                                                              ,Aerode__CoastLines_3D_____niveau_de_la___mer                             \
                                                               )                                                                        \
                                                          )                                                                             \
                              );                                                                                                        \
                         Eblock
#    define    RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D                                                           \
                         COND(IZGT(dimension_effective_du_noyau_de_convolution),dimension_effective_du_noyau_de_convolution,UN)
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

DEFV(Local,DEFV(Positive,INIT(dimension_effective_du_noyau_de_convolution,FLOT__UNDEF)));
                                        /* Dimension effective du noyau de convolution utile pour renormaliser la surface...         */

DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____surface_de_la_cote_courante,INFINI)));
                                        /* Surface de la cote courante afin de pouvoir l'utiliser a l'exterieur (en particulier      */
                                        /* pour savoir si elle est nulle, auquel cas, le processus est termine...). On notera la     */
                                        /* valeur initiale 'INFINI' qui est choisie ainsi car elle n'est pas nulle...                */

#define   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue,niveau_minimum,niveau_maximum,epaisseur_cote,surface_cote)           \
                    Bblock                                                                                                              \
                    EGAL(dimension_effective_du_noyau_de_convolution                                                                    \
                        ,INTE(TRMU(RAC3(Aerode__CoastLines_3D_____nombre_de_points_du_noyau_de_convolution)))                           \
                         );                                                                                                             \
                                        /* Dimension effective du noyau de convolution utile pour renormaliser la surface...         */ \
                                        /* On notera au passage que ce calcul peut etre fait plusieurs fois de facon redondante...   */ \
                                        /*                                                                                           */ \
                                        /* Le 20070227142931, 'PUIX(...,INVE(TRI_DIMENSIONNEL))' fut remplace par 'RAC3(...)'.       */ \
                                                                                                                                        \
                    CALS(AFnivo_extrema(albumA                                                                                          \
                                       ,ADRESSE(niveau_minimum)                                                                         \
                                       ,ADRESSE(niveau_maximum)                                                                         \
                                        )                                                                                               \
                         );                                                                                                             \
                                        /* Recherche des extrema de 'albumA'.                                                        */ \
                    EGAL(epaisseur_cote                                                                                                 \
                        ,MUL2(Aerode__CoastLines_3D_____facteur_d_epaisseur_de_la_cote                                                  \
                             ,SOUS(niveau_maximum,niveau_minimum)                                                                       \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Et evaluation d'une epaisseur de la cote.                                                 */ \
                                                                                                                                        \
                    Test(IL_FAUT(Aerode__CoastLines_3D_____initialiser))                                                                \
                         Bblock                                                                                                         \
                         EGAL(AFFconvolution_____demi_dimension_effective_du_noyau                                                      \
                             ,MOIT(dimension_effective_du_noyau_de_convolution)                                                         \
                              );                                                                                                        \
                         EGAL(AFFconvolution_____demi_dimension_effective_du_noyau                                                      \
                             ,TRON(AFFconvolution_____demi_dimension_effective_du_noyau                                                 \
                                  ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_AFFconvolution                                                 \
                                  ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_AFFconvolution                                                 \
                                   )                                                                                                    \
                              );                                                                                                        \
                                                                                                                                        \
                         INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_AFFconvolution;                                                        \
                                        /* Initialisation du noyau de convolution...                                                 */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(AFFconvolution_____niveau_hors_album,NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D);                           \
                                        /* Afin d'etre compatible avec la "philosophie" d'utilisation des fonctions                  */ \
                                        /* '$AFFconvolution(...)' et 'AFFconvolution_de_seuillage(...)' pour lesquels les            */ \
                                        /* points hors-album doivent etre le plus "neutre" possible...                               */ \
                    CONVOLUTION_DE_MESURE_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue);                              \
                                        /* Convolution de 'albumA'.                                                                  */ \
                                                                                                                                        \
                    EGAL(surface_cote                                                                                                   \
                        ,DIVI(AFcomptage_des_points_dans_un_intervalle(albumA_convolue                                                  \
                                                                      ,SOUS(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D               \
                                                                           ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale     \
                                                                            )                                                           \
                                                                      ,ADD2(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D               \
                                                                           ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale     \
                                                                            )                                                           \
                                                                       )                                                                \
                             ,RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D                                            \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Evaluation de la surface de la cote initiale exprimee par un nombre de points possedant   */ \
                                        /* "a epsilon" pres (definit par 'Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale')  */ \
                                        /* un niveau nul. ATTENTION : c'est bien l'epaisseur initiale de la cote qu'il faut utiliser */ \
                                        /* ('Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale') et non pas l'epaisseur        */ \
                                        /* courante 'epaisseur_cote' afin d'etre sur de mesurer toujours la longeur de la            */ \
                                        /* meme facon...                                                                             */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : j'ai note le 20020118085657 (c'est-a-dire avec pas mal de retard...) que ce   */ \
                                        /* n'etaient pas des mesures euclidienne que l'on effectuait ainsi. Cela est decrit plus     */ \
                                        /* longuement dans 'v $xiii/di_image$FON 20020118085657'.                                    */ \
                    Eblock                                                                                                              \
                                        /* Acces a l'etat associe a un point {x,y}.                                                  */

DEFV(Common,DEFV(genere_Float,ZINT(Aerode__CoastLines_3D_____niveau_de_la___mer,NIVEAU_DE_LA___MER_DANS_Aerode__CoastLines_3D)));
DEFV(Common,DEFV(genere_Float,ZINT(Aerode__CoastLines_3D_____niveau_de_la_terre,NIVEAU_DE_LA_TERRE_DANS_Aerode__CoastLines_3D)));
#define   NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D                                                                                 \
                    MOYE(Aerode__CoastLines_3D_____niveau_de_la___mer,Aerode__CoastLines_3D_____niveau_de_la_terre)
#define   NIVEAU_HORS_IMAGE_DANS_Aerode__CoastLines_3D                                                                                  \
                    NIVEAU_DE_LA_TERRE_DANS_Aerode__CoastLines_3D
                                        /* Niveaux "speciaux"...                                                                     */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____initialiser,VRAI)));
                                        /* Faut-il initialiser le modele ?                                                           */

DEFV(Local,DEFV(genere_Float,INIT(Aerode__CoastLines_3D_____niveau_minimum_initial,FLOT__NIVEAU_UNDEF)));
DEFV(Local,DEFV(genere_Float,INIT(Aerode__CoastLines_3D_____niveau_maximum_initial,FLOT__NIVEAU_UNDEF)));
                                        /* Extrema du champ initial ('albumA').                                                      */

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    define    NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION_D_ERODE______COTES_3D                                                           \
                         EXP3(DOUP(UN))
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    define    NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION_D_ERODE______COTES_3D                                                           \
                         EXP3(DOUP(UN))                                                                                                 \
                                        /* En fait, il est difficile d'utiliser 'DOUB(...)' comme le voudrait la logique, car,       */ \
                                        /* en effet, 'AFFconvolution_de_seuillage(...)' (comme 'AFFconvolution(...)' d'ailleurs)     */ \
                                        /* demande un noyau centre sur le point courant, donc de dimension du tye 'DOUP(...)'...     */
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

DEFV(Common,DEFV(Int,ZINT(Aerode__CoastLines_3D_____nombre_de_points_du_noyau_de_convolution
                         ,NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION_D_ERODE______COTES_3D
                          )
                 )
     );
                                        /* Nombre de points du noyau.                                                                */

#define   RESISTANCE_NULLE_D_UN_POINT_DE_LA_COTE_DANS_Aerode__CoastLines_3D                                                             \
                    FZERO

DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____nombre_de_voisins_mer_d_un_point_terre_amorcant_l_erosion,UN)));
                                        /* Nombre de voisins de type "mer" d'un point de "terre" a partir duquel ce point de "terre" */
                                        /* va etre erode. Cela a ete introduit le 20020117153753 a cause d'un probleme recontre dans */
                                        /* 'v _____xivPdf_14_1/$Fnota 20020117135014'.                                               */
DEFV(Common,DEFV(Positive,ZINT(Aerode__CoastLines_3D_____nombre_minimal_de_voisins_mer_d_un_point_terre_forcant_l_erosion,CINQ)));
                                        /* Nombre minimal de voisins de type "mer" d'un point de "terre" qui provoque la mise a      */
                                        /* zero de 'resistance_du_point_courant_de_la_terre' de ce point "terre"...                  */

DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____facteur_du_nombre_d_etats_de_type___mer,FU)));
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____translateur_du_nombre_d_etats_de_type___mer,FZERO)));
                                        /* Facteur et "translateur" de 'nombre_d_etats_de_type___mer' lors du calcul de la           */
                                        /* resistance du point courant {X,Y,Z}. Le facteur a ete introduit le 20020108105626,        */
                                        /* alors que le "translateur" a ete introduit le 20020117134323.                             */

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    define    FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D                                                                \
                         GRO8(FRA10(FRA10(FU)))
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    define    FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D                                                                \
                         FZERO
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____facteur_d_epaisseur_de_la_cote
                           ,FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
                                        /* Afin d'evaluer la surface de la cote. On notera que ce parametre (de meme que la notion   */
                                        /* d'epaisseur) n'a de sens que pour 'SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01',  */
                                        /* mais est conserve pour des raisons de compatibilite et de simplicite...                   */
DEFV(Local,DEFV(Float,INIT(Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale,FLOT__UNDEF)));
DEFV(Local,DEFV(Positive,INIT(Aerode__CoastLines_3D_____surface_de_la_cote_initiale,FLOT__UNDEF)));
                                        /* "Epaisseur" et surface de la cote initiale.                                               */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes (introduites le 20050721104900).             */
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_Float,ZINT(Aerode__CoastLines_3D_____niveau_hors_album,NIVEAU_HORS_IMAGE_DANS_Aerode__CoastLines_3D)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(Logical,ZINT(Aerode__CoastLines_3D_____utiliser_un_noyau,FAUX)));
                                        /* Options par defaut de choix entre la methode "des quatre plus proches voisins" ('FAUX')   */
                                        /* et la methode dite "a noyau" ('VRAI').                                                    */

DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point_sX__Y__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point__X_sY__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point__X__Y_sZ
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point_pX__Y__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point__X_pY__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aerode__CoastLines_3D_____ponderation_du_point__X__Y_pZ
                           ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                            )
                 )
     );
                                        /* Definition des facteurs des points du voisinage du point courant {X,Y}.                   */

DEFV(Common,DEFV(Logical,INIT(Aerode__CoastLines_3D_____initialiser_le_noyau,VRAI)));
DEFV(Common,DEFV(Int,ZINT(Aerode__CoastLines_3D_____demi_dimension_effective_du_noyau
                         ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Aerode__CoastLines_3D
                          )
                 )
     );
DEFV(Common,DEFV(Float,DTb3(Aerode__CoastLines_3D_____noyau,DN_Aerode__CoastLines_3D,DN_Aerode__CoastLines_3D,DN_Aerode__CoastLines_3D)
                                        /* ATTENTION : la ligne precedente doit rester sur une seule ligne, malgre sa longueur, a    */
                                        /* cause de 'v $xcg/gen$EXT$Z' et de ses "outils" contenus dans '$xcg/gen$EXT$D'...          */
                 )
     );
DEFV(Common,DEFV(Float,INIT(POINTERf(PAerode__CoastLines_3D_____noyau)
                           ,ADRESSE(ACCES_NOYAU_DANS_Aerode__CoastLines_3D(Aerode__CoastLines_3D_____XYZmin
                                                                          ,Aerode__CoastLines_3D_____XYZmin
                                                                          ,Aerode__CoastLines_3D_____XYZmin
                                                                           )
                                    )
                            )
                 )
     );
                                        /* Definition du noyau a utiliser dans 'Aerode__CoastLines_3D(...)', ainsi que d'un          */
                                        /* indicateur disant si l'initialisation doit etre faite et de la demi-dimension effective   */
                                        /* (inferieure ou egale a 'DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Aerode__CoastLines_3D')     */
                                        /* de ce dernier.                                                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, la ligne relative a 'DTb3(...)' doit tenir sur une seule ligne a cause de      */
                                        /* '$xcg/gen.ext$Z'...                                                                       */
                                        /*                                                                                           */
                                        /* Le pointeur 'PAerode__CoastLines_3D_____noyau' a ete introduit le 20010222110806 pour     */
                                        /* permettre des acces de type 'IloadF_album(...)' au noyau...                               */

DEFV(Common,DEFV(Int,ZINT(Aerode__CoastLines_3D_____delta_X,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Aerode__CoastLines_3D_____delta_Y,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Aerode__CoastLines_3D_____delta_Z,ZERO)));
                                        /* Translation des points du voisinage du point courant {X,Y,Z}.                             */

DEFV(Common,DEFV(Positive,INIT(Aerode__CoastLines_3D_____nombre_de_points_erodes_a_l_iteration_courante,UNDEF)));
                                        /* Afin de savoir combien de points de "terre" ont ete erodes par la "mer" au cours de       */
                                        /* l'iteration courante...                                                                   */

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#    define    TAUX_D_AFFAIBLISSEMENT_DE_LA_DURETE_DE_LA_TERRE(x,y,z)                                                                   \
                         taux_d_affaiblissement_de_la_durete_de_la_terre_local
#    define    FACTEUR_D_ANTI_CORROSITE_DE_LA_MER(x,y,z)                                                                                \
                         facteur_d_anti_corrosite_de_la_mer_local
                                        /* Acces aux caracteristiques de la terre et de la mer associees a un point {x,y,z}.         */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#    define    TAUX_D_AFFAIBLISSEMENT_DE_LA_DURETE_DE_LA_TERRE(x,y,z)                                                                   \
                         AloadF_point(taux_d_affaiblissement_de_la_durete_de_la_terre_local,x,y,z)
#    define    FACTEUR_D_ANTI_CORROSITE_DE_LA_MER(x,y,z)                                                                                \
                         AloadF_point(facteur_d_anti_corrosite_de_la_mer_local,x,y,z)
                                        /* Acces aux caracteristiques de la terre et de la mer associees a un point {x,y,z}.         */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   E R O S I O N  :                                 */
/*        A   T A U X   D ' A F F A I B L I S S E M E N T   D E   L A   T E R R E   E T   A   C O R R O S I T E                      */
/*        L O C A U X  :                                                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aerode__CoastLines_3D_a_taux_facteur_locaux(albumR
                                                                               ,albumA
                                                                               ,albumA_convolue_initial
                                                                               ,taux_d_affaiblissement_de_la_durete_de_la_terre_local
                                                                               ,facteur_d_anti_corrosite_de_la_mer_local
                                                                               ,editer_la_surface_de_la_cote_courante
                                                                                )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(albumF,albumA_convolue_initial));
                                        /* Album Argument initial convolue. En fait cela a ete introduit le 20011222183235 afin      */
                                        /* de faciliter son allocation memoire dans 'v $xcc/cpp$Z D_STATIK' car, en effet,           */
                                        /* 'Aerode__CoastLines_3D_____albumA_convolue_initial' apparait bien dans la liste des       */
                                        /* objets de type 'D_STATIK(...)', mais pour que son allocation soit faire a la suite de     */
                                        /* 'G_STATIK(...)' il faut qu'il soit utilise au moins une fois, ce qui est le cas depuis    */
                                        /* qu'il est argument de la fonction 'Aerode__CoastLines_3D(...)'.                           */
DEFV(Argument,DEFV(Float,taux_d_affaiblissement_de_la_durete_de_la_terre_local));
DEFV(Argument,DEFV(Float,facteur_d_anti_corrosite_de_la_mer_local));
                                        /* Caracteristiques de la terre et de la mer respectivement.                                 */
DEFV(Argument,DEFV(Logical,editer_la_surface_de_la_cote_courante));
                                        /* Afin de permettre l'edition de la surface de la cote courante...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01                /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aerode__CoastLines_3D_a_taux_facteur_locaux(albumR
                                                                               ,albumA
                                                                               ,albumA_convolue_initial
                                                                               ,taux_d_affaiblissement_de_la_durete_de_la_terre_local
                                                                               ,facteur_d_anti_corrosite_de_la_mer_local
                                                                               ,editer_la_surface_de_la_cote_courante
                                                                                )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(albumF,albumA_convolue_initial));
                                        /* Album Argument initial convolue. En fait cela a ete introduit le 20011222183235 afin      */
                                        /* de faciliter son allocation memoire dans 'v $xcc/cpp$Z D_STATIK' car, en effet,           */
                                        /* 'Aerode__CoastLines_3D_____albumA_convolue_initial' apparait bien dans la liste des       */
                                        /* objets de type 'D_STATIK(...)', mais pour que son allocation soit faire a la suite de     */
                                        /* 'G_STATIK(...)' il faut qu'il soit utilise au moins une fois, ce qui est le cas depuis    */
                                        /* qu'il est argument de la fonction 'Aerode__CoastLines_3D(...)'.                           */
DEFV(Argument,DEFV(albumF,taux_d_affaiblissement_de_la_durete_de_la_terre_local));
DEFV(Argument,DEFV(albumF,facteur_d_anti_corrosite_de_la_mer_local));
                                        /* Caracteristiques de la terre et de la mer respectivement.                                 */
                                        /*                                                                                           */
                                        /* ATTENTION, on notera que le 20020208093402, la "corrosite" est devenue "anti-corrosite"   */
                                        /* (il s'agit juste d'une modification dans la terminologie), lorsque je me suis rendu       */
                                        /* compte, en mettant au point la sequence 'v _____xivPdf_14_1/$Fnota 019535_020046', qu'en  */
                                        /* fait plus ce parametre avait une valeur proche de 0, plus la mer etait corrosive et       */
                                        /* que plus cette valeur etait proche de 1, moins elle l'etait. Il s'agit donc bien alors    */
                                        /* de la propriete complementaire de celle de la "corrosite"...                              */
DEFV(Argument,DEFV(Logical,editer_la_surface_de_la_cote_courante));
                                        /* Afin de permettre l'edition de la surface de la cote courante...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02                /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

     Bblock
     DEFV(genere_Float,INIT(niveau_minimum_courant,FLOT__UNDEF));
     DEFV(genere_Float,INIT(niveau_maximum_courant,FLOT__UNDEF));
     DEFV(Float,INIT(epaisseur_de_la_cote_courante,FLOT__UNDEF));
                                        /* Caracteristiques de la cote courante...                                                   */

     BDEFV(albumF,albumA_convolue_courant);
                                        /* Album Argument courant apres la convolution.                                              */
     /*..............................................................................................................................*/

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
     Test(IFNE(Aerode__CoastLines_3D_____facteur_d_epaisseur_de_la_cote,FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D))
          Bblock
          PRINT_ATTENTION("le parametre 'Aerode__CoastLines_3D_____facteur_d_epaisseur_de_la_cote' n'a plus de sens");

          EGAL(Aerode__CoastLines_3D_____facteur_d_epaisseur_de_la_cote,FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D);
          Eblock
     ATes
          Bblock
          Eblock
     ETes
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

     CLIR(Aerode__CoastLines_3D_____nombre_de_points_erodes_a_l_iteration_courante);
                                        /* A priori aucun points de "terre" n'a encore ete erode par la "mer" au cours de            */
                                        /* l'iteration courante...                                                                   */

     Test(IL_FAUT(Aerode__CoastLines_3D_____initialiser))
          Bblock
          SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue_initial
                                                  ,Aerode__CoastLines_3D_____niveau_minimum_initial
                                                  ,Aerode__CoastLines_3D_____niveau_maximum_initial
                                                  ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale
                                                  ,Aerode__CoastLines_3D_____surface_de_la_cote_initiale
                                                   );
                                        /* Evaluation de la surface de la cote initiale...                                           */

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02
          CALS(AFmove(albumA_convolue_courant,albumA_convolue_initial));
                                        /* Et on conserve les conditions initiales de 'albumA' convolue.                             */
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02

          EGAL(niveau_minimum_courant,Aerode__CoastLines_3D_____niveau_minimum_initial);
          EGAL(niveau_maximum_courant,Aerode__CoastLines_3D_____niveau_maximum_initial);
          EGAL(epaisseur_de_la_cote_courante,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale);
          EGAL(Aerode__CoastLines_3D_____surface_de_la_cote_courante,Aerode__CoastLines_3D_____surface_de_la_cote_initiale);
                                        /* Et quelques mises a jour au cas ou...                                                     */

          EGAL(Aerode__CoastLines_3D_____initialiser,FAUX);
                                        /* L'initialisation est faite...                                                             */
          Eblock
     ATes
          Bblock
          SURFACE_DE_LA_COTE_D_ERODE______COTES_3D(albumA_convolue_courant
                                                  ,niveau_minimum_courant
                                                  ,niveau_maximum_courant
                                                  ,epaisseur_de_la_cote_courante
                                                  ,Aerode__CoastLines_3D_____surface_de_la_cote_courante
                                                   );
                                        /* Evaluation de la surface de la cote courante...                                           */
          Eblock
     ETes

     Test(IL_FAUT(editer_la_surface_de_la_cote_courante))
          Bblock
          CAL3(Prme1("Surface de la cote courante avant l'evolution=%d\n",Aerode__CoastLines_3D_____surface_de_la_cote_courante));
                                        /* Ainsi, on edite bien 'Aerode__CoastLines_3D_____surface_de_la_cote_initiale' apres        */
                                        /* l'initialisation du modele (mais pas la surface de la cote obtenue apres la derniere      */
                                        /* iteration, mais c'est bien ainsi car cette derniere est beaucoup moins importante que     */
                                        /* la surface initiale (par exemple pour la valider par rapport a 'dimX'...).                */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Aerode__CoastLines_3D;
                                        /* Initialisation si necessaire du noyau (dans le cas ou il est de plus utilise...).         */

     begin_album
          Bblock
          DEFV(Positive,INIT(nombre_d_etats_de_type_terre,ZERO));
          DEFV(Positive,INIT(nombre_d_etats__indetermines,ZERO));
          DEFV(Positive,INIT(nombre_d_etats_de_type___mer,ZERO));
                                        /* Comptabilite des differents signes possibles de l'"etat".                                 */

          DEFV(genere_Float,INIT(moyenne_des_etats_de_type_terre,FZERO));
          DEFV(genere_Float,INIT(moyenne_des_etats__indetermines,FZERO));
          DEFV(genere_Float,INIT(moyenne_des_etats_de_type___mer,FZERO));
                                        /* Moyenne des differents "etat"s.                                                           */

          DEFV(genere_Float,INIT(etat__X__Y__Z,FLOT__UNDEF));
          DEFV(genere_Float,INIT(nouvel_etat__X__Y__Z,FLOT__UNDEF));
                                        /* Etat du point courant {X,Y,Z} et son etat futur...                                        */

          Test(IL_FAUT(Aerode__CoastLines_3D_____utiliser_un_noyau))
               Bblock

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

               DEFV(genere_Float,INIT(etat_iX_jY_kZ,FLOT__UNDEF));
                                        /* Etat du point courant du voisinage du point {Xc,Yc,Zc}.                                   */

               begin_albumQ(DoIn,Aerode__CoastLines_3D_____XYZmin_effectif,Aerode__CoastLines_3D_____XYZmax_effectif,PasZ
                           ,DoIn,Aerode__CoastLines_3D_____XYZmin_effectif,Aerode__CoastLines_3D_____XYZmax_effectif,PasY
                           ,DoIn,Aerode__CoastLines_3D_____XYZmin_effectif,Aerode__CoastLines_3D_____XYZmax_effectif,PasX
                            )
                    Bblock
                                        /* ATTENTION : dans cette boucle {X,Y,Z} designent l'element courant du noyau, alors que     */
                                        /* {Xc,Yc,Zc} designent le point courant dont on etudie le voisinage...                      */

                    Test(I3ET(IZEQ(X),IZEQ(Y),IZEQ(Z)))
                         Bblock
                         ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X__Y__Z
                                                               ,NEUT(Xc),ZERO
                                                               ,NEUT(Yc),ZERO
                                                               ,NEUT(Zc),ZERO
                                                               ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                                                                );
                                        /* Traitement du point courant {Xc,Yc,Zc}.                                                   */
                         Eblock
                    ATes
                         Bblock
                         ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat_iX_jY_kZ
                                                               ,ADD2(Xc,X),Aerode__CoastLines_3D_____delta_X
                                                               ,ADD2(Yc,Y),Aerode__CoastLines_3D_____delta_Y
                                                               ,ADD2(Zc,Z),Aerode__CoastLines_3D_____delta_Z
                                                               ,ACCES_NOYAU_DANS_Aerode__CoastLines_3D(X,Y,Z)
                                                                );
                                        /* Traitement du point courant {Xc+X,Yc+Y,Zc+Z} du voisinage du point {Xc,Yc,Zc}.            */
                         Eblock
                    ETes
                    Eblock
               end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

               Eblock
          ATes
               Bblock
               DEFV(genere_Float,INIT(etat_sX__Y__Z,FLOT__UNDEF));
               DEFV(genere_Float,INIT(etat__X_sY__Z,FLOT__UNDEF));
               DEFV(genere_Float,INIT(etat__X__Y_sZ,FLOT__UNDEF));
               DEFV(genere_Float,INIT(etat_pX__Y__Z,FLOT__UNDEF));
               DEFV(genere_Float,INIT(etat__X_pY__Z,FLOT__UNDEF));
               DEFV(genere_Float,INIT(etat__X__Y_pZ,FLOT__UNDEF));
                                        /* Etats des voisins du point {X,Y,Z}.                                                       */

               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X__Y__Z
                                                     ,NEUT(X),ZERO
                                                     ,NEUT(Y),ZERO
                                                     ,NEUT(Z),ZERO
                                                     ,PONDERATION_D_UN_POINT_DANS_Aerode__CoastLines_3D
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat_sX__Y__Z
                                                     ,SUCX(X),Aerode__CoastLines_3D_____delta_X
                                                     ,NEUT(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,NEUT(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point_sX__Y__Z
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X_sY__Z
                                                     ,NEUT(X),Aerode__CoastLines_3D_____delta_X
                                                     ,SUCY(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,NEUT(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point__X_sY__Z
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X__Y_sZ
                                                     ,NEUT(X),Aerode__CoastLines_3D_____delta_X
                                                     ,NEUT(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,SUCZ(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point__X__Y_sZ
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat_pX__Y__Z
                                                     ,PREX(X),Aerode__CoastLines_3D_____delta_X
                                                     ,NEUT(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,NEUT(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point_pX__Y__Z
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X_pY__Z
                                                     ,NEUT(X),Aerode__CoastLines_3D_____delta_X
                                                     ,PREY(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,NEUT(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point__X_pY__Z
                                                      );
               ACCES_A_UN_POINT_D_ERODE______COTES_3D(etat__X__Y_pZ
                                                     ,NEUT(X),Aerode__CoastLines_3D_____delta_X
                                                     ,NEUT(Y),Aerode__CoastLines_3D_____delta_Y
                                                     ,PREZ(Z),Aerode__CoastLines_3D_____delta_Z
                                                     ,Aerode__CoastLines_3D_____ponderation_du_point__X__Y_pZ
                                                      );
                                        /* Etats des points utiles avec ponderation eventuelle.                                      */
               Eblock
          ETes

          EGAL(moyenne_des_etats_de_type_terre,DIVZ(moyenne_des_etats_de_type_terre,FLOT(nombre_d_etats_de_type_terre)));
          EGAL(moyenne_des_etats__indetermines,DIVZ(moyenne_des_etats__indetermines,FLOT(nombre_d_etats__indetermines)));
          EGAL(moyenne_des_etats_de_type___mer,DIVZ(moyenne_des_etats_de_type___mer,FLOT(nombre_d_etats_de_type___mer)));
                                        /* Moyenne des differents "etat"s.                                                           */

          EGAL(nouvel_etat__X__Y__Z,etat__X__Y__Z);
                                        /* A priori, l'etat du point courant {X,Y,Z} est inchange...                                 */

          Test(UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA_TERRE(etat__X__Y__Z))
                                        /* Cas ou l'on est sur la terre :                                                            */
               Bblock
               Test(IFGT(ABSO(etat__X__Y__Z),ABSO(Aerode__CoastLines_3D_____niveau_de_la_terre)))
                    Bblock
                    PRINT_ERREUR("un niveau de la terre est incorrect, il vaut :");
                    CAL1(Prer4("niveau(%d,%d,%d) = %g\n",X,Y,Z,etat__X__Y__Z));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IZGT(nombre_d_etats_de_type___mer))
                    Bblock
                    DEFV(Float,INIT(surface_effective_de_la_cote_initiale,Aerode__CoastLines_3D_____surface_de_la_cote_initiale));
                    DEFV(Float,INIT(surface_effective_de_la_cote_courante,Aerode__CoastLines_3D_____surface_de_la_cote_courante));
                                        /* Surfaces de la cote (initiale et courante) a utiliser a priori pour le calcul             */
                                        /* de 'force_de_la_mer_au_point_courant'.                                                    */
                    DEFV(Float,INIT(resistance_du_point_courant_de_la_terre,FLOT__UNDEF));
                                        /* Resistance du point courant de la terre...                                                */
                    DEFV(Float,INIT(force_de_la_mer_au_point_courant,FLOT__UNDEF));
                                        /* Force de la mer au point courant...                                                       */

                    EGAL(nouvel_etat__X__Y__Z
                        ,MUL2(COMP(TAUX_D_AFFAIBLISSEMENT_DE_LA_DURETE_DE_LA_TERRE(X,Y,Z)),nouvel_etat__X__Y__Z)
                         );
                                        /* Le point courant {X,Y,Z} de la terre s'affaiblit au cours du temps et reste de la terre   */
                                        /* (provisoirement peut-etre...). Pour respecter le modele original, il conviendrait de      */
                                        /* n'appliquer cet affaiblissement que lorsque la cote a atteint un etat stable. Cela peut   */
                                        /* etre realise de deux facons presque equivalentes : d'une part, il est possible de donner  */
                                        /* a ce taux 'taux_d_affaiblissement_de_la_durete_de_la_terre' une valeur tres faible (par   */
                                        /* exemple 'GRO5(FRA10(FRA10(FRA10(FRA10(FRA10(FU))))))') ; d'autre part, faire plusieurs    */
                                        /* simulations successives : une premiere, longue avec un taux nul, une seconde tres courte  */
                                        /* avec un taux non nul, une troisieme, longue avec un taux nul, une quatrieme tres courte   */
                                        /* avec un taux non nul, etc...                                                              */

                    EGAL(resistance_du_point_courant_de_la_terre
                        ,COND(IFLT(nombre_d_etats_de_type___mer
                                  ,Aerode__CoastLines_3D_____nombre_de_voisins_mer_d_un_point_terre_amorcant_l_erosion
                                   )
                             ,ABSO(nouvel_etat__X__Y__Z)
                             ,COND(IFLT(nombre_d_etats_de_type___mer
                                       ,Aerode__CoastLines_3D_____nombre_minimal_de_voisins_mer_d_un_point_terre_forcant_l_erosion
                                        )
                                  ,PUIX(ABSO(nouvel_etat__X__Y__Z)
                                       ,AXPB(Aerode__CoastLines_3D_____facteur_du_nombre_d_etats_de_type___mer
                                            ,nombre_d_etats_de_type___mer
                                            ,Aerode__CoastLines_3D_____translateur_du_nombre_d_etats_de_type___mer
                                             )
                                        )
                                  ,RESISTANCE_NULLE_D_UN_POINT_DE_LA_COTE_DANS_Aerode__CoastLines_3D
                                   )
                              )
                         );
                                        /* Etude de la resistance du point courant {X,Y,Z} par rapport a son environnement : cette   */
                                        /* resistance est d'autant plus faible que le point courant {X,Y,Z} est davantage entoure    */
                                        /* par la mer. On notera que cette resistance est une valeur positive (ou nulle afin de      */
                                        /* forcer l'erosion, ce qui a ete introduit le 20011210161803).                              */

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_01

#ifdef    CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02
                    Test(IL_FAUT(Aerode__CoastLines_3D_____utiliser_la_surface_globale))
                         Bblock
                         Eblock
                    ATes
                         Bblock
                         DEFV(Int,INIT(demi_dimension_X_effective
                                      ,Aerode__CoastLines_3D_____demi_dimension_X_du_domaine_de_calcul_de_la_surface_locale
                                       )
                              );
                         DEFV(Int,INIT(demi_dimension_Y_effective
                                      ,Aerode__CoastLines_3D_____demi_dimension_Y_du_domaine_de_calcul_de_la_surface_locale
                                       )
                              );
                         DEFV(Int,INIT(demi_dimension_Z_effective
                                      ,Aerode__CoastLines_3D_____demi_dimension_Z_du_domaine_de_calcul_de_la_surface_locale
                                       )
                              );
                         DEFV(Int,INIT(Xmin_domaine,UNDEF));
                         DEFV(Int,INIT(Xmax_domaine,UNDEF));
                         DEFV(Int,INIT(Ymin_domaine,UNDEF));
                         DEFV(Int,INIT(Ymax_domaine,UNDEF));
                         DEFV(Int,INIT(Zmin_domaine,UNDEF));
                         DEFV(Int,INIT(Zmax_domaine,UNDEF));
                                        /* Definition du domaine local ou faire le calcul de la surface au voisinage de {X,Y,Z}.     */

                         EGAL(surface_effective_de_la_cote_initiale,FZERO);
                                        /* Afin d'etre sur de faire le 'Tant(...)' suivant au moins une fois...                      */

                         Tant(IZEQ(surface_effective_de_la_cote_initiale))
                              Bblock
                              EGAL(Xmin_domaine,SOUS(X,demi_dimension_X_effective));
                              EGAL(Xmax_domaine,ADD2(X,demi_dimension_X_effective));
                              EGAL(Ymin_domaine,SOUS(Y,demi_dimension_Y_effective));
                              EGAL(Ymax_domaine,ADD2(Y,demi_dimension_Y_effective));
                              EGAL(Zmin_domaine,SOUS(Z,demi_dimension_Z_effective));
                              EGAL(Zmax_domaine,ADD2(Z,demi_dimension_Z_effective));
                                        /* Definition du domaine local ou faire le calcul de la surface au voisinage de {X,Y,Z}.     */

                              EGAL(surface_effective_de_la_cote_initiale
                                  ,DIVI(AFdomaine_comptage_des_points_dans_un_intervalle
                                            (albumA_convolue_initial
                                            ,Xmin_domaine,Xmax_domaine
                                            ,Ymin_domaine,Ymax_domaine
                                            ,Zmin_domaine,Zmax_domaine
                                            ,SOUS(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D
                                                 ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale
                                                  )
                                            ,ADD2(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D
                                                 ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale
                                                  )
                                             )
                                       ,RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
                                        )
                                   );

                              Test(IZEQ(surface_effective_de_la_cote_initiale))
                                   Bblock
                                   EGAL(demi_dimension_X_effective
                                       ,MUL2(Aerode__CoastLines_3D_____agrandissement_du_domaine_de_calcul_de_la_surface_locale
                                            ,demi_dimension_X_effective
                                             )
                                        );
                                   EGAL(demi_dimension_Y_effective
                                       ,MUL2(Aerode__CoastLines_3D_____agrandissement_du_domaine_de_calcul_de_la_surface_locale
                                            ,demi_dimension_Y_effective
                                             )
                                        );
                                   EGAL(demi_dimension_Z_effective
                                       ,MUL2(Aerode__CoastLines_3D_____agrandissement_du_domaine_de_calcul_de_la_surface_locale
                                            ,demi_dimension_Z_effective
                                             )
                                        );
                                        /* Tant que l'on a pas trouve de points de la cote initiale (ce qui se traduit par une       */
                                        /* surface nulle), on double la taille du domaine...                                         */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ETan

                         EGAL(surface_effective_de_la_cote_courante
                             ,DIVI(AFdomaine_comptage_des_points_dans_un_intervalle
                                       (albumA_convolue_courant
                                       ,Xmin_domaine,Xmax_domaine
                                       ,Ymin_domaine,Ymax_domaine
                                       ,Zmin_domaine,Zmax_domaine
                                       ,SOUS(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D
                                            ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale
                                             )
                                       ,ADD2(NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D
                                            ,Aerode__CoastLines_3D_____epaisseur_de_la_cote_initiale
                                             )
                                        )
                                  ,RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
                                   )
                              );
                                        /* Longueurs de la cote (initiale et courante) calculees localement dans le voisinage        */
                                        /* du point courant {X,Y,Z}. On notera que le domaine de calcul est celui qui correspond     */
                                        /* a la derniere etape de calcul de 'surface_effective_de_la_cote_initiale'.                 */
                         Eblock
                    ETes
#Aifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02
#Eifdef   CONVOLUTION_DE_albumA_D_ERODE______COTES_3D_VERSION_02

                    EGAL(force_de_la_mer_au_point_courant
                        ,MUL2(Aerode__CoastLines_3D_____amplificateur_de_la_force
                             ,DIVI(MUL2(COND(EST_VRAI(Aerode__CoastLines_3D_____la_force_depend_du_niveau_local_de_la_mer)
                                            ,ABSO(moyenne_des_etats_de_type___mer)
                                            ,ABSO(Aerode__CoastLines_3D_____niveau_de_la___mer)
                                             )
                                       ,ABSO(Aerode__CoastLines_3D_____niveau_de_la_terre)
                                        )
                                  ,ADD2(FU
                                       ,SCAL(FACTEUR_D_ANTI_CORROSITE_DE_LA_MER(X,Y,Z)
                                            ,FLOT(surface_effective_de_la_cote_initiale)
                                            ,FLOT(surface_effective_de_la_cote_courante)
                                             )
                                        )
                                   )
                              )
                         );
                                        /* Calcul de la force de la mer au point courant : celle-ci decroit au fur et a mesure       */
                                        /* que la surface de la cote augmente. On notera que d'une part cette force est inferieure   */
                                        /* (ou egale apres initialisation) au niveau (maximal) de la terre en valeur absolue, et     */
                                        /* que d'autre part elle est independante en fait de {X,Y,Z} a la date du 20011205093935.    */
                                        /* Ce dernier point signifie que le calcul de 'force_de_la_mer_au_point_courant' pourrait    */
                                        /* etre effectue en dehors de {begin_album,end_album}, mais qu'il n'est pas impossible que   */
                                        /* dans le futur, cette force depende reellement de {X,Y,Z}. Cette dependance en {X,Y,Z}     */
                                        /* a ete mise en place le 20011219110000...                                                  */
                                        /*                                                                                           */
                                        /* Cette force est donc de la forme :                                                        */
                                        /*                                                                                           */
                                        /*                               A                                                           */
                                        /*                  force = ------------                                                     */
                                        /*                                  S                                                        */
                                        /*                                   c                                                       */
                                        /*                           1 + F.----                                                      */
                                        /*                                  S                                                        */
                                        /*                                   0                                                       */
                                        /*                                                                                           */
                                        /* ou 'F', 'Sc' et 'S0' designent respectivement l'anti-corrosite de la mer, la surface      */
                                        /* courante de la cote et sa surface initiale.                                               */

                    Test(IFLE(resistance_du_point_courant_de_la_terre,force_de_la_mer_au_point_courant))
                                        /* Le test 'IFLT(...)' a ete remplace par un 'IFLE(...)' le 20011210161803 depuis que        */
                                        /* 'resistance_du_point_courant_de_la_terre' peut etre mis a zero explicitement...           */
                         Bblock
                         EGAL(nouvel_etat__X__Y__Z
                             ,MEME_SIGNE_QUE(Aerode__CoastLines_3D_____niveau_de_la___mer
                                            ,COND(IL_FAUT(Aerode__CoastLines_3D_____marquer_les_points_erodes_avec_la_force)
                                                 ,force_de_la_mer_au_point_courant
                                                 ,Aerode__CoastLines_3D_____marqueur_des_points_erodes
                                                  )
                                             )
                              );
                                        /* Le point courant {X,Y,Z} est trop faible par rapport a la force de la mer, il disparait   */
                                        /* en devenant de la mer...                                                                  */
                         INCR(Aerode__CoastLines_3D_____nombre_de_points_erodes_a_l_iteration_courante,I);
                                        /* Un point supplementaire de "terre" a ete erode par la "mer" au cours de l'iteration       */
                                        /* courante...                                                                               */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          AstoreF_point(nouvel_etat__X__Y__Z
                       ,albumR
                       ,X,Y,Z
                        );
                                        /* Nouvel etat du point courant {X,Y,Z}...                                                   */
          Eblock
     end_album

     EDEFV(albumF,albumA_convolue_courant);
                                        /* Album Argument courant apres la convolution.                                              */

     RETAF(albumR);
     Eblock

EFonctionF

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#    undef     FACTEUR_D_ANTI_CORROSITE_DE_LA_MER
#    undef     TAUX_D_AFFAIBLISSEMENT_DE_LA_DURETE_DE_LA_TERRE
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#    undef     FACTEUR_D_ANTI_CORROSITE_DE_LA_MER
#    undef     TAUX_D_AFFAIBLISSEMENT_DE_LA_DURETE_DE_LA_TERRE
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    undef     FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    undef     FACTEUR_D_EPAISSEUR_DE_LA_COTE_DANS_Aerode__CoastLines_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

#undef    RESISTANCE_NULLE_D_UN_POINT_DE_LA_COTE_DANS_Aerode__CoastLines_3D

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    undef     NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION_D_ERODE______COTES_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    undef     NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION_D_ERODE______COTES_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

#undef    NIVEAU_HORS_IMAGE_DANS_Aerode__CoastLines_3D
#undef    NIVEAU______MEDIAN_DANS_Aerode__CoastLines_3D

#undef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#    undef     RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
#    undef     CONVOLUTION_DE_MESURE_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_01

#ifdef    SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#    undef     RENORMALISATEUR_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
#    undef     CONVOLUTION_DE_MESURE_DE_LA_SURFACE_DE_LA_COTE_D_ERODE______COTES_3D
#Aifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02
#Eifdef   SURFACE_DE_LA_COTE_D_ERODE______COTES_3D_VERSION_02

#undef    ACCES_A_UN_POINT_D_ERODE______COTES_3D

#undef    UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA___MER
#undef    UN_POINT_D_ERODE______COTES_3D_EST__INDETERMINE
#undef    UN_POINT_D_ERODE______COTES_3D_EST_SUR_LA_TERRE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   E R O S I O N  :                                 */
/*        A   T A U X   D ' A F F A I B L I S S E M E N T   D E   L A   T E R R E   E T   A   C O R R O S I T E                      */
/*        G L O B A U X  :                                                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aerode__CoastLines_3D(albumR
                                                         ,albumA
                                                         ,albumA_convolue_initial
                                                         ,taux_d_affaiblissement_de_la_durete_de_la_terre
                                                         ,facteur_d_anti_corrosite_de_la_mer
                                                         ,editer_la_surface_de_la_cote_courante
                                                          )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(albumF,albumA_convolue_initial));
                                        /* Album Argument initial convolue. En fait cela a ete introduit le 20011222183235 afin      */
                                        /* de faciliter son allocation memoire dans 'v $xcc/cpp$Z D_STATIK' car, en effet,           */
                                        /* 'Aerode__CoastLines_3D_____albumA_convolue_initial' apparait bien dans la liste des       */
                                        /* objets de type 'D_STATIK(...)', mais pour que son allocation soit faire a la suite de     */
                                        /* 'G_STATIK(...)' il faut qu'il soit utilise au moins une fois, ce qui est le cas depuis    */
                                        /* qu'il est argument de la fonction 'Aerode__CoastLines_3D(...)'.                           */
DEFV(Argument,DEFV(Float,taux_d_affaiblissement_de_la_durete_de_la_terre));
DEFV(Argument,DEFV(Float,facteur_d_anti_corrosite_de_la_mer));
                                        /* Caracteristiques de la terre et de la mer respectivement.                                 */
DEFV(Argument,DEFV(Logical,editer_la_surface_de_la_cote_courante));
                                        /* Afin de permettre l'edition de la surface de la cote courante...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
     DEFV(Float,INIT(taux_d_affaiblissement_de_la_durete_de_la_terre_local,FLOT__UNDEF));
     DEFV(Float,INIT(facteur_d_anti_corrosite_de_la_mer_local,FLOT__UNDEF));
                                        /* Caracteristiques de la terre et de la mer respectivement, "locales" uniformes             */
                                        /* (c'est-a-dire independante du point {X,Y,Z}).                                             */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
     BDEFV(albumF,taux_d_affaiblissement_de_la_durete_de_la_terre_local);
     BDEFV(albumF,facteur_d_anti_corrosite_de_la_mer_local);
                                        /* Albums flottants donnant les caracteristiques de la terre et de la mer respectivement     */
                                        /* en chaque point {X,Y,Z}.                                                                  */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02

     /*..............................................................................................................................*/

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
     EGAL(taux_d_affaiblissement_de_la_durete_de_la_terre_local,taux_d_affaiblissement_de_la_durete_de_la_terre);
     EGAL(facteur_d_anti_corrosite_de_la_mer_local,facteur_d_anti_corrosite_de_la_mer);
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
     CALS(dAFinitialisation(taux_d_affaiblissement_de_la_durete_de_la_terre_local,taux_d_affaiblissement_de_la_durete_de_la_terre));
     CALS(dAFinitialisation(facteur_d_anti_corrosite_de_la_mer_local,facteur_d_anti_corrosite_de_la_mer));
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02

     CALS(Aerode__CoastLines_3D_a_taux_facteur_locaux(albumR
                                                     ,albumA
                                                     ,albumA_convolue_initial
                                                     ,taux_d_affaiblissement_de_la_durete_de_la_terre_local
                                                     ,facteur_d_anti_corrosite_de_la_mer_local
                                                     ,editer_la_surface_de_la_cote_courante
                                                      )
          );
                                        /* Et calcul avec le meme taux d'affaiblissement de la terre et le meme facteur              */
                                        /* d'anti-corrosite de la mer en chaque point {X,Y,Z}.                                       */

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_01

#ifdef    Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
     EDEFV(albumF,facteur_d_anti_corrosite_de_la_mer_local);
     EDEFV(albumF,taux_d_affaiblissement_de_la_durete_de_la_terre_local);
                                        /* Albums flottants donnant les caracteristiques de la terre et de la mer respectivement     */
                                        /* en chaque point {X,Y,Z}.                                                                  */
#Aifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02
#Eifdef   Aerode__CoastLines_3D_a_taux_facteur_locaux_VERSION_02

     RETAF(albumR);
     Eblock

EFonctionF

                                        /* ATTENTION : je note le 20180505094525 que l'absence des deux lignes "_____..._____"       */
                                        /* de separation de blocs pour la compilation des '$so's est due a la fonction 'AFmove(..)'  */
                                        /* utilisee dans 'OMBRAGE_D_UN_ALBUM(...)' et qui est definie dans le bloc courant. La       */
                                        /* presence du separateur "_____..._____" donne le message :                                 */
                                        /*                                                                                           */
                                        /*   warning: implicit declaration of function 'AFmove' [-Wimplicit-function-declaration]    */
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O M B R A G E   " G E N E R A L "   D ' U N   A L B U M  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Le 20180124092708 'POINT_EN_REALITE_A_L_OMBRE' et 'POINT_A_PRIORI_AU_SOLEIL' ont ete      */
                                        /* mis dans 'v $xiii/di_album$DEF 20180124092646' afin de pouvoir etre utilises dans         */
                                        /* 'v $xci/ombrage.11$K POINT_A_PRIORI_AU_SOLEIL'...                                         */

#define   PARCOURS_DU_RAYON_LUMINEUX(point_courant,source_lumineuse)                                                                    \
                    BARY(point_courant                                                                                                  \
                        ,NomDeLaFonctionCourante QD@@__ source_lumineuse                                                                \
                        ,lambda                                                                                                         \
                         )                                                                                                              \
                                        /* Introduit le 20150102083605 dans l'espoir de pouvoir inverser l'ordre de parcours des     */ \
                                        /* rayons lumineux et ainsi peut-etre d'accelerer le processus d'ombrage. Malheureusement,   */ \
                                        /* cela ne fonctionne pas a cause du test :                                                  */ \
                                        /*                                                                                           */ \
                                        /*   ,I3ET(IFINff(Xfl,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)   */ \
                                        /*        ,IFINff(Yfl,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)   */ \
                                        /*        ,IFINff(Zfl,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)   */ \
                                        /*         )                                                                                 */ \
                                        /*                                                                                           */ \
                                        /* fait un peu plus bas. Or la source lumineuse etant en general en dehors du volume de      */ \
                                        /* l'album, le point {Xfl,Yfl,Zfl} au voisinage de la source lumineuse est en dehors de      */ \
                                        /* [0,1]x[0,1]x[0,1] et alors le test precedent est FAUX des le depart, ce qui provoque      */ \
                                        /* l'arret immediat du parcours du rayon lumineux. Ainsi, pas d'ombrage !                    */

#define   non__optimisation_1_de_l_ombrage_d_un_album                                                                                   \
                    _____compatibilite_20170517
#define   IL_FAUT_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM                                                                                      \
                    IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ non__optimisation_1_de_l_ombrage_d_un_album)
#define   IL_NE_FAUT_PAS_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM                                                                               \
                    IL_FAUT(NomDeLaFonctionCourante QD@@__ non__optimisation_1_de_l_ombrage_d_un_album)
                                        /* Introduit le 20170825112307 pour ameliorer la comprehension de 'OMBRAGE_D_UN_ALBUM(...)'. */

#define   IL_FAUT_OPTIMISER_2_L_OMBRAGE_D_UN_ALBUM                                                                                      \
                    IL_FAUT(NomDeLaFonctionCourante QD@@__ _____optimisation_2)
#define   IL_NE_FAUT_PAS_OPTIMISER_2_L_OMBRAGE_D_UN_ALBUM                                                                               \
                    IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____optimisation_2)
                                        /* Introduit le 20170826101753...                                                            */

#define   attenuation_des_points_a_l_ombre                                                                                              \
                    NomDeLaFonctionCourante QD@@__ _____attenuation_des_points_a_l_ombre                                                \
                                        /* Afin de raccourcir une ligne a venir...                                                   */

#define   OMBRAGE_D_UN_ALBUM(TypeAlbum,MoveAlbum,LoadPoint,StorePoint,LoadPoint_coordonnees_01,NiveauUndef)                             \
                    Bblock                                                                                                              \
                    BDEFV(album,album_points_deja_testes);                                                                              \
                                        /* La definition ne peut evidemment pas etre a l'interieur d'un 'Test(...)'...               */ \
                                                                                                                                        \
                    Test(IL_FAUT_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM)                                                                      \
                                        /* Test introduit le 20170518103538 pour optimiser.                                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20170819110449, je note que cette optimisation ne donne pas les resultats obtenus      */ \
                                        /* en son absence. En effet, soit S la source lumineuse et P0 un point dont on constate      */ \
                                        /* qu'il est a l'ombre. En presence de cette optmisation, on va donc prolonger la droite     */ \
                                        /* S --> P0 et memoriser que les points Pi qu'elle contient au-dela de P0 sont eux-aussi a   */ \
                                        /* l'ombre. Mais sans optimisation, il n'est pas evident qu'un certain point Pi aurait ete   */ \
                                        /* vu a l'ombre parce que la droite S --> Pi peut etre legerement differente de la droite    */ \
                                        /* S --> P0 et ce a cause de la "quantification" des albums...                               */ \
                                        /*                                                                                           */ \
                                        /* Le 20170820092802, je note de plus que sans cette optimisation les zones d'ombre qui      */ \
                                        /* sont dans les differentes images de 'albumR' sont en general tres uniformes (c'est par    */ \
                                        /* exemple le cas avec 'v $xiirf/FRB3.z4.6.21') -ce sont des aplats-. Par contre si cette    */ \
                                        /* optimisation est utilisee, ces zones sont alors tres "mitees". Voir a ce propos les       */ \
                                        /* images :                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*        v         $xiaf/FRB3.z4.9.Trouees$R04             compatibilite_20170517=VRAI      */ \
                                        /*        v         $xiaf/FRB3.z4.9.NonTrouees$R04          compatibilite_20170517=FAUX      */ \
                                        /*                                                                                           */ \
                                        /* ou en particulier la petite image en bas et a droite est tres "aleatoire" par endroit     */ \
                                        /* lorsqu'il y a "compatibilite_20170517=VRAI" ; au lieu d'avoir des zones bien homogenes    */ \
                                        /* blanches (ou rouges), il y a des zones blanches pleines de points de toutes les couleurs. */ \
                         Bblock                                                                                                         \
                         CALS(dAinitialisation(album_points_deja_testes,POINT_A_PRIORI_AU_SOLEIL));                                     \
                                        /* Album introduit le 20170517101721 afin d'optimiser. L'initialisation fait qu'a priori     */ \
                                        /* il n'y a pas d'optimisation (pour chaque point {X,Y,Z})...                                */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFID(albumA,albumR))                                                                                           \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("les albums Argument et Resultat sont identiques");                                               \
                                        /* Introduit le 20100906160146 a cause du 'StorePoint(...)' fait ci-apres afin de ne pas     */ \
                                        /* trouver des points a l'ombre d'eux-memes...                                               */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    CALS(MoveAlbum(albumR,albumA));                                                                                     \
                                        /* A priori aucun point n'est a l'ombre...                                                   */ \
                                                                                                                                        \
                    begin_album_back_AvecEditionProgression                                                                             \
                                        /* Le 20170517101721, 'begin_album' a ete remplace par 'begin_album_back' en conjonction     */ \
                                        /* avec l'optimisation associee a 'album_points_deja_testes'. En effet, avec ce nouveau      */ \
                                        /* dispositif on a interet a parcourir en premier les rayons lumineux les plus longs (du     */ \
                                        /* point courant a la sourec lumineuse) et c'est le cas si l'on inverse le parcours de       */ \
                                        /* l'axe 'OZ'...                                                                             */ \
                                        /*                                                                                           */ \
                                        /* Je rappelle le 20170518104940 que des tests menes aux environs du 20170517101721 ont      */ \
                                        /* montre que {begin_album,end_album} et {begin_album_back,end_album_back} donnaient         */ \
                                        /* exactement les memes resultats...                                                         */ \
                                        /*                                                                                           */ \
                                        /* Le 20170520104034 a ete introduit "_AvecEditionProgression"...                            */ \
                         Bblock                                                                                                         \
                         DEFV(TypeAlbum,INIT(niveau_courant,LoadPoint(albumA,X,Y,Z)));                                                  \
                                        /* Niveau du point courant {X,Y,Z}.                                                          */ \
                                                                                                                                        \
                         Test(OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101008)                                  \
                                  ,IFNE                                                                                                 \
                                  ,IFGT                                                                                                 \
                                  ,niveau_courant                                                                                       \
                                  ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album                                      \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              DEFV(genere_p,INIT(etat_du_point_courant,Aload_point(album_points_deja_testes,X,Y,Z)));                   \
                                        /* Optimisation introduite le 20170517101721...                                              */ \
                                                                                                                                        \
                              Test(IFOU(IL_NE_FAUT_PAS_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM                                                 \
                                       ,IFET(IL_FAUT_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM                                                   \
                                            ,IFEQ(etat_du_point_courant,POINT_A_PRIORI_AU_SOLEIL)                                       \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   DEFV(Float,INIT(Xf,f____cNORMALISE_OX(X)));                                                          \
                                   DEFV(Float,INIT(Yf,f____cNORMALISE_OY(Y)));                                                          \
                                   DEFV(Float,INIT(Zf,f____cNORMALISE_OZ(Z)));                                                          \
                                        /* Definition du point courant {X,Y,Z} normalise...                                          */ \
                                   DEFV(Logical,INIT(parcourir_le_rayon_lumineux,VRAI));                                                \
                                   DEFV(Float,INIT(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE));                                          \
                                   DEFV(Float,INIT(increment_de_lambda                                                                  \
                                                  ,MUL2(NomDeLaFonctionCourante QD@@__ _____facteur_de_l_increment_de_lambda            \
                                                       ,DIVI(MIN3(f____lNORMALISE_OX(pasX)                                              \
                                                                 ,f____lNORMALISE_OY(pasY)                                              \
                                                                 ,f____lNORMALISE_OZ(pasZ)                                              \
                                                                  )                                                                     \
                                                            ,RdisF3D(Xf                                                                 \
                                                                    ,Yf                                                                 \
                                                                    ,Zf                                                                 \
                                                                    ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_X             \
                                                                    ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_Y             \
                                                                    ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_Z             \
                                                                     )                                                                  \
                                                             )                                                                          \
                                                        )                                                                               \
                                                   )                                                                                    \
                                        );                                                                                              \
                                        /* Afin de parcourir le rayon lumineux de facon optimale...                                  */ \
                                        /*                                                                                           */ \
                                        /* Cette formule vient du raisonnement suivant. Soit 'C' une coordonnee {X,Y,Z}, 'S' une     */ \
                                        /* coordonnee de la source lumineuse, 'P' une coordonnee du point courant et 'L' la valeur   */ \
                                        /* de 'lambda'. On a donc :                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                  C    = BARY(P,S,L)                                                       */ \
                                        /*                  C+dC = BARY(P,S,L+dL)                                                    */ \
                                        /*                                                                                           */ \
                                        /* soit :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  C    = (1-L).P + L.S                                                     */ \
                                        /*                  C+dC = (1-(L+dL)).P + (L+dL).S                                           */ \
                                        /*                                                                                           */ \
                                        /* d'ou :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  (C+dC)-C = [(1-(L+dL)).P + (L+dL).S] - [(1-L).P + L.S]                   */ \
                                        /*                  dC       = -dL.P + dL.S                                                  */ \
                                        /*                  dC       = (S-P).dL                                                      */ \
                                        /*                                                                                           */ \
                                        /* d'ou :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                        dC                                                                 */ \
                                        /*                  dL = -----                                                               */ \
                                        /*                        S-P                                                                */ \
                                        /*                                                                                           */ \
                                        /* On peut donc extrapoler cela en remarquant que 'dC' correspond aux pas normalises des     */ \
                                        /* coordonnees (on cherche a maximiser 'dL' de facon a essayer de faire que le point 'C'     */ \
                                        /* courant soit different du point precedent tout en etant son voisin, ce qui peut se        */ \
                                        /* symboliser par dC=1) et 'S-P' a la distance de 'P' a 'S'...                               */ \
                                        /*                                                                                           */ \
                                        /* Le facteur multiplicatif ('_____facteur_de_l_increment_de_lambda'), egal evidemment a 1   */ \
                                        /* par defaut, peut etre, en particulier, augmente : cela aura pour effet d'accelerer les    */ \
                                        /* calculs avec un inconvenient important, celui de faire eventuellement disparaitre des     */ \
                                        /* petits details...                                                                         */ \
                                                                                                                                        \
                                   StorePoint(NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album,albumA,X,Y,Z);            \
                                        /* Afin que le point courant {X,Y,Z} ne se retrouve pas a l'ombre de lui-meme...             */ \
                                        /*                                                                                           */ \
                                        /* On notera que la modification du 20140917151041 rend tres certainement inutile ce qui     */ \
                                        /* precede (tout en etant plus general...), mais on ne sait jamais...                        */ \
                                                                                                                                        \
                                   Tant(IL_FAUT(parcourir_le_rayon_lumineux))                                                           \
                                        Bblock                                                                                          \
                                        DEFV(Float,INIT(Xfl,PARCOURS_DU_RAYON_LUMINEUX(Xf,_____source_lumineuse_X)));                   \
                                        DEFV(Float,INIT(Yfl,PARCOURS_DU_RAYON_LUMINEUX(Yf,_____source_lumineuse_Y)));                   \
                                        DEFV(Float,INIT(Zfl,PARCOURS_DU_RAYON_LUMINEUX(Zf,_____source_lumineuse_Z)));                   \
                                        /* Point courant du rayon lumineux qui est parcouru du point {X,Y,Z} (lambda=0) a la         */ \
                                        /* source lumineuse (lambda=1).                                                              */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20170516102430, j'ai verifie en recalculant 'v $xiirc/MANE.r5.5.21' au format 'Suq'    */ \
                                        /* et pour 'Z=60', que les coordonnees {Xfl,Yfl,Zfl} denormalisees progressaient tout        */ \
                                        /* a fait correctement et sans redondance (c'est-a-dire qu'il semble qu'il n y ait           */ \
                                        /* pratiquement pas de points qui soient utilises plusieurs fois). On trouve ainsi, par      */ \
                                        /* exemple, pour :                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                  {Xf,Yf,Zf}        = {+0.937500,+0.164062,+0.468750}                      */ \
                                        /*                  SourceLumineuse   = {+1.000000,+1.000000,-1.500000}                      */ \
                                        /*                                                                                           */ \
                                        /*        lambda=+0.000000    Xfl=+0.937500(+120) Yfl=+0.164062(+21) Zfl=+0.468750(+60)      */ \
                                        /*        lambda=+0.003651    Xfl=+0.937728(+120) Yfl=+0.167115(+21) Zfl=+0.461562(+59)      */ \
                                        /*        lambda=+0.007302    Xfl=+0.937956(+120) Yfl=+0.170167(+21) Zfl=+0.454374(+58)      */ \
                                        /*        lambda=+0.010953    Xfl=+0.938185(+120) Yfl=+0.173219(+22) Zfl=+0.447186(+57)      */ \
                                        /*        lambda=+0.014604    Xfl=+0.938413(+120) Yfl=+0.176271(+22) Zfl=+0.439998(+56)      */ \
                                        /*        lambda=+0.018255    Xfl=+0.938641(+120) Yfl=+0.179323(+22) Zfl=+0.432810(+55)      */ \
                                        /*        lambda=+0.021906    Xfl=+0.938869(+120) Yfl=+0.182375(+23) Zfl=+0.425622(+54)      */ \
                                        /*        lambda=+0.025557    Xfl=+0.939097(+120) Yfl=+0.185427(+23) Zfl=+0.418434(+53)      */ \
                                        /*        lambda=+0.029209    Xfl=+0.939326(+120) Yfl=+0.188479(+24) Zfl=+0.411246(+52)      */ \
                                        /*        lambda=+0.032860    Xfl=+0.939554(+120) Yfl=+0.191531(+24) Zfl=+0.404058(+51)      */ \
                                        /*        lambda=+0.036511    Xfl=+0.939782(+120) Yfl=+0.194583(+24) Zfl=+0.396870(+50)      */ \
                                        /*        lambda=+0.040162    Xfl=+0.940010(+120) Yfl=+0.197635(+25) Zfl=+0.389682(+49)      */ \
                                        /*        lambda=+0.043813    Xfl=+0.940238(+120) Yfl=+0.200687(+25) Zfl=+0.382493(+48)      */ \
                                        /*        lambda=+0.047464    Xfl=+0.940466(+120) Yfl=+0.203739(+26) Zfl=+0.375305(+48)      */ \
                                        /*        lambda=+0.051115    Xfl=+0.940695(+120) Yfl=+0.206791(+26) Zfl=+0.368117(+47)      */ \
                                        /*        lambda=+0.054766    Xfl=+0.940923(+120) Yfl=+0.209843(+26) Zfl=+0.360929(+46)      */ \
                                        /*        lambda=+0.058417    Xfl=+0.941151(+120) Yfl=+0.212896(+27) Zfl=+0.353741(+45)      */ \
                                        /*        lambda=+0.062068    Xfl=+0.941379(+120) Yfl=+0.215948(+27) Zfl=+0.346553(+44)      */ \
                                        /*        lambda=+0.065719    Xfl=+0.941607(+120) Yfl=+0.219000(+28) Zfl=+0.339365(+43)      */ \
                                        /*        lambda=+0.069370    Xfl=+0.941836(+120) Yfl=+0.222052(+28) Zfl=+0.332177(+42)      */ \
                                        /*        lambda=+0.073021    Xfl=+0.942064(+120) Yfl=+0.225104(+28) Zfl=+0.324989(+41)      */ \
                                        /*        lambda=+0.076672    Xfl=+0.942292(+120) Yfl=+0.228156(+29) Zfl=+0.317801(+40)      */ \
                                        /*        lambda=+0.080324    Xfl=+0.942520(+120) Yfl=+0.231208(+29) Zfl=+0.310613(+39)      */ \
                                        /*        lambda=+0.083975    Xfl=+0.942748(+120) Yfl=+0.234260(+29) Zfl=+0.303425(+38)      */ \
                                        /*        lambda=+0.087626    Xfl=+0.942977(+120) Yfl=+0.237312(+30) Zfl=+0.296237(+37)      */ \
                                        /*        lambda=+0.091277    Xfl=+0.943205(+120) Yfl=+0.240364(+30) Zfl=+0.289049(+36)      */ \
                                        /*        lambda=+0.094928    Xfl=+0.943433(+120) Yfl=+0.243416(+31) Zfl=+0.281861(+36)      */ \
                                        /*        lambda=+0.098579    Xfl=+0.943661(+120) Yfl=+0.246468(+31) Zfl=+0.274673(+35)      */ \
                                        /*        lambda=+0.102230    Xfl=+0.943889(+120) Yfl=+0.249520(+31) Zfl=+0.267485(+34)      */ \
                                        /*        lambda=+0.105881    Xfl=+0.944118(+120) Yfl=+0.252572(+32) Zfl=+0.260297(+33)      */ \
                                        /*        lambda=+0.109532    Xfl=+0.944346(+120) Yfl=+0.255624(+32) Zfl=+0.253109(+32)      */ \
                                        /*        lambda=+0.113183    Xfl=+0.944574(+120) Yfl=+0.258677(+33) Zfl=+0.245921(+31)      */ \
                                        /*        lambda=+0.116834    Xfl=+0.944802(+120) Yfl=+0.261729(+33) Zfl=+0.238733(+30)      */ \
                                        /*        lambda=+0.120485    Xfl=+0.945030(+120) Yfl=+0.264781(+33) Zfl=+0.231545(+29)      */ \
                                        /*        lambda=+0.124136    Xfl=+0.945259(+120) Yfl=+0.267833(+34) Zfl=+0.224357(+28)      */ \
                                        /*        lambda=+0.127787    Xfl=+0.945487(+121) Yfl=+0.270885(+34) Zfl=+0.217168(+27)      */ \
                                        /*        lambda=+0.131439    Xfl=+0.945715(+121) Yfl=+0.273937(+35) Zfl=+0.209980(+26)      */ \
                                        /*        lambda=+0.135090    Xfl=+0.945943(+121) Yfl=+0.276989(+35) Zfl=+0.202792(+25)      */ \
                                        /*        lambda=+0.138741    Xfl=+0.946171(+121) Yfl=+0.280041(+35) Zfl=+0.195604(+25)      */ \
                                        /*        lambda=+0.142392    Xfl=+0.946399(+121) Yfl=+0.283093(+36) Zfl=+0.188416(+24)      */ \
                                        /*        lambda=+0.146043    Xfl=+0.946628(+121) Yfl=+0.286145(+36) Zfl=+0.181228(+23)      */ \
                                        /*        lambda=+0.149694    Xfl=+0.946856(+121) Yfl=+0.289197(+37) Zfl=+0.174040(+22)      */ \
                                        /*        lambda=+0.153345    Xfl=+0.947084(+121) Yfl=+0.292249(+37) Zfl=+0.166852(+21)      */ \
                                        /*        lambda=+0.156996    Xfl=+0.947312(+121) Yfl=+0.295301(+37) Zfl=+0.159664(+20)      */ \
                                        /*        lambda=+0.160647    Xfl=+0.947540(+121) Yfl=+0.298353(+38) Zfl=+0.152476(+19)      */ \
                                        /*        lambda=+0.164298    Xfl=+0.947769(+121) Yfl=+0.301405(+38) Zfl=+0.145288(+18)      */ \
                                        /*        lambda=+0.167949    Xfl=+0.947997(+121) Yfl=+0.304458(+38) Zfl=+0.138100(+17)      */ \
                                        /*        lambda=+0.171600    Xfl=+0.948225(+121) Yfl=+0.307510(+39) Zfl=+0.130912(+16)      */ \
                                        /*        lambda=+0.175251    Xfl=+0.948453(+121) Yfl=+0.310562(+39) Zfl=+0.123724(+15)      */ \
                                        /*        lambda=+0.178902    Xfl=+0.948681(+121) Yfl=+0.313614(+40) Zfl=+0.116536(+14)      */ \
                                        /*        lambda=+0.182553    Xfl=+0.948910(+121) Yfl=+0.316666(+40) Zfl=+0.109348(+13)      */ \
                                        /*        lambda=+0.186205    Xfl=+0.949138(+121) Yfl=+0.319718(+40) Zfl=+0.102160(+13)      */ \
                                        /*        lambda=+0.189856    Xfl=+0.949366(+121) Yfl=+0.322770(+41) Zfl=+0.094972(+12)      */ \
                                        /*        lambda=+0.193507    Xfl=+0.949594(+121) Yfl=+0.325822(+41) Zfl=+0.087784(+11)      */ \
                                        /*        lambda=+0.197158    Xfl=+0.949822(+121) Yfl=+0.328874(+42) Zfl=+0.080596(+10)      */ \
                                        /*        lambda=+0.200809    Xfl=+0.950051(+121) Yfl=+0.331926(+42) Zfl=+0.073408(+9)       */ \
                                        /*        lambda=+0.204460    Xfl=+0.950279(+121) Yfl=+0.334978(+42) Zfl=+0.066220(+8)       */ \
                                        /*        lambda=+0.208111    Xfl=+0.950507(+121) Yfl=+0.338030(+43) Zfl=+0.059031(+7)       */ \
                                        /*        lambda=+0.211762    Xfl=+0.950735(+121) Yfl=+0.341082(+43) Zfl=+0.051843(+6)       */ \
                                        /*        lambda=+0.215413    Xfl=+0.950963(+121) Yfl=+0.344134(+44) Zfl=+0.044655(+5)       */ \
                                        /*        lambda=+0.219064    Xfl=+0.951192(+121) Yfl=+0.347186(+44) Zfl=+0.037467(+4)       */ \
                                        /*        lambda=+0.222715    Xfl=+0.951420(+121) Yfl=+0.350239(+44) Zfl=+0.030279(+3)       */ \
                                        /*        lambda=+0.226366    Xfl=+0.951648(+121) Yfl=+0.353291(+45) Zfl=+0.023091(+2)       */ \
                                        /*        lambda=+0.230017    Xfl=+0.951876(+121) Yfl=+0.356343(+45) Zfl=+0.015903(+2)       */ \
                                        /*        lambda=+0.233668    Xfl=+0.952104(+121) Yfl=+0.359395(+46) Zfl=+0.008715(+1)       */ \
                                        /*        lambda=+0.237320    Xfl=+0.952332(+121) Yfl=+0.362447(+46) Zfl=+0.001527(+0)       */ \
                                        /*        lambda=+0.240971    Xfl=+0.952561(+121) Yfl=+0.365499(+46) Zfl=-0.005661(-1)       */ \
                                        /*                                                                                           */ \
                                        /* avec entre parentheses les valeurs denormalisees des coordonnees {Xfl,Yfl,Zfl} afin de    */ \
                                        /* pouvoir verifier plus facilement la non redondance...                                     */ \
                                        DEFV(TypeAlbum,INIT(niveau_courant_sur_le_rayon_lumineux,NiveauUndef));                         \
                                                                                                                                        \
                                        Test(IL_NE_FAUT_PAS_OPTIMISER_2_L_OMBRAGE_D_UN_ALBUM)                                           \
                                        /* Test introduit le 20170826101753...                                                       */ \
                                             Bblock                                                                                     \
                                             EGAL(niveau_courant_sur_le_rayon_lumineux                                                  \
                                                 ,LoadPoint_coordonnees_01(albumA                                                       \
                                                                          ,Xfl                                                          \
                                                                          ,Yfl                                                          \
                                                                          ,Zfl                                                          \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____periodiser_X             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____symetriser_X             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z             \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____prolonger_X              \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y              \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z              \
                                                                          ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album        \
                                                                           )                                                            \
                                                  );                                                                                    \
                                        /* Afin d'alleger le 'IFNE_a_peu_pres_absolu(...)' suivant...                                */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             EGAL(niveau_courant_sur_le_rayon_lumineux                                                  \
                                                 ,LoadPoint(albumA                                                                      \
                                                           ,_cDENORMALISE_OX(Xfl)                                                       \
                                                           ,_cDENORMALISE_OY(Yfl)                                                       \
                                                           ,_cDENORMALISE_OZ(Zfl)                                                       \
                                                            )                                                                           \
                                                  );                                                                                    \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                                                                                                                        \
                                        Test(I3ET(IFGT(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE)                                        \
                                                 ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20140917)              \
                                                      ,TOUJOURS_VRAI                                                                    \
                                                      ,I3ET(IFNE(_cDENORMALISE_OX(Xfl),X)                                               \
                                                           ,IFNE(_cDENORMALISE_OY(Yfl),Y)                                               \
                                                           ,IFNE(_cDENORMALISE_OZ(Zfl),Z)                                               \
                                                            )                                                                           \
                                                       )                                                                                \
                                                 ,OPC3(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101008)              \
                                                      ,IFNE_a_peu_pres_absolu                                                           \
                                                      ,IFGT_a_peu_pres_absolu                                                           \
                                                      ,niveau_courant_sur_le_rayon_lumineux                                             \
                                                      ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album                  \
                                                      ,NomDeLaFonctionCourante QD@@__ _____detecteur_du_vide                            \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        /* L'usage de 'IFNE_a_peu_pres_absolu(...)' est du aux interpolations qui peuvent faire      */ \
                                        /* apparaitre des quantites infinitesimales parasites (introduit le 20100622190655).         */ \
                                        /*                                                                                           */ \
                                        /* En fait, il y avait ici un 'IFNE_a_peu_pres_relatif(...)' tout a fait stupide jusqu'au    */ \
                                        /* 20100701153626...                                                                         */ \
                                        /*                                                                                           */ \
                                        /* Le 20140917151041 fut introduit un test evitant au rayon lumineux de partir du points     */ \
                                        /* courant {X,Y,Z}. Cela s'etait vu a cette date lors du calcul de 'v $xiirf/MENG.41.1.1'    */ \
                                        /* au point {496,741,256}...                                                                 */ \
                                        /*                                                                                           */ \
                                        /* En ce qui concerne l'option "_____compatibilite_20140917", le 20170731094344, je suggere  */ \
                                        /* de comparer les images :                                                                  */ \
                                        /*                                                                                           */ \
                                        /*        v         $xiirf/FRB3.z4.7.trouees_1.21 (_____compatibilite_20140917=FAUX)         */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*        v         $xiirf/FRB3.z4.7.21           (_____compatibilite_20140917=VRAI)         */ \
                                        /*                                                                                           */ \
                                        /* la premiere faisant apparaitre des trous...                                               */ \
                                             Bblock                                                                                     \
                                        /* Cas ou le point courant {X,Y,Z} est a l'ombre d'un autre point (situe entre lui et la     */ \
                                        /* source lumineuse...).                                                                     */ \
                                             StorePoint(COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20110816)        \
                                                            ,MUL3(NomDeLaFonctionCourante QD@@__ _____attenuation_globale_des_points    \
                                                                 ,attenuation_des_points_a_l_ombre                                      \
                                                                 ,niveau_courant                                                        \
                                                                  )                                                                     \
                                        /* L'attenuation globale des points a ete introduite le 20120904124846 au cas ou...          */ \
                                                            ,COND(I3ET(IFINff(Xfl                                                       \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MINIMALE                         \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                         \
                                                                              )                                                         \
                                                                      ,IFINff(Yfl                                                       \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MINIMALE                         \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                         \
                                                                              )                                                         \
                                                                      ,IFINff(Zfl                                                       \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MINIMALE                         \
                                                                             ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                         \
                                                                              )                                                         \
                                                                       )                                                                \
                                                                 ,MUL2(attenuation_des_points_a_l_ombre                                 \
                                                                      ,niveau_courant                                                   \
                                                                       )                                                                \
                                                                 ,NEUT(niveau_courant)                                                  \
                                        /* Cas des points qui sont (du moins a "epsilon pres") au bord du parallelepipede de         */ \
                                        /* de l'album et du cote de la source lumineuse : ils ne peuvent donc etre a l'ombre...      */ \
                                        /* Cela fut introduit le 20110816111113 lors de la generation de 'v $xiirc/MANE.D1.2'.       */ \
                                        /* On notera qu'alors apparaissait dans la partie inferieure gauche de la face avant de      */ \
                                        /* l'objet une zone plane et verticale semblant etre a l'ombre (alors qu'elle ne l'etait     */ \
                                        /* pas) ; cela se manifestait en mode 'Pdu', mais pas en 'Puq' (et 'Pud' me semble-t-il),    */ \
                                        /* certainement pour des problemes de pente des rayons lumineux (en effet, l'interpolation   */ \
                                        /* effectuee par 'LoadPoint_coordonnees_01(...)' ci-dessus peut donner des niveaux           */ \
                                        /* significatifs lors  d'incidences "rasantes" et ainsi un point peut sembler alors a        */ \
                                        /* l'ombre de l'un de ses voisins d'un meme plan vertical que lui...).                       */ \
                                                                  )                                                                     \
                                                             )                                                                          \
                                                       ,albumR                                                                          \
                                                       ,X,Y,Z                                                                           \
                                                        );                                                                              \
                                        /* Le niveau du point courant {X,Y,Z} est attenue...                                         */ \
                                                                                                                                        \
                                             EGAL(parcourir_le_rayon_lumineux,FAUX);                                                    \
                                        /* Et on arrete evidemment de parcourir la droite joignant le point courant {X,Y,Z} a la     */ \
                                        /* source lumineuse.                                                                         */ \
                                                                                                                                        \
                                             Test(IL_FAUT_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM)                                             \
                                        /* Test introduit le 20170518103538 pour optimiser.                                          */ \
                                                  Bblock                                                                                \
                                                  DECR(lambda,increment_de_lambda);                                                     \
                                                  DECR(lambda,increment_de_lambda);                                                     \
                                        /* Et on revient en arriere sur la droite courante. On notera que le 'DECR(...)' est fait    */ \
                                        /* deux fois : la premiere pour compenser le 'INCR(...)' qui precede et la seconde pour      */ \
                                        /* eviter le dernier point que l'on vient de tester...                                       */ \
                                                                                                                                        \
                                                  Tant(IFGE(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE))                                  \
                                                       Bblock                                                                           \
                                                       DEFV(Float,INIT(Xflb,PARCOURS_DU_RAYON_LUMINEUX(Xf,_____source_lumineuse_X)));   \
                                                       DEFV(Float,INIT(Yflb,PARCOURS_DU_RAYON_LUMINEUX(Yf,_____source_lumineuse_Y)));   \
                                                       DEFV(Float,INIT(Zflb,PARCOURS_DU_RAYON_LUMINEUX(Zf,_____source_lumineuse_Z)));   \
                                                                                                                                        \
                                                       Astore_point_valide(POINT_EN_REALITE_A_L_OMBRE                                   \
                                                                          ,album_points_deja_testes                                     \
                                                                          ,_cDENORMALISE_OX(Xflb)                                       \
                                                                          ,_cDENORMALISE_OY(Yflb)                                       \
                                                                          ,_cDENORMALISE_OZ(Zflb)                                       \
                                                                           );                                                           \
                                        /* On memorise que les points deja rencontres sur la droite courante sont donc eux-aussi     */ \
                                        /* a l'ombre...                                                                              */ \
                                        /*                                                                                           */ \
                                        /* Le 20170518090946, je m'interroge sur cette optimisation car, en effet, le point courant  */ \
                                        /* {Xflb,Yflb,Zflb} est en quelque sorte memorise en "entier" via 'Astore_point_valide(...)' */ \
                                        /* ce qui fait que la droite courante est donc memorisee comme un "zig-zag". A cette date    */ \
                                        /* de fait donc de cette optimisation une option inhibee par defaut...                       */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20170519100142 grace a 'v $xiirc/MANE.r5.5.1' (qui fut generee avant le      */ \
                                        /* 20170517101721, comme si donc "compatibilite_20170517=VRAI") et 'v $xiirc/MANE.t5.5.1'    */ \
                                        /* (generee apres le 20170517101721, comme si donc "compatibilite_20170517=FAUX") que les    */ \
                                        /* deux methodes ne donnent pas les memes resultats, mais qu'ils sont tous les deux          */ \
                                        /* acceptables. La nouvelle methode ("compatibilite_20170517=FAUX") etant plus rapide,       */ \
                                        /* c'est donc elle qui est choisie par defaut...                                             */ \
                                                                                                                                        \
                                                       DECR(lambda,increment_de_lambda);                                                \
                                        /* Et on revient en arriere sur la droite courante...                                        */ \
                                                       Eblock                                                                           \
                                                  ETan                                                                                  \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                        /* Cas ou le point courant {X,Y,Z} semble ne pas etre a l'ombre (du moins, pas encore...).   */ \
                                             Test(IFET(IFLT(lambda,COORDONNEE_BARYCENTRIQUE_MAXIMALE)                                   \
                                                      ,I3ET(IFINff(Xfl                                                                  \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                    \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                    \
                                                                   )                                                                    \
                                                           ,IFINff(Yfl                                                                  \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                    \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                    \
                                                                   )                                                                    \
                                                           ,IFINff(Zfl                                                                  \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                    \
                                                                  ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                    \
                                                                   )                                                                    \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                        /* On notera qu'en general la source lumineuse est en dehors du volume de l'album, ce qui    */ \
                                        /* fait que le point {Xfl,Yfl,Zfl} au voisinage de la source lumineuse est en dehors de      */ \
                                        /* [0,1]x[0,1]x[0,1]...                                                                      */ \
                                                  Bblock                                                                                \
                                                  INCR(lambda,increment_de_lambda);                                                     \
                                        /* Et on progresse sur la droite courante...                                                 */ \
                                                                                                                                        \
                                                  Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20140917))             \
                                                       Bblock                                                                           \
                                                       Eblock                                                                           \
                                                  ATes                                                                                  \
                                                       Bblock                                                                           \
                                                       Test(IFGT(lambda,COORDONNEE_BARYCENTRIQUE_MAXIMALE))                             \
                                                            Bblock                                                                      \
                                                            EGAL(parcourir_le_rayon_lumineux,FAUX);                                     \
                                        /* Introduit le 20140917151041...                                                            */ \
                                                            Eblock                                                                      \
                                                       ATes                                                                             \
                                                            Bblock                                                                      \
                                                            Eblock                                                                      \
                                                       ETes                                                                             \
                                                       Eblock                                                                           \
                                                  ETes                                                                                  \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  EGAL(parcourir_le_rayon_lumineux,FAUX);                                               \
                                        /* Et on arrete evidemment de parcourir la droite joignant le point courant {X,Y,Z} a la     */ \
                                        /* source lumineuse, puisque l'on a atteint cette derniere ou bien que l'on est sorti de     */ \
                                        /* l'album...                                                                                */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETan                                                                                                 \
                                                                                                                                        \
                                   StorePoint(niveau_courant,albumA,X,Y,Z);                                                             \
                                        /* Restauration du point courant {X,Y,Z}...                                                  */ \
                                        /*                                                                                           */ \
                                        /* On notera que la modification du 20140917151041 rend tres certainement inutile ce qui     */ \
                                        /* precede (tout en etant plus general...), mais on ne sait jamais...                        */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IFEQ(etat_du_point_courant,POINT_EN_REALITE_A_L_OMBRE))                                         \
                                        /* Optimisation introduite le 20170517101721...                                              */ \
                                        Bblock                                                                                          \
                                        StorePoint(COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20110816)             \
                                                       ,MUL3(NomDeLaFonctionCourante QD@@__ _____attenuation_globale_des_points         \
                                                            ,NomDeLaFonctionCourante QD@@__ _____attenuation_des_points_a_l_ombre       \
                                                            ,niveau_courant                                                             \
                                                             )                                                                          \
                                                       ,MUL2(NomDeLaFonctionCourante QD@@__ _____attenuation_des_points_a_l_ombre       \
                                                            ,niveau_courant                                                             \
                                                             )                                                                          \
                                                        )                                                                               \
                                                  ,albumR                                                                               \
                                                  ,X,Y,Z                                                                                \
                                                   );                                                                                   \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    end_album_back_AvecEditionProgression                                                                               \
                                        /* Le 20170520104034 a ete introduit "_AvecEditionProgression"...                            */ \
                                                                                                                                        \
                    EDEFV(album,album_points_deja_testes);                                                                              \
                    Eblock                                                                                                              \
                                        /* Procedure generale d'ombrage d'un album (introduite le 20140929102848).                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O M B R A G E   D ' U N   A L B U M   S T A N D A R D  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

                                        /* Les options de compatibilite suivantes ont ete introduites par "symetrie" avec celles     */
                                        /* de 'AFombrage(...)'...                                                                    */

DEFV(Common,DEFV(Logical,SINT(Aombrage_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(Aombrage_____compatibilite_20110816,FAUX)));
                                        /* Option de compatibilite introduite le 20110816111113 et concernant le traitement          */
                                        /* des points (eventuels) de la couche 'Z' du premier plan.                                  */
DEFV(Common,DEFV(Logical,SINT(Aombrage_____compatibilite_20140917,FAUX)));
                                        /* Option de compatibilite introduite le 20140917151041 et concernant le parcours des        */
                                        /* rayons lumineux sur les premiers points (proches de {X,Y,Z}) afin d'eviter un             */
                                        /* phenomene d'"auto-ombrage"...                                                             */

                                        /* Les options de compatibilite precedentes ont ete introduites par "symetrie" avec celles   */
                                        /* de 'AFombrage(...)'...                                                                    */

DEFV(Common,DEFV(Logical,SINT(Aombrage_____compatibilite_20170517,VRAI)));
                                        /* Option de compatibilite introduite le 20170517101721 et concernant l'optimisation de      */
                                        /* l'ombrage...                                                                              */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera le 20170731143244, en comparant les images 'v $xiirf/FRB3.z4.7.21'  */
                                        /* et 'v $xiirf/FRB3.z4.7.trouees_2.21', que cette optimisation introduit des trous..        */
                                        /*                                                                                           */
                                        /* Le 20170819110449, cette optimisation a donc ete inhibee a cause des defauts qu'elle      */
                                        /* introduit dans les images...                                                              */

DEFV(Common,DEFV(Logical,SINT(Aombrage_____optimisation_2,FAUX)));
                                        /* Option d'activation de l'optimisation 2 de l'ombrage (introduite le 20170826101036).      */

DEFV(Common,DEFV(Float,SINT(Aombrage_____facteur_de_l_increment_de_lambda,FU)));
                                        /* Facteur de calcul de 'increment_de_lambda'.                                               */

DEFV(Common,DEFV(Float,SINT(Aombrage_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(Aombrage_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(Aombrage_____source_lumineuse_Z,FU)));
                                        /* Position de la source lumineuse.                                                          */

DEFV(Common,DEFV(Float,SINT(Aombrage_____attenuation_globale_des_points,FU)));
                                        /* Attenuation globale des points...                                                         */
DEFV(Common,DEFV(Float,SINT(Aombrage_____attenuation_des_points_a_l_ombre,FDU)));
                                        /* Attenuation des niveaux des points a l'ombre d'autres points...                           */

DEFV(Common,DEFV(Float,SINT(Aombrage_____detecteur_du_vide,FU)));
DEFV(Common,DEFV(genere_p,SINT(Aombrage_____niveau_du_vide_dans_l_album,NOIR)));
                                        /* Niveau correspondant au "vide" dans l'album Argument.                                     */

DEFV(Common,DEFV(Logical,SINT(Aombrage_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Aombrage_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_p,SINT(Aombrage_____niveau_hors_album,NIVEAU_HORS_ECRAN)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */

DEFV(Common,DEFV(FonctionP,POINTERp(Aombrage(albumR,albumA))))
                                        /* Fonction introduite le 20140929104518...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "ombre"...                      */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     BSaveModifyVariable(genere_p
                        ,Niveau____hors_album
                        ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album
                         );

     OMBRAGE_D_UN_ALBUM(genere_p,AMOVE,Aload_point_valide,Astore_point,FAload_point_coordonnees_01,NIVEAU_UNDEF);
                                        /* Mis sous cette forme le 20140929102848...                                                 */
                                        /*                                                                                           */
                                        /* Le 20170826101753, 'Aload_point_valide(...)' a remplace 'Aload_point(...)' et ce a        */
                                        /* cause de 'Aombrage_____optimisation_2'...                                                 */

     ESaveModifyVariable(genere_p
                        ,Niveau____hors_album
                         );

     RETA(albumR);
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O M B R A G E   D ' U N   A L B U M   N O N   S T A N D A R D  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFombrage_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(AFombrage_____compatibilite_20110816,FAUX)));
                                        /* Option de compatibilite introduite le 20110816111113 et concernant le traitement          */
                                        /* des points (eventuels) de la couche 'Z' du premier plan.                                  */
DEFV(Common,DEFV(Logical,SINT(AFombrage_____compatibilite_20140917,FAUX)));
                                        /* Option de compatibilite introduite le 20140917151041 et concernant le parcours des        */
                                        /* rayons lumineux sur les premiers points (proches de {X,Y,Z}) afin d'eviter un             */
                                        /* phenomene d'"auto-ombrage"...                                                             */

DEFV(Common,DEFV(Logical,SINT(AFombrage_____compatibilite_20170517,VRAI)));
                                        /* Option de compatibilite introduite le 20170517101721 et concernant l'optimisation de      */
                                        /* l'ombrage...                                                                              */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera le 20170731143244, en comparant les images 'v $xiirf/FRB3.z4.7.21'  */
                                        /* et 'v $xiirf/FRB3.z4.7.trouees_2.21', que cette optimisation introduit des trous..        */
                                        /*                                                                                           */
                                        /* Le 20170819110449, cette optimisation a donc ete inhibee a cause des defauts qu'elle      */
                                        /* introduit dans les images...                                                              */

DEFV(Common,DEFV(Logical,SINT(AFombrage_____optimisation_2,FAUX)));
                                        /* Option d'activation de l'optimisation 2 de l'ombrage (introduite le 20170826101036).      */

DEFV(Common,DEFV(Float,SINT(AFombrage_____facteur_de_l_increment_de_lambda,FU)));
                                        /* Facteur de calcul de 'increment_de_lambda' (introduit le 20100622185409, par exemple      */
                                        /* pour accelerer les calculs en donnant des valeurs superieures a 1).                       */

DEFV(Common,DEFV(Float,SINT(AFombrage_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(AFombrage_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(AFombrage_____source_lumineuse_Z,FU)));
                                        /* Position de la source lumineuse.                                                          */

DEFV(Common,DEFV(Float,SINT(AFombrage_____attenuation_globale_des_points,FU)));
                                        /* Attenuation globale des points introduite le 20120904124846...                            */
DEFV(Common,DEFV(Float,SINT(AFombrage_____attenuation_des_points_a_l_ombre,FDU)));
                                        /* Attenuation des niveaux des points a l'ombre d'autres points...                           */

DEFV(Common,DEFV(Float,SINT(AFombrage_____detecteur_du_vide,FU)));
DEFV(Common,DEFV(Float,SINT(AFombrage_____niveau_du_vide_dans_l_album,FZERO)));
                                        /* Niveau correspondant au "vide" dans l'album Argument. Jusqu'au 20100701153626,            */
                                        /* 'AFombrage_____detecteur_du_vide' valait 'FRA10(FRA10(FRA10(FU)))'...                     */

DEFV(Common,DEFV(Logical,SINT(AFombrage_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFombrage_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(AFombrage_____niveau_hors_album,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */

DEFV(Common,DEFV(FonctionF,POINTERF(AFombrage(albumR,albumA))))
                                        /* Fonction introduite le 20100622172141...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "ombre"...                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     BSaveModifyVariable(genere_p
                        ,Niveau____hors_album
                        ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_hors_album)
                         );
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */

     OMBRAGE_D_UN_ALBUM(genere_Float,AFmove,AloadF_point_valide,AstoreF_point,FFAload_point_coordonnees_01,FLOT__NIVEAU_UNDEF);
                                        /* Mis sous cette forme le 20140929102848...                                                 */
                                        /*                                                                                           */
                                        /* Le 20170826101753, 'AloadF_point_valide(...)' a remplace 'AloadF_point(...)' et ce a      */
                                        /* cause de 'Aombrage_____optimisation_2'...                                                 */

     ESaveModifyVariable(genere_p
                        ,Niveau____hors_album
                         );
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */

     RETAF(albumR);
     Eblock

EFonctionF

#undef    OMBRAGE_D_UN_ALBUM

#undef    attenuation_des_points_a_l_ombre

#undef    IL_NE_FAUT_PAS_OPTIMISER_2_L_OMBRAGE_D_UN_ALBUM
#undef    IL_FAUT_OPTIMISER_2_L_OMBRAGE_D_UN_ALBUM

#undef    IL_NE_FAUT_PAS_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM
#undef    IL_FAUT_OPTIMISER_1_L_OMBRAGE_D_UN_ALBUM
#undef    non__optimisation_1_de_l_ombrage_d_un_album

#undef    PARCOURS_DU_RAYON_LUMINEUX

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   " G E N E R A L E "   D ' U N   A L B U M  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   CONVOLUTION_D_UN_ALBUM(TypeAlbum,StorePoint,LoadPoint)                                                                        \
                    Bblock                                                                                                              \
                    DEFV(Float,INIT(rayon_de_la_sphere_incrite_dans_le_noyau,FLOT__UNDEF));                                             \
                                        /* Au cas ou le noyau ne serait pas parallelepipedique...                                    */ \
                                                                                                                                        \
                    Test(EST_FAUX(NomDeLaFonctionCourante QD@@__ _____le_noyau_est_parallelepipedique))                                 \
                         Bblock                                                                                                         \
                         EGAL(rayon_de_la_sphere_incrite_dans_le_noyau                                                                  \
                             ,FLOT(OPC3(EST_VRAI(NomDeLaFonctionCourante QD@@__ _____le_rayon_de_la_sphere_du_noyau_est_minimal)        \
                                       ,MIN3                                                                                            \
                                       ,MAX3                                                                                            \
                                       ,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_X                                   \
                                       ,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Y                                   \
                                       ,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Z                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    begin_album_back_AvecEditionProgression                                                                             \
                         Bblock                                                                                                         \
                         DEFV(Int,INIT(nombre_de_points_cumules,ZERO));                                                                 \
                         DEFV(Float,INIT(cumul_des_niveaux,FZERO));                                                                     \
                                        /* On notera le type 'Float' quel que soit le type des albums (pour simplifier et            */ \
                                        /* generaliser...).                                                                          */ \
                                                                                                                                        \
                         Test(IFOU(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____convoluer_tous_les_points)                               \
                                  ,IFET(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____convoluer_tous_les_points)                   \
                                       ,IFNE(LoadPoint(albumA,X,Y,Z)                                                                    \
                                            ,NomDeLaFonctionCourante QD@@__ _____niveau_des_points_a_ne_pas_convoluer                   \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Test d'eventuelle optimisation introduit le 20180509150020...                             */ \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(X_gauche,UNDEF));                                                                           \
                              DEFV(Int,INIT(X_centre,X));                                                                               \
                              DEFV(Int,INIT(X_droite,UNDEF));                                                                           \
                                        /* Points interessants de l'axe 'OX'.                                                        */ \
                              DEFV(Int,INIT(Y_bas___,UNDEF));                                                                           \
                              DEFV(Int,INIT(Y_centre,Y));                                                                               \
                              DEFV(Int,INIT(Y_haut__,UNDEF));                                                                           \
                                        /* Points interessants de l'axe 'OY'.                                                        */ \
                              DEFV(Int,INIT(Z_front_,UNDEF));                                                                           \
                              DEFV(Int,INIT(Z_centre,Z));                                                                               \
                              DEFV(Int,INIT(Z_back__,UNDEF));                                                                           \
                                        /* Points interessants de l'axe 'OZ'.                                                        */ \
                                                                                                                                        \
                              EGAL(X_gauche,SOUS(X_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_X));              \
                              EGAL(X_droite,ADD2(X_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_X));              \
                                                                                                                                        \
                              EGAL(Y_bas___,SOUS(Y_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Y));              \
                              EGAL(Y_haut__,ADD2(Y_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Y));              \
                                                                                                                                        \
                              EGAL(Z_front_,SOUS(Z_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Z));              \
                              EGAL(Z_back__,ADD2(Z_centre,NomDeLaFonctionCourante QD@@__ _____demi_dimension_du_noyau_Z));              \
                                                                                                                                        \
                              begin_albumQ(DoIn,Z_front_,Z_back__,PasZ                                                                  \
                                          ,DoIn,Y_bas___,Y_haut__,PasY                                                                  \
                                          ,DoIn,X_gauche,X_droite,PasX                                                                  \
                                           )                                                                                            \
                                   Bblock                                                                                               \
                                   Test(TEST_DANS_L_ALBUM(X,Y,Z))                                                                       \
                                        Bblock                                                                                          \
                                        Test(IFOU(EST_VRAI(NomDeLaFonctionCourante QD@@__ _____le_noyau_est_parallelepipedique)         \
                                                 ,IFET(EST_FAUX(NomDeLaFonctionCourante QD@@__ _____le_noyau_est_parallelepipedique)    \
                                                      ,IFLE(RdisF3D(X_centre,Y_centre,Z_centre,X,Y,Z)                                   \
                                                           ,rayon_de_la_sphere_incrite_dans_le_noyau                                    \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                             Bblock                                                                                     \
                                             INCR(cumul_des_niveaux,FLOT(LoadPoint(albumA,X,Y,Z)));                                     \
                                             INCR(nombre_de_points_cumules,I);                                                          \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              end_albumQ(EDoI,EDoI,EDoI)                                                                                \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(cumul_des_niveaux,NomDeLaFonctionCourante QD@@__ _____niveau_des_points_a_ne_pas_convoluer);         \
                              EGAL(nombre_de_points_cumules,UN);                                                                        \
                                        /* Et on fait comme si seul le point "central" {X,Y,Z} avait ete convolue...                 */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(IZGT(nombre_de_points_cumules))                                                                           \
                              Bblock                                                                                                    \
                              StorePoint(TypeAlbum(DIVI(cumul_des_niveaux,FLOT(nombre_de_points_cumules))),albumR,X,Y,Z);               \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              StorePoint(NomDeLaFonctionCourante QD@@__ _____niveau_indefini,albumR,X,Y,Z);                             \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    end_album_back_AvecEditionProgression                                                                               \
                    Eblock                                                                                                              \
                                        /* Procedure generale de convolution d'un album (introduite le 20180509101003).              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   D ' U N   A L B U M   S T A N D A R D  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Aconvolution_____le_noyau_est_parallelepipedique,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Aconvolution_____le_rayon_de_la_sphere_du_noyau_est_minimal,VRAI)));
DEFV(Common,DEFV(Int,SINT(Aconvolution_____demi_dimension_du_noyau_X,ZERO)));
DEFV(Common,DEFV(Int,SINT(Aconvolution_____demi_dimension_du_noyau_Y,ZERO)));
DEFV(Common,DEFV(Int,SINT(Aconvolution_____demi_dimension_du_noyau_Z,ZERO)));
                                        /* Definition de la taille et de la forme du noyau de convolution...                         */
                                        /*                                                                                           */
                                        /* Le 20220221104334 fut introduit le choix entre 'MIN3(...)' et 'MAX3(...)' (voir           */
                                        /* 'v $xiii/di_album$FON rayon_de_la_sphere_incrite_dans_le_noyau') pour le calcul du        */
                                        /* rayon de la sphere contenant le nouvau de convolution...                                  */
DEFV(Common,DEFV(Logical,SINT(Aconvolution_____convoluer_tous_les_points,VRAI)));
DEFV(Common,DEFV(genere_p,SINT(Aconvolution_____niveau_des_points_a_ne_pas_convoluer,NOIR)));
                                        /* Afin d'optimiser la convolution (introduit le 20180509150020)...                          */
DEFV(Common,DEFV(genere_p,SINT(Aconvolution_____niveau_indefini,NOIR)));

DEFV(Common,DEFV(FonctionP,POINTERp(Aconvolution(albumR,albumA))))
                                        /* Fonction introduite le 20180509101003...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "convolue"...                   */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CONVOLUTION_D_UN_ALBUM(GENP,Astore_point,Aload_point);

     RETA(albumR);
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   D ' U N   A L B U M   N O N   S T A N D A R D  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFconvolution_____le_noyau_est_parallelepipedique,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFconvolution_____le_rayon_de_la_sphere_du_noyau_est_minimal,VRAI)));
DEFV(Common,DEFV(Int,SINT(AFconvolution_____demi_dimension_du_noyau_X,ZERO)));
DEFV(Common,DEFV(Int,SINT(AFconvolution_____demi_dimension_du_noyau_Y,ZERO)));
DEFV(Common,DEFV(Int,SINT(AFconvolution_____demi_dimension_du_noyau_Z,ZERO)));
                                        /* Definition de la taille et de la forme du noyau de convolution...                         */
                                        /*                                                                                           */
                                        /* Le 20220221104334 fut introduit le choix entre 'MIN3(...)' et 'MAX3(...)' (voir           */
                                        /* 'v $xiii/di_album$FON rayon_de_la_sphere_incrite_dans_le_noyau') pour le calcul du        */
                                        /* rayon de la sphere contenant le nouvau de convolution...                                  */
DEFV(Common,DEFV(Logical,SINT(AFconvolution_____convoluer_tous_les_points,VRAI)));
DEFV(Common,DEFV(genere_Float,SINT(AFconvolution_____niveau_des_points_a_ne_pas_convoluer,NOIR)));
                                        /* Afin d'optimiser la convolution (introduit le 20180509150020)...                          */
DEFV(Common,DEFV(genere_Float,SINT(AFconvolution_____niveau_indefini,FLOT__NOIR)));

DEFV(Common,DEFV(FonctionF,POINTERF(AFconvolution(albumR,albumA))))
                                        /* Fonction introduite le 20180509101003...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "convolue"...                   */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CONVOLUTION_D_UN_ALBUM(CASP_Float,AstoreF_point,AloadF_point);

     RETAF(albumR);
     Eblock

EFonctionF

#undef    CONVOLUTION_D_UN_ALBUM

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R O T A T I O N   " G E N E R A L E "   D ' U N   A L B U M  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   ROTATION_D_UN_ALBUM(TypeAlbum,StorePoint,LoadPoint_coordonnees_01,NiveauUndef)                                                \
                    Bblock                                                                                                              \
                    DEFV(Float,INIT(Xfc,f____cNORMALISE_OX(Xcentre)));                                                                  \
                    DEFV(Float,INIT(Yfc,f____cNORMALISE_OY(Ycentre)));                                                                  \
                    DEFV(Float,INIT(Zfc,f____cNORMALISE_OZ(Zcentre)));                                                                  \
                                        /* Afin de pouvoir centrer les transformations geometriques...                               */ \
                                                                                                                                        \
                    begin_album_back_AvecEditionProgression                                                                             \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(Xf,SOUS(f____cNORMALISE_OX(X),Xfc)));                                                          \
                         DEFV(Float,INIT(Yf,SOUS(f____cNORMALISE_OY(Y),Yfc)));                                                          \
                         DEFV(Float,INIT(Zf,SOUS(f____cNORMALISE_OZ(Z),Zfc)));                                                          \
                                        /* Definition du point courant {X,Y,Z} normalise...                                          */ \
                         DEFV(Float,INIT(Xft,FLOT__UNDEF));                                                                             \
                         DEFV(Float,INIT(Yft,FLOT__UNDEF));                                                                             \
                         DEFV(Float,INIT(Zft,FLOT__UNDEF));                                                                             \
                                        /* Definition du point courant {X,Y,Z} "rotationne"...                                       */ \
                         DEFV(TypeAlbum,INIT(niveau_courant,NiveauUndef));                                                              \
                                        /* Niveau au point {Xft,Yft,Zft}...                                                          */ \
                                                                                                                                        \
                         EGAL(Xft                                                                                                       \
                             ,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Xf,Yf,Zf                                                                 \
                                                              ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OX,Xfc)             \
                                                               )                                                                        \
                              );                                                                                                        \
                         EGAL(Yft                                                                                                       \
                             ,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Xf,Yf,Zf                                                                 \
                                                              ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OY,Yfc)             \
                                                               )                                                                        \
                              );                                                                                                        \
                         EGAL(Zft                                                                                                       \
                             ,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Xf,Yf,Zf                                                                 \
                                                              ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OZ,Zfc)             \
                                                               )                                                                        \
                              );                                                                                                        \
                                        /* Transformation geometrique tridimensionnelle des coordonnees {X,Y,Z}...                   */ \
                                                                                                                                        \
                         EGAL(niveau_courant                                                                                            \
                             ,LoadPoint_coordonnees_01(albumA                                                                           \
                                                      ,Xft                                                                              \
                                                      ,Yft                                                                              \
                                                      ,Zft                                                                              \
                                                      ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                 \
                                                      ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                  \
                                                      ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                  \
                                                      ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                  \
                                                      ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album                            \
                                                       )                                                                                \
                              );                                                                                                        \
                                                                                                                                        \
                         StorePoint(niveau_courant,albumR,X,Y,Z);                                                                       \
                                        /* Rangement du point courant transforme...                                                  */ \
                         Eblock                                                                                                         \
                    end_album_back_AvecEditionProgression                                                                               \
                    Eblock                                                                                                              \
                                        /* Procedure generale de rotation d'un album (introduite le 20180505094525).                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R O T A T I O N   D ' U N   A L B U M   S T A N D A R D  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Float,SINT(Arotation_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Arotation_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(Arotation_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */

DEFV(Common,DEFV(Logical,SINT(Arotation_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Arotation_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_p,SINT(Arotation_____niveau_hors_album,NIVEAU_HORS_ECRAN)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */

DEFV(Common,DEFV(FonctionP,POINTERp(Arotation(albumR,albumA))))
                                        /* Fonction introduite le 20180505094525...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "rotationne"...                 */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     BSaveModifyVariable(genere_p
                        ,Niveau____hors_album
                        ,NomDeLaFonctionCourante QD@@__ _____niveau_hors_album
                         );

     ROTATION_D_UN_ALBUM(genere_p,Astore_point_valide,FAload_point_coordonnees_01,NIVEAU_UNDEF);

     ESaveModifyVariable(genere_p
                        ,Niveau____hors_album
                         );

     RETA(albumR);
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R O T A T I O N   D ' U N   A L B U M   N O N   S T A N D A R D  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Float,SINT(AFrotation_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFrotation_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(AFrotation_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */

DEFV(Common,DEFV(Logical,SINT(AFrotation_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFrotation_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(AFrotation_____niveau_hors_album,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */

DEFV(Common,DEFV(FonctionF,POINTERF(AFrotation(albumR,albumA))))
                                        /* Fonction introduite le 20180505094525...                                                  */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[X][Y][Z] "rotationne"...                 */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     BSaveModifyVariable(genere_p
                        ,Niveau____hors_album
                        ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_hors_album)
                         );
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */

     ROTATION_D_UN_ALBUM(genere_Float,AstoreF_point_valide,FFAload_point_coordonnees_01,FLOT__NIVEAU_UNDEF);

     ESaveModifyVariable(genere_p
                        ,Niveau____hors_album
                         );
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */

     RETAF(albumR);
     Eblock

EFonctionF

#undef    ROTATION_D_UN_ALBUM

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I F F U S I O N   T R I D I M E N S I O N N E L L E   A   T E M P E R A T U R E   L O C A L E  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

#define   ACCES_A_UN_POINT_DU_VOISINAGE(niveau,x,y,z)                                                                                   \
                    Bblock                                                                                                              \
                    EGAL(niveau                                                                                                         \
                        ,FAload_point(albumR                                                                                            \
                                     ,x,y,z                                                                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____periodiser_X                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____periodiser_Y                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____periodiser_Z                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____symetriser_X                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____symetriser_Y                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____symetriser_Z                                             \
                                     ,Adiffusion_3D_a_temperatures_locales_____prolonger_X                                              \
                                     ,Adiffusion_3D_a_temperatures_locales_____prolonger_Y                                              \
                                     ,Adiffusion_3D_a_temperatures_locales_____prolonger_Z                                              \
                                     ,Adiffusion_3D_a_temperatures_locales_____niveau_hors_album                                        \
                                      )                                                                                                 \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Niveau courant du voisinage du point courant {X,Y,Z}.                                     */

DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____periodiser_X,VRAI)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____periodiser_Y,VRAI)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____periodiser_Z,VRAI)));
                                        /* Options par defaut de periodisation des axes. La valeur par defaut garantit l'absence     */
                                        /* de "fuites" de particules au bord...                                                      */
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisation des axes.                                             */
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_p,ZINT(Adiffusion_3D_a_temperatures_locales_____niveau_hors_album
                              ,Adiffusion_3D_a_temperatures_locales_____NIVEAU_DE_LA___MER
                               )
                 )
     );
                                        /* Options par defaut du niveau "hors-album".                                                */

#define   Adiffusion_3D_a_temperatures_locales_____PasX                                                                                 \
                    MUL2(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasX,pasX)
#define   Adiffusion_3D_a_temperatures_locales_____PasY                                                                                 \
                    MUL2(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasY,pasY)
#define   Adiffusion_3D_a_temperatures_locales_____PasZ                                                                                 \
                    MUL2(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasZ,pasZ)

DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasX,UN)));
DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasY,UN)));
DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____nombre_de_pasZ,UN)));
                                        /* Definition des pas du reseau {X,Y,Z} (introduit le 20070313154659). On notera que pour    */
                                        /* cela soit utile, il faut que la Source de particules ait au moins des dimensions egales   */
                                        /* a 'NpasX.NpasY.NpasZ'...                                                                  */

DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____shuffler_les_coordonnees,VRAI)));
DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_X,ONZE)));
DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Y,TREIZE)));
DEFV(Common,DEFV(Int,ZINT(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Z,QUINZE)));
                                        /* Le "shuffling" des coordonnees {X,Y,Z} permet d'eliminer un effet d'anisotropie du        */
                                        /* au balayage du champ avec {begin_album,end_album} et donc sequentiellement...             */

DEFV(Common,DEFV(genere_p,ZINT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer
                              ,Adiffusion_3D_a_temperatures_locales_____NIVEAU_DE_LA___MER
                               )
                 )
     );
DEFV(Common,DEFV(genere_p,ZINT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee
                              ,Adiffusion_3D_a_temperatures_locales_____NIVEAU_DE_LA___MER_NOUVELLE_NEE
                               )
                 )
     );
DEFV(Common,DEFV(genere_p,ZINT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee
                              ,Adiffusion_3D_a_temperatures_locales_____NIVEAU_DE_LA_TERRE_NOUVELLE_NEE
                               )
                 )
     );
DEFV(Common,DEFV(genere_p,ZINT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre
                              ,Adiffusion_3D_a_temperatures_locales_____NIVEAU_DE_LA_TERRE
                               )
                 )
     );
                                        /* Definition des niveaux associes a la mer et a la terre.                                   */

DEFV(Common,DEFV(Logical,ZINT(Adiffusion_3D_a_temperatures_locales_____reinjecter_la_Source_a_chaque_iteration,VRAI)));
                                        /* Deux fonctionnements sont donc possibles :                                                */
                                        /*                                                                                           */
                                        /*                  VRAI    : la concentration est constante (de la Source), le nombre de    */
                                        /*                            particules augmentant au cours du temps,                       */
                                        /*                  FAUX    : le nombre de particules est constant au cours du temps (et     */
                                        /*                            egal au nombre de particules de la Source).                    */
                                        /*                                                                                           */
DEFV(Local,DEFV(Positive,INIT(Adiffusion_3D_a_temperatures_locales_____compteur_de_passage,ZERO)));
                                        /* A priori ce dispositif avait ete introduit afin de pouvoir faire varier la graine         */
                                        /* effective dans 'GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(...)' de facon           */
                                        /* a ce qu'il ne redonne pas la meme 'valeur_aleatoire'.                                     */

#define   GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(valeur_aleatoire,type,borne_inferieure,borne_superieure,graine_courante)     \
                    Bblock                                                                                                              \
                    DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage);                                                           \
                    INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,X,Y,Z);                                            \
                                        /* Point courant de l'espace de parametrage.                                                 */ \
                                                                                                                                        \
                    EGAL(valeur_aleatoire                                                                                               \
                        ,type(rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage)                                                  \
                                    ,ADD2(graine_courante,Adiffusion_3D_a_temperatures_locales_____compteur_de_passage)                 \
                                    ,RDN_INIT_AND_GENERE                                                                                \
                                    ,FLOT(borne_inferieure),FLOT(borne_superieure)                                                      \
                                     )                                                                                                  \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */ \
                                        /* par le point courant de l'espace de parametrage. On notera que les 'FLOT(...)' relatifs   */ \
                                        /* a 'borne_inferieure' et 'borne_superieure' sont essentiels car, en effet, on ne connait   */ \
                                        /* pas a priori leur type (aussi bien 'Float' que 'Int'...).                                 */ \
                    Eblock                                                                                                              \
                                        /* Generation d'une valeur aleatoire.                                                        */

DEFV(Common,DEFV(Float,ZINT(Adiffusion_3D_a_temperatures_locales_____frequence_de_la_diffusion,FU)));
                                        /* Frequence "omega" de la reaction.                                                         */
DEFV(Common,DEFV(Float,ZINT(Adiffusion_3D_a_temperatures_locales_____energie_minimale,FZERO)));
DEFV(Common,DEFV(Float,ZINT(Adiffusion_3D_a_temperatures_locales_____energie_maximale,FU)));
DEFV(Common,DEFV(Float,ZINT(Adiffusion_3D_a_temperatures_locales_____lambda,COORDONNEE_BARYCENTRIQUE_CENTRALE)));
                                        /* Extrema de l'energie.                                                                     */
DEFV(Common,DEFV(Float,ZINT(Adiffusion_3D_a_temperatures_locales_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN)));
                                        /* Constante de Boltzmann (J*K^(-1)). Une valeur de 1 simplifiera les utilisations           */
                                        /* des divers parametres (la temperature du modele en particulier).                          */

#define   TEMPERATURE_LOCALE(x,y,z)                                                                                                     \
                    AloadF_point(temperature_locale,x,y,z)                                                                              \
                                        /* Acces a la temperature au point {X,Y,Z}.                                                  */

#define   TAUX_DE_DIFFUSION_3D(frequence,energie_minimale,energie_maximale,lambda,Boltzmann,temperature)                                \
                    TAUX_D_ETCHE______COTES_ND(FU,frequence,energie_minimale,energie_maximale,lambda,Boltzmann,temperature)             \
                                        /* Definition du taux de diffusion. On notera que le minimum de cette fonction est atteint   */ \
                                        /* pour :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*        lambda = COORDONNEE_BARYCENTRIQUE_MAXIMALE  ==>   taux faible de diffusion, ce qui */ \
                                        /*                                                          demande une energie d'activation */ \
                                        /*                                                          'energie_maximale',              */ \
                                        /*                                                                                           */ \
                                        /* et le maximum pour :                                                                      */ \
                                        /*                                                                                           */ \
                                        /*        lambda = COORDONNEE_BARYCENTRIQUE_MINIMALE  ==>   taux eleve de diffusion, ce qui  */ \
                                        /*                                                          demande une energie d'activation */ \
                                        /*                                                          'energie_minimale',              */ \
                                        /*                                                                                           */

DEFV(Local,DEFV(Int,INIT(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer,ZERO)));
DEFV(Local,DEFV(Int,INIT(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre,ZERO)));
                                        /* Nombre de points de la mer et de la terre.                                                */
DEFV(Common,DEFV(Int,INIT(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses,ZERO)));
                                        /* Nombre de points ayant diffuse durant la "passe" courante.                                */

DEFV(Common,DEFV(FonctionP,POINTERp(Adiffusion_3D_a_temperatures_locales(albumR
                                                                        ,albumA
                                                                        ,albumS
                                                                        ,temperature_locale
                                                                        ,graine_de_selection_des_points_a_diffuser
                                                                        ,graine_de_selection_des_directions_de_diffusion
                                                                        ,editer_quelques_nombres_utiles
                                                                         )
                                    )
                 )
     )
                                        /* Fonction introduite le 20070213095023...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR=diffusion(albumA).                                       */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument donnant l'etat courant de l'espace avant son evolution ("etat anterieur"). */
DEFV(Argument,DEFV(album,albumS));
                                        /* Album Argument definissant la source.                                                     */
DEFV(Argument,DEFV(albumF,temperature_locale));
                                        /* Album Argument definissant le champ de temperature.                                       */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_diffuser));
DEFV(Argument,DEFV(Int,graine_de_selection_des_directions_de_diffusion));
                                        /* Pour generer l'aleatoire de la diffusion...                                               */
DEFV(Argument,DEFV(Logical,editer_quelques_nombres_utiles));
                                        /* Pour editer quelques nombres utiles.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     INCR(Adiffusion_3D_a_temperatures_locales_____compteur_de_passage,I);
                                        /* Comptage des passages dans 'Adiffusion_3D_a_temperatures_locales(...)'.                   */

     CLIR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer);
     CLIR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre);
     CLIR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses);
                                        /* Initialisation des divers compteurs.                                                      */

     Test(IL_FAUT(Adiffusion_3D_a_temperatures_locales_____reinjecter_la_Source_a_chaque_iteration))
          Bblock
          Test(IFGT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre
                   ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer
                    )
               )
               Bblock
               CALS(dAmaximum(albumR,albumA,albumS));
                                        /* Initialisation de l'album Resultat a partir de l'etat anterieur ('albumA') et de la       */
                                        /* source ('albumS') que l'on "reinjecte" a priori...                                        */
               Eblock
          ATes
               Bblock
               Test(IFLT(Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre
                        ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer
                         )
                    )
                    Bblock
                    CALS(dAminimum(albumR,albumA,albumS));
                                        /* Initialisation de l'album Resultat a partir de l'etat anterieur ('albumA') et de la       */
                                        /* source ('albumS') que l'on "reinjecte" a priori...                                        */
                    Eblock
               ATes
                    Bblock
                    PRINT_ERREUR("les niveaux respectifs de la terre et de la mer sont egaux");
                    Eblock
               ETes
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          CALS(AMOVE(albumR,albumA));
                                        /* Initialisation de l'album Resultat a partir de l'etat anterieur ('albumA') sans           */
                                        /* reinjecter la source ('albumS').                                                          */
          Eblock
     ETes

     begin_album
          Bblock
          DEFV(Int,INIT(X_du_point_courant,X));
          DEFV(Int,INIT(Y_du_point_courant,Y));
          DEFV(Int,INIT(Z_du_point_courant,Z));
                                        /* Coordonnees {X,Y,Z} du point courant.                                                     */
          DEFV(genere_p,INIT(niveau__anterieur_du_point_courant,NIVEAU_UNDEF));
          DEFV(genere_p,INIT(niveau_posterieur_du_point_courant,NIVEAU_UNDEF));
                                        /* Niveaux anterieur et posterieur du point courant...                                       */

          Test(IL_FAUT(Adiffusion_3D_a_temperatures_locales_____shuffler_les_coordonnees))
               Bblock
               GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(X_du_point_courant
                                                               ,INTE
                                                               ,Xmin
                                                               ,MAJORATION_BORNE_SUPERIEURE_D_UNE_GENERATION_ALEATOIRE_ENTIERE(Xmax)
                                                               ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_X
                                                                );
               GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(Y_du_point_courant
                                                               ,INTE
                                                               ,Ymin
                                                               ,MAJORATION_BORNE_SUPERIEURE_D_UNE_GENERATION_ALEATOIRE_ENTIERE(Ymax)
                                                               ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Y
                                                                );
               GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(Z_du_point_courant
                                                               ,INTE
                                                               ,Zmin
                                                               ,MAJORATION_BORNE_SUPERIEURE_D_UNE_GENERATION_ALEATOIRE_ENTIERE(Zmax)
                                                               ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Z
                                                                );
                                        /* "Shuffling" de {X,Y,Z} a l'interieur de [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]...            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          ACCES_A_UN_POINT_DU_VOISINAGE(niveau__anterieur_du_point_courant,X_du_point_courant,Y_du_point_courant,Z_du_point_courant);
                                        /* Niveau courant au point courant de la generation courante.                                */

          EGAL(niveau_posterieur_du_point_courant,niveau__anterieur_du_point_courant);
                                        /* A priori car, en effet, il s'agit de la situation la plus frequente...                    */

          Test(IFEQ(niveau__anterieur_du_point_courant,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer))
               Bblock
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la mer : rien a faire...                    */
               INCR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer,I);
                                        /* Comptage des points de la mer.                                                            */
               Eblock
          ATes
               Bblock
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la terre ("vraie" ou "nouvelle nee") :      */
               INCR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre,I);
                                        /* Comptage des points de la terre.                                                          */

               Test(IFEQ(niveau__anterieur_du_point_courant,Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre))
                    Bblock
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la terre (la "vraie") :                     */
                    DEFV(Float,INIT(taux_de_diffusion,FLOT__UNDEF));
                                        /* Taux 'R' de diffusion.                                                                    */
                    DEFV(Float,INIT(valeur_aleatoire_de_selection_des_points_a_diffuser,FLOT__UNDEF));
                                        /* Valeur aleatoire de choix des points a diffuser.                                          */

                    GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(valeur_aleatoire_de_selection_des_points_a_diffuser
                                                                    ,NEUT
                                                                    ,PROBABILITE_NULLE
                                                                    ,PROBABILITE_UNITE
                                                                    ,graine_de_selection_des_points_a_diffuser
                                                                     );

                    EGAL(taux_de_diffusion
                        ,TAUX_DE_DIFFUSION_3D(Adiffusion_3D_a_temperatures_locales_____frequence_de_la_diffusion
                                             ,Adiffusion_3D_a_temperatures_locales_____energie_minimale
                                             ,Adiffusion_3D_a_temperatures_locales_____energie_maximale
                                             ,Adiffusion_3D_a_temperatures_locales_____lambda
                                             ,Adiffusion_3D_a_temperatures_locales_____constante_de_Boltzmann
                                             ,TEMPERATURE_LOCALE(X_du_point_courant,Y_du_point_courant,Z_du_point_courant)
                                              )
                         );
                                        /* Taux 'R' de diffusion courant de la forme :                                               */
                                        /*                                                                                           */
                                        /*                               Em + L.(EM - Em)           E                                */
                                        /*                            - ------------------      - -----                              */
                                        /*                                     k.T                 k.T                               */
                                        /*                  taux = F.e                     = F.e                                     */
                                        /*                                                                                           */
                                        /* ou {Em,EM} designent {energie_minimale,energie_maximale} respectivement et 'L' un         */
                                        /* parametre de ponderation dans [0,1]. Ainsi, plus l'energie 'E' est elevee (voisine de     */
                                        /* 'EM ', 'L' proche de '1'), plus le taux d'activation est faible et moins la reaction      */
                                        /* de diffusion a lieu ; inversement, plus l'energie 'E' est faible (voisine de 'Em', 'L'    */
                                        /* proche de 0), plus le taux d'activation est eleve et plus la reaction de diffusion a      */
                                        /* lieu.                                                                                     */
                                        /*                                                                                           */
                                        /* On notera que par defaut :                                                                */
                                        /*                                                                                           */
                                        /*                  E = 1/2                                                                  */
                                        /*                  F = 1                                                                    */
                                        /*                                                                                           */
                                        /* et que la plupart du temps :                                                              */
                                        /*                                                                                           */
                                        /*                  k = 1                                                                    */
                                        /*                                                                                           */
                                        /* ('v $xci/diffus_3D.21$K constante_de_Boltzmann').                                         */

                    Test(IFLE(valeur_aleatoire_de_selection_des_points_a_diffuser,taux_de_diffusion))
                         Bblock
                                        /* Cas ou le point courant est "diffusable" :                                                */
                         DEFV(Float,INIT(valeur_aleatoire_de_selection_des_directions_de_diffusion,FLOT__UNDEF));
                                        /* Valeur aleatoire de choix des points a diffuser.                                          */
                         DEFV(Int,INIT(deplacement_en_X,UNDEF));
                         DEFV(Int,INIT(deplacement_en_Y,UNDEF));
                         DEFV(Int,INIT(deplacement_en_Z,UNDEF));
                                        /* Deplacements aleatoires en {X,Y,Z}...                                                     */
                         DEFV(Int,INIT(X_du_point_courant_apres_diffusion,UNDEF));
                         DEFV(Int,INIT(Y_du_point_courant_apres_diffusion,UNDEF));
                         DEFV(Int,INIT(Z_du_point_courant_apres_diffusion,UNDEF));
                                        /* Coordonnees {X,Y,Z} du point courant apres diffusion.                                     */
                         DEFV(genere_p,INIT(niveau__anterieur_d_un_voisin_du_point_courant,NIVEAU_UNDEF));
                                        /* Niveau anterieur d'un voisin (parmi {Est,Nord,Ouest,Sud}) du point courant.               */

                         INCR(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses,I);
                                        /* Comptage des points diffusant.                                                            */

                         GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                                                         ,NEUT
                                                                         ,FZERO
                                                                         ,CERCLE_TRIGONOMETRIQUE
                                                                         ,graine_de_selection_des_directions_de_diffusion
                                                                          );
                                        /* Generation d'un angle aleatoire dans [0,2.pi].                                            */

                         Test(IFINof(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                    ,GRO0(PI_SUR_3)
                                    ,GRO1(PI_SUR_3)
                                     )
                              )
                              Bblock
                              EGAL(deplacement_en_X,NEUT(Adiffusion_3D_a_temperatures_locales_____PasX));
                              EGAL(deplacement_en_Y,ZERO);
                              EGAL(deplacement_en_Z,ZERO);
                                        /* Deplacement "Est".                                                                        */
                              Eblock
                         ATes
                              Bblock
                              Test(IFINof(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                         ,GRO1(PI_SUR_3)
                                         ,GRO2(PI_SUR_3)
                                          )
                                   )
                                   Bblock
                                   EGAL(deplacement_en_X,ZERO);
                                   EGAL(deplacement_en_Y,NEUT(Adiffusion_3D_a_temperatures_locales_____PasY));
                                   EGAL(deplacement_en_Z,ZERO);
                                        /* Deplacement "Nord".                                                                       */
                                   Eblock
                              ATes
                                   Bblock
                                   Test(IFINof(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                              ,GRO2(PI_SUR_3)
                                              ,GRO3(PI_SUR_3)
                                               )
                                        )
                                        Bblock
                                        EGAL(deplacement_en_X,ZERO);
                                        EGAL(deplacement_en_Y,ZERO);
                                        EGAL(deplacement_en_Z,NEUT(Adiffusion_3D_a_temperatures_locales_____PasZ));
                                        /* Deplacement "Avant".                                                                      */
                                        Eblock
                                   ATes
                                        Bblock
                                        Test(IFINof(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                                   ,GRO3(PI_SUR_3)
                                                   ,GRO4(PI_SUR_3)
                                                    )
                                             )
                                             Bblock
                                             EGAL(deplacement_en_X,NEGA(Adiffusion_3D_a_temperatures_locales_____PasX));
                                             EGAL(deplacement_en_Y,ZERO);
                                             EGAL(deplacement_en_Z,ZERO);
                                        /* Deplacement "Ouest".                                                                      */
                                             Eblock
                                        ATes
                                             Bblock
                                             Test(IFINof(valeur_aleatoire_de_selection_des_directions_de_diffusion
                                                        ,GRO4(PI_SUR_3)
                                                        ,GRO5(PI_SUR_3)
                                                         )
                                                  )
                                                  Bblock
                                                  EGAL(deplacement_en_X,ZERO);
                                                  EGAL(deplacement_en_Y,NEGA(Adiffusion_3D_a_temperatures_locales_____PasY));
                                                  EGAL(deplacement_en_Z,ZERO);
                                        /* Deplacement "Sud".                                                                        */
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  EGAL(deplacement_en_X,ZERO);
                                                  EGAL(deplacement_en_Y,ZERO);
                                                  EGAL(deplacement_en_Z,NEGA(Adiffusion_3D_a_temperatures_locales_____PasZ));
                                        /* Deplacement "Arriere".                                                                    */
                                                  Eblock
                                             ETes
                                             Eblock
                                        ETes
                                        Eblock
                                   ETes
                                   Eblock
                              ETes
                              Eblock
                         ETes

                         EGAL(X_du_point_courant_apres_diffusion,ADD2(X_du_point_courant,deplacement_en_X));
                         EGAL(Y_du_point_courant_apres_diffusion,ADD2(Y_du_point_courant,deplacement_en_Y));
                         EGAL(Z_du_point_courant_apres_diffusion,ADD2(Z_du_point_courant,deplacement_en_Z));
                                        /* Deplacement (virtuel pour le moment...) du point courant...                               */

                         ACCES_A_UN_POINT_DU_VOISINAGE(niveau__anterieur_d_un_voisin_du_point_courant
                                                      ,X_du_point_courant_apres_diffusion
                                                      ,Y_du_point_courant_apres_diffusion
                                                      ,Z_du_point_courant_apres_diffusion
                                                       );
                                        /* Niveau anterieur d'un voisin (parmi {Est,Nord,Ouest,Sud}) du point courant.               */

                         Test(IFEQ(niveau__anterieur_d_un_voisin_du_point_courant
                                  ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer
                                   )
                              )
                              Bblock
                                        /* Cas ou le voisin choisi est dans la mer :                                                 */
                              EGAL(niveau_posterieur_du_point_courant
                                  ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee
                                   );

                              FAstore_point(Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee
                                           ,albumR
                                           ,X_du_point_courant_apres_diffusion
                                           ,Y_du_point_courant_apres_diffusion
                                           ,Z_du_point_courant_apres_diffusion
                                           ,Adiffusion_3D_a_temperatures_locales_____periodiser_X
                                           ,Adiffusion_3D_a_temperatures_locales_____periodiser_Y
                                           ,Adiffusion_3D_a_temperatures_locales_____periodiser_Z
                                           ,Adiffusion_3D_a_temperatures_locales_____symetriser_X
                                           ,Adiffusion_3D_a_temperatures_locales_____symetriser_Y
                                           ,Adiffusion_3D_a_temperatures_locales_____symetriser_Z
                                           ,Adiffusion_3D_a_temperatures_locales_____prolonger_X
                                           ,Adiffusion_3D_a_temperatures_locales_____prolonger_Y
                                           ,Adiffusion_3D_a_temperatures_locales_____prolonger_Z
                                            );
                                        /* Cas ou le point {X,Y,Z} diffuse vers une case de la mer voisine ; on echange donc ainsi   */
                                        /* la case {X,Y,Z} avec l'une de ses voisines...                                             */
                              Eblock
                         ATes
                              Bblock
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la terre et ne peut pas bouger car la case  */
                                        /* voisine ou il devait aller est deja faite de terre...                                     */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la terre, mais n'a pas "le droit" a etre    */
                                        /* diffuse...                                                                                */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Test(IFOU(IFEQ(niveau__anterieur_du_point_courant
                                  ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee
                                   )
                             ,IFEQ(niveau__anterieur_du_point_courant
                                  ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee
                                   )
                              )
                         )
                                        /* Cas ou le site courant {X,Y,Z} fait partie de la mer (la "nouvelle nee") ou de la terre   */
                                        /* (la "nouvelle nee") : rien a faire...                                                     */
                         Bblock
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou ni le niveau de la mer, ni le niveau de la terre ne furent reconnus : ce niveau    */
                                        /* est considere comme celui d'un obstacle. Cette notion d'"obstacle" fut introduite le      */
                                        /* 20070405161247. Avant cette date, il y avait ici le code suivant :                        */
                                        /*                                                                                           */
                                        /*                  PRINT_ERREUR("un niveau non reconnu a ete rencontre");                   */
                                        /*                  CAL1(Prer1("(sa valeur est %d)\n",niveau__anterieur_du_point_courant));  */
                                        /*                                                                                           */
                                        /* qui n'a donc plus de raisons d'etre...                                                    */
                         Eblock
                    ETes
                    Eblock
               ETes
               Eblock
          ETes

          Astore_point(niveau_posterieur_du_point_courant
                      ,albumR
                      ,X_du_point_courant,Y_du_point_courant,Z_du_point_courant
                       );
                                        /* Et on calcule la generation suivante...                                                   */
          Eblock
     end_album

     begin_album
          Bblock
          DEFV(genere_p,INIT(niveau_courant,Aload_point(albumR,X,Y,Z)));

          Astore_point(COND(IFEQ(niveau_courant,Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee)
                           ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre
                           ,COND(IFEQ(niveau_courant,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee)
                                ,Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer
                                ,niveau_courant
                                 )
                            )
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* Et on fait de la terre "nouvelle nee", de la "vraie" terre.                               */
          Eblock
     end_album

     Test(IL_FAUT(editer_quelques_nombres_utiles))
          Bblock
                                        /* ATTENTION : il est imperatif que la "clef" du premier nombre edite soit precedee d'un     */
                                        /* espace, afin que les espaces soient des limiteurs des nombre edites ou qu'ils soient      */
                                        /* situes dans la liste (premier ou dernier en particulier...).                              */
          CAL3(Prme1(" Iteration=%d"
                    ,Adiffusion_3D_a_temperatures_locales_____compteur_de_passage
                     )
               );
          CAL3(Prme1(" NombrePointsMer=%d"
                    ,Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer
                     )
               );
          CAL3(Prme1(" NombrePointsTerre=%d"
                    ,Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre
                     )
               );
          CAL3(Prme1(" NombrePointsDiffuses=%d"
                    ,Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses
                     )
               );
          CALS(Fsauts_de_lignes(UN));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFNE(ADD2(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer
                   ,Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre
                    )
              ,dimXYZ
               )
          )
          Bblock
          PRINT_ERREUR("il semble qu'il y ait autre chose que de la mer et de la terre");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IZEQ(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la___mer))
          Bblock
          PRINT_ERREUR("la mer est vide");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IZEQ(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_de_la_terre))
          Bblock
          PRINT_ERREUR("la terre est vide");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IZEQ(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses))
          Bblock
          PRINT_ERREUR("il n'y a pas eu de points diffuses");
                                        /* Message redondant avec 'v $xci/diffus_2D.21$K PRINT_ERREUR..il.n.y.a.pas.eu.de.points.d'  */
                                        /* et avec 'v $xci/diffus_3D.21$K PRINT_ERREUR..il.n.y.a.pas.eu.de.points.d'...              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETA(albumR);
     Eblock

#undef    TAUX_DE_DIFFUSION_3D

#undef    TEMPERATURE_LOCALE

#undef    GENERATION_D_UN_NOMBRE_ALEATOIRE_DE_DIFFUSION_3D

#undef    Adiffusion_3D_a_temperatures_locales_____PasZ
#undef    Adiffusion_3D_a_temperatures_locales_____PasY
#undef    Adiffusion_3D_a_temperatures_locales_____PasX

#undef    ACCES_A_UN_POINT_DU_VOISINAGE

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I F F U S I O N   T R I D I M E N S I O N N E L L E   A   T E M P E R A T U R E   G L O B A L E  :                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,POINTERp(Adiffusion_3D(albumR
                                                 ,albumA
                                                 ,albumS
                                                 ,temperature_globale
                                                 ,graine_de_selection_des_points_a_diffuser
                                                 ,graine_de_selection_des_directions_de_diffusion
                                                 ,editer_quelques_nombres_utiles
                                                  )
                                    )
                 )
     )
                                        /* Fonction introduite le 20070213095023...                                                  */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR=diffusion(albumA).                                       */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument donnant l'etat courant de l'espace avant son evolution ("etat anterieur"). */
DEFV(Argument,DEFV(album,albumS));
                                        /* Album Argument definissant la source.                                                     */
DEFV(Argument,DEFV(Float,temperature_globale));
                                        /* Temperature globale.                                                                      */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_diffuser));
DEFV(Argument,DEFV(Int,graine_de_selection_des_directions_de_diffusion));
                                        /* Pour generer l'aleatoire de la diffusion...                                               */
DEFV(Argument,DEFV(Logical,editer_quelques_nombres_utiles));
                                        /* Pour editer quelques nombres utiles.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     BDEFV(albumF,temperature_locale);
                                        /* Album flottante donnant la temperature en chaque point {X,Y,Z}.                           */
     /*..............................................................................................................................*/
     CALS(dAFinitialisation(temperature_locale,temperature_globale));
                                        /* Initialisation du taux d'affaiblissement de la terre de facon uniforme.                   */

     CALS(Adiffusion_3D_a_temperatures_locales(albumR
                                              ,albumA
                                              ,albumS
                                              ,temperature_locale
                                              ,graine_de_selection_des_points_a_diffuser
                                              ,graine_de_selection_des_directions_de_diffusion
                                              ,editer_quelques_nombres_utiles
                                               )
          );
                                        /* Et calcul avec la meme temperature en chaque point {X,Y,Z}...                             */

     EDEFV(albumF,temperature_locale);
                                        /* Album flottante donnant la temperature en chaque point {X,Y,Z}.                           */

     RETA(albumR);
     Eblock

EFonctionP

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   " E T C H I N G "  :                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce modele est tres inspire de celui                                                                            */
/*                  de Kiran Kolwankar et de Bernard                                                                                 */
/*                  Sapoval. Il consiste en un espace tridimensionnel                                                                */
/*                  de points P(x,y,z). Les points a valeurs negatives                                                               */
/*                  correspondent a la terre et les points a valeurs                                                                 */
/*                  positives a la mer.                                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote,FAUX)));
                                        /* Choix entre le mode parallele de l'exploration de la cote (c'est-a-dire un mode dans      */
                                        /* lequel un nombre quelconque de points peuvent etre "etche"s a chaque iteration) et le     */
                                        /* "sequentiel" ou "individuel" (c'est-a-dire un mode dans lequel un seul point est "etche"  */
                                        /* a chaque iteration). Le 20020531095526, je suis passe de 'VRAI' a 'FAUX' car c'est ce     */
                                        /* mode qui semble etre le plus "physique"...                                                */

DEFV(Local,DEFV(Positive,INIT(Aetche__CoastLines_3D_____compteur_de_passage,ZERO)));
                                        /* A priori ce dispositif avait ete introduit afin de pouvoir faire varier la graine         */
                                        /* effective dans 'GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D(...)' de facon     */
                                        /* a ce qu'il ne redonne pas la meme 'valeur_aleatoire', en particulier en ce qui concerne   */
                                        /* 'liste_des_valeurs_aleatoires_de_selection_du_point_a_etcher'. En fait, il est plus       */
                                        /* logique de laisser a l'appelant de 'Aetche__CoastLines_3D_a_temperatures_locales(...)'    */
                                        /* cette responsabilite ('v $xci/CoastL_3D.21$K INCREMENT_DES_GRAINES').                     */

#define   GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D(valeur_aleatoire,borne_inferieure,borne_superieure,graine_courante)    \
                    Bblock                                                                                                              \
                    DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage);                                                           \
                    INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,X,Y,Z);                                            \
                                        /* Point courant de l'espace de parametrage.                                                 */ \
                                                                                                                                        \
                    EGAL(valeur_aleatoire                                                                                               \
                        ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage)                                                       \
                               ,graine_courante                                                                                         \
                               ,RDN_INIT_AND_GENERE                                                                                     \
                               ,FLOT(borne_inferieure),FLOT(borne_superieure)                                                           \
                                )                                                                                                       \
                         );                                                                                                             \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */ \
                                        /* par le point courant de l'espace de parametrage. On notera que les 'FLOT(...)' relatifs   */ \
                                        /* a 'borne_inferieure' et 'borne_superieure' sont essentiels car, en effet, on ne connait   */ \
                                        /* pas a priori leur type (aussi bien 'Float' que 'Int'...).                                 */ \
                    Eblock                                                                                                              \
                                        /* Generation d'une valeur aleatoire.                                                        */

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01));
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02));
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#define   UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA_TERRE(etat)                                                                         \
                    IFLT(etat,NIVEAU______MEDIAN_DANS_Aetche__CoastLines_3D)
#define   UN_POINT_D_ETCHE______COTES_3D_EST__INDETERMINE(etat)                                                                         \
                    IFEQ(etat,NIVEAU______MEDIAN_DANS_Aetche__CoastLines_3D)
#define   UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA___MER(etat)                                                                         \
                    IFGT(etat,NIVEAU______MEDIAN_DANS_Aetche__CoastLines_3D)
                                        /* Pour connaitre le type de localisation du point courant...                                */

#define   ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat,x,dx,y,dy,z,dz,ponderation_de_ce_point)                                           \
                    Bblock                                                                                                              \
                    EGAL(etat                                                                                                           \
                        ,MUL2(ponderation_de_ce_point                                                                                   \
                             ,FFAload_point(albumA                                                                                      \
                                           ,ADD2(x,dx),ADD2(y,dy),ADD2(z,dz)                                                            \
                                           ,Aetche__CoastLines_3D_____periodiser_X                                                      \
                                           ,Aetche__CoastLines_3D_____periodiser_Y                                                      \
                                           ,Aetche__CoastLines_3D_____periodiser_Z                                                      \
                                           ,Aetche__CoastLines_3D_____symetriser_X                                                      \
                                           ,Aetche__CoastLines_3D_____symetriser_Y                                                      \
                                           ,Aetche__CoastLines_3D_____symetriser_Z                                                      \
                                           ,Aetche__CoastLines_3D_____prolonger_X                                                       \
                                           ,Aetche__CoastLines_3D_____prolonger_Y                                                       \
                                           ,Aetche__CoastLines_3D_____prolonger_Z                                                       \
                                           ,Aetche__CoastLines_3D_____niveau_hors_album                                                 \
                                            )                                                                                           \
                              )                                                                                                         \
                         );                                                                                                             \
                                                                                                                                        \
                    INCR(nombre_d_etats_de_type_terre,COND(UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA_TERRE(etat),I,ZERO));              \
                    INCR(nombre_d_etats__indetermines,COND(UN_POINT_D_ETCHE______COTES_3D_EST__INDETERMINE(etat),I,ZERO));              \
                    INCR(nombre_d_etats_de_type___mer,COND(UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA___MER(etat),I,ZERO));              \
                                        /* Comptabilite des differents signes possibles de l'"etat".                                 */ \
                                                                                                                                        \
                    INCR(moyenne_des_etats_de_type_terre,COND(UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA_TERRE(etat),etat,FZERO));       \
                    INCR(moyenne_des_etats__indetermines,COND(UN_POINT_D_ETCHE______COTES_3D_EST__INDETERMINE(etat),etat,FZERO));       \
                    INCR(moyenne_des_etats_de_type___mer,COND(UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA___MER(etat),etat,FZERO));       \
                                        /* Comptabilite des differents "etat"s en vue de calculer leur moyenne.                      */ \
                    Eblock                                                                                                              \
                                        /* Acces a l'etat associe a un point {x,y}.                                                  */

DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_taux,VRAI)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_temps_simule,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_pas_de_temps_simule,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement,FAUX)));
DEFV(Common,DEFV(genere_Float,ZINT(Aetche__CoastLines_3D_____marqueur_des_points_etches
                                  ,NIVEAU_DE_LA___MER_DANS_Aetche__CoastLines_3D
                                   )
                 )
     );
                                        /* Afin de pouvoir marquer les points "etche"s avec la valeur courante de la force de la mer */
                                        /* ou bien a l'aide d'une valeur arbitraire...                                               */

DEFV(Common,DEFV(genere_Float,ZINT(Aetche__CoastLines_3D_____niveau_de_la___mer,NIVEAU_DE_LA___MER_DANS_Aetche__CoastLines_3D)));
DEFV(Common,DEFV(genere_Float,ZINT(Aetche__CoastLines_3D_____niveau_de_la_terre,NIVEAU_DE_LA_TERRE_DANS_Aetche__CoastLines_3D)));
#define   NIVEAU______MEDIAN_DANS_Aetche__CoastLines_3D                                                                                 \
                    MOYE(Aetche__CoastLines_3D_____niveau_de_la___mer,Aetche__CoastLines_3D_____niveau_de_la_terre)
#define   NIVEAU_HORS_IMAGE_DANS_Aetche__CoastLines_3D                                                                                  \
                    NIVEAU_DE_LA_TERRE_DANS_Aetche__CoastLines_3D
                                        /* Niveaux "speciaux"...                                                                     */

DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____initialiser,VRAI)));
                                        /* Faut-il initialiser le modele ?                                                           */

DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____periodiser_Z,FAUX)));
                                        /* Options par defaut de periodisation des axes.                                             */
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____symetriser_Z,FAUX)));
                                        /* Options par defaut de symetrisf.R (introduites le 20050721104900).                        */
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____prolonger_Z,FAUX)));
                                        /* Options par defaut de prolongement des axes.                                              */
DEFV(Common,DEFV(genere_Float,ZINT(Aetche__CoastLines_3D_____niveau_hors_album,NIVEAU_HORS_IMAGE_DANS_Aetche__CoastLines_3D)));
                                        /* Options par defaut du niveau "hors-album".                                                */

DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____utiliser_un_noyau,FAUX)));
                                        /* Options par defaut de choix entre la methode "des quatre plus proches voisins" ('FAUX')   */
                                        /* et la methode dite "a noyau" ('VRAI').                                                    */

DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point_sX__Y__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point__X_sY__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point__X__Y_sZ
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point_pX__Y__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point__X_pY__Z
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____ponderation_du_point__X__Y_pZ
                           ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
                                        /* Definition des facteurs des points du voisinage du point courant {X,Y}.                   */

DEFV(Common,DEFV(Logical,INIT(Aetche__CoastLines_3D_____initialiser_le_noyau,VRAI)));
DEFV(Common,DEFV(Int,ZINT(Aetche__CoastLines_3D_____demi_dimension_effective_du_noyau
                         ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Aetche__CoastLines_3D
                          )
                 )
     );
DEFV(Common,DEFV(Float,DTb3(Aetche__CoastLines_3D_____noyau,DN_Aetche__CoastLines_3D,DN_Aetche__CoastLines_3D,DN_Aetche__CoastLines_3D)
                                        /* ATTENTION : la ligne precedente doit rester sur une seule ligne, malgre sa longueur, a    */
                                        /* cause de 'v $xcg/gen$EXT$Z' et de ses "outils" contenus dans '$xcg/gen$EXT$D'...          */
                 )
     );
DEFV(Common,DEFV(Float,INIT(POINTERf(PAetche__CoastLines_3D_____noyau)
                           ,ADRESSE(ACCES_NOYAU_DANS_Aetche__CoastLines_3D(Aetche__CoastLines_3D_____XYZmin
                                                                          ,Aetche__CoastLines_3D_____XYZmin
                                                                          ,Aetche__CoastLines_3D_____XYZmin
                                                                           )
                                    )
                            )
                 )
     );
                                        /* Definition du noyau a utiliser dans 'Aetche__CoastLines_3D(...)', ainsi que d'un          */
                                        /* indicateur disant si l'initialisation doit etre faite et de la demi-dimension effective   */
                                        /* (inferieure ou egale a 'DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Aetche__CoastLines_3D')     */
                                        /* de ce dernier.                                                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, la ligne relative a 'DTb3(...)' doit tenir sur une seule ligne a cause de      */
                                        /* '$xcg/gen.ext$Z'...                                                                       */
                                        /*                                                                                           */
                                        /* Le pointeur 'PAetche__CoastLines_3D_____noyau' a ete introduit le 20010222110806 pour     */
                                        /* permettre des acces de type 'IloadF_album(...)' au noyau...                               */

DEFV(Common,DEFV(Int,ZINT(Aetche__CoastLines_3D_____delta_X,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Aetche__CoastLines_3D_____delta_Y,ZERO)));
DEFV(Common,DEFV(Int,ZINT(Aetche__CoastLines_3D_____delta_Z,ZERO)));
                                        /* Translation des points du voisinage du point courant {X,Y,Z}.                             */

DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____pas_de_temps_simule,FU)));
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____temps_simule,FZERO)));
                                        /* Temps simule dont la progression depend du mode d'"etching" defini par                    */
                                        /* 'Aetche__CoastLines_3D_____explorer_parallelement_la_cote'. L'initialisation a 'FU'       */
                                        /* du pas de temps (lui-meme introduit le 20020619101220), et non pas a 'FLOT__UNDEF', est   */
                                        /* due au mode 'IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)'.          */

#define   NOMBRE_MAXIMAL_DE_POINTS_A_ETCHER_DANS_Aetche__CoastLines_3D                                                                  \
                    UN
DEFV(Common,DEFV(Positive,ZINT(Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher
                              ,NOMBRE_MAXIMAL_DE_POINTS_A_ETCHER_DANS_Aetche__CoastLines_3D
                               )
                 )
     );
                                        /* Nombre de points a "etcher" a chaque iteration dans le cas ou                             */
                                        /* 'IL_NE_FAUT_PAS(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)'.               */
#define   PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER                                                                      \
                    INDEX0
#define   DERNIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER                                                                      \
                    LSTX(PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER                                                       \
                        ,Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher                                                    \
                         )
                                        /* Premier et dernier niveaux differents.                                                    */
#define   LISTE_DES_VALEURS_ALEATOIRES(index)                                                                                           \
                    IdTb1(liste_des_valeurs_aleatoires_de_selection_du_point_a_etcher                                                   \
                         ,INDX(index,PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER)                                          \
                         ,Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher                                                   \
                          )
                                        /* Procedures d'acces aux differentes listes...                                              */

DEFV(Common,DEFV(Positive,INIT(Aetche__CoastLines_3D_____nombre_de_points_sur_la_frontiere,UNDEF)));
                                        /* Afin de connaitre le nombre de points sur la frontiere (cela peut toujours servir...).    */

#define   NOMBRE_COURANT_D_ETCHERS_DANS_Aetche__CoastLines_3D                                                                           \
                    F_PETIT_INFINI
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____nombre_courant_d_etchers
                           ,NOMBRE_COURANT_D_ETCHERS_DANS_Aetche__CoastLines_3D
                            )
                 )
     );
DEFV(Common,DEFV(Positive,INIT(Aetche__CoastLines_3D_____numero_du_point_etche_courant_lors_de_l_iteration_courante,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante,UNDEF)));
                                        /* Afin de savoir combien il y a d'"etchers" a un instant donne et de points qui ont ete     */
                                        /* "etches" lors de l'iteration courante. On notera l'initialisation avec 'INFINI' due a     */
                                        /* 'v $xci/CoastL_3D.21$K IZGT.Aetche__CoastLines_3D_____nombre_courant_d_etchers'.          */
                                        /* On notera le 'Float' introduit le 20020522100014 afin de permettre de tres grandes        */
                                        /* valeurs pour 'Aetche__CoastLines_3D_____nombre_courant_d_etchers' qui n'est en fait       */
                                        /* pas lie au nombre de points des images ; par contre le 'Positive' suffit pour             */
                                        /* 'Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante' qui      */
                                        /* lui ne peut execeder 'dimXYZ'...                                                          */
                                        /*                                                                                           */
                                        /* Le numero du point "etche" courant a ete introduit le 20020711090404 afin de permettre    */
                                        /* l'edition des coordonnees des points "etche"s...                                          */
DEFV(Common,DEFV(Logical,ZINT(Aetche__CoastLines_3D_____editer_les_coordonnees_des_points_parmi_les_nombres_utiles,VRAI)));
                                        /* Afin de permettre, dans le cas ou 'IL_FAUT(editer_quelques_nombres_utiles)', l'edition    */
                                        /* des coordonnees des points "etche"s (introduit le 20020711090404).                        */

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#    define    TEMPERATURE_LOCALE(x,y,z)                                                                                                \
                         temperature_locale                                                                                             \
                                        /* Acces aux caracteristiques de la terre et de la mer associees a un point {x,y,z}.         */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#    define    TEMPERATURE_LOCALE(x,y,z)                                                                                                \
                         AloadF_point(temperature_locale,x,y,z)                                                                         \
                                        /* Acces aux caracteristiques de la terre et de la mer associees a un point {x,y,z}.         */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02

DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____concentration_initiale_d_etchers,FU)));
                                        /* Concentration initiale d'"etcher"s. On notera qu'en fait ce parametre ne sert             */
                                        /* pratiquement a rien ('v $xiii/di_album$FON 20020604114847').                              */
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____frequence_de_la_reaction,FU)));
                                        /* Frequence "omega" de la reaction. On notera qu'en fait ce parametre ne sert               */
                                        /* pratiquement a rien ('v $xiii/di_album$FON 20020604114847').                              */

DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____energie_minimale,FZERO)));
DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____energie_maximale,FU)));
                                        /* Extrema de l'energie.                                                                     */

DEFV(Common,DEFV(Float,ZINT(Aetche__CoastLines_3D_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN)));
                                        /* Constante de Boltzmann (J*K^(-1)). Une valeur de 1 simplifiera les utilisations           */
                                        /* des divers parametres (la temperature du modele en particulier).                          */

#define   MARQUAGE_DU_POINT_ETCHE_COURANT_D_ETCHE______COTES_3D                                                                         \
                    Bblock                                                                                                              \
                    EGAL(nouvel_etat__X__Y__Z                                                                                           \
                        ,MEME_SIGNE_QUE                                                                                                 \
                             (Aetche__CoastLines_3D_____niveau_de_la___mer                                                              \
                             ,COND(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_taux)                            \
                                  ,taux_d_etching                                                                                       \
                                  ,COND(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_temps_simule)               \
                                       ,ADD2(Aetche__CoastLines_3D_____temps_simule                                                     \
                                            ,ABSO(Aetche__CoastLines_3D_____niveau_de_la___mer)                                         \
                                             )                                                                                          \
                                       ,COND(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_pas_de_temps_simule)   \
                                            ,ADD2(Aetche__CoastLines_3D_____pas_de_temps_simule                                         \
                                                 ,ABSO(Aetche__CoastLines_3D_____niveau_de_la___mer)                                    \
                                                  )                                                                                     \
                                            ,COND(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement)           \
                                                 ,Aetche__CoastLines_3D_____marqueur_des_points_etches                                  \
                                                 ,Aetche__CoastLines_3D_____niveau_de_la___mer                                          \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Le point courant {X,Y,Z} est trop faible par rapport a la force de la mer, il disparait   */ \
                                        /* en devenant de la mer...                                                                  */ \
                                                                                                                                        \
                    Test(IFET(IL_FAUT(editer_quelques_nombres_utiles)                                                                   \
                             ,IL_FAUT(Aetche__CoastLines_3D_____editer_les_coordonnees_des_points_parmi_les_nombres_utiles)             \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         CAL3(Prme7(" P(%d)={%+.^^^,%+.^^^,%+.^^^}({%d,%d,%d})"                                                         \
                                   ,Aetche__CoastLines_3D_____numero_du_point_etche_courant_lors_de_l_iteration_courante                \
                                   ,_____cNORMALISE_OX(X),_____cNORMALISE_OY(Y),_____cNORMALISE_OZ(Z)                                   \
                                   ,X,Y,Z                                                                                               \
                                    )                                                                                                   \
                              );                                                                                                        \
                                        /* Le 20060105091221, le format "16g" est passe a "^^g" pour plus de souplesse...            */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123122733, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    INCR(Aetche__CoastLines_3D_____numero_du_point_etche_courant_lors_de_l_iteration_courante,I);                       \
                    INCR(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante,I);                             \
                                        /* Un point supplementaire de "terre" a ete "etche" au cours de l'iteration courante...      */ \
                    DECR(Aetche__CoastLines_3D_____nombre_courant_d_etchers,I);                                                         \
                                        /* Et il y a un "etcher" de moins...                                                         */ \
                    Eblock                                                                                                              \
                                        /* Marquage du point "etche" courant...                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   " E T C H I N G "                                */
/*        A   T E M P E R A T U R E   L O C A L E  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aetche__CoastLines_3D_a_temperatures_locales(albumR
                                                                                ,albumA
                                                                                ,nombre_maximal_d_etchers
                                                                                ,graine_de_selection_des_points_a_etcher
                                                                                ,temperature_locale
                                                                                ,editer_quelques_nombres_utiles
                                                                                 )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(Float,nombre_maximal_d_etchers));
                                        /* Nombre maximal (et initial) d'"etcher"s.                                                  */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_etcher));
                                        /* Pour choisir les points a "etcher".                                                       */
DEFV(Argument,DEFV(Float,temperature_locale));
                                        /* Temperature locale.                                                                       */
DEFV(Argument,DEFV(Logical,editer_quelques_nombres_utiles));
                                        /* Afin de permettre l'edition du nombre d'"etchers" avant "etching" et du nombre de         */
                                        /* points "etches" apres "etching".                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01               /* Common,DEFV(Fonction,) : pour la 'VERSION_01'.    */

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aetche__CoastLines_3D_a_temperatures_locales(albumR
                                                                                ,albumA
                                                                                ,nombre_maximal_d_etchers
                                                                                ,graine_de_selection_des_points_a_etcher
                                                                                ,temperature_locale
                                                                                ,editer_quelques_nombres_utiles
                                                                                 )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(Float,nombre_maximal_d_etchers));
                                        /* Nombre maximal (et initial) d'"etcher"s.                                                  */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_etcher));
                                        /* Pour choisir les points a "etcher".                                                       */
DEFV(Argument,DEFV(albumF,temperature_locale));
                                        /* Temperature locale.                                                                       */
DEFV(Argument,DEFV(Logical,editer_quelques_nombres_utiles));
                                        /* Afin de permettre l'edition du nombre d'"etchers" avant "etching" et du nombre de         */
                                        /* points "etches" apres "etching".                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02               /* Common,DEFV(Fonction,) : pour la 'VERSION_02'.    */

     Bblock
     DEFV(Logical,INIT(boucler_sur_le_parcours_de_albumA,VRAI));
                                        /* Afin de pouvoir iterer {begin_album,end_album}.                                           */

     DEFV(Logical,INIT(le_cumul_complet_des_taux_d_etching_est_connu,FAUX));
     DEFV(Float,INIT(cumul_complet_des_taux_d_etching,FLOT__UNDEF));
                                        /* Cumul des taux 'R' d'"etching" et indicateur de validite lorsqu'ils sont utiles, soit     */
                                        /* si 'IL_NE_FAUT_PAS(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)'.            */
     /*..............................................................................................................................*/
     INCR(Aetche__CoastLines_3D_____compteur_de_passage,I);
                                        /* Comptage des passages dans 'Aetche__CoastLines_3D_a_temperatures_locales(...)'.           */

     EGAL(Aetche__CoastLines_3D_____numero_du_point_etche_courant_lors_de_l_iteration_courante,PREMIER_POINT);
     CLIR(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante);
                                        /* A priori aucun points de "terre" n'a encore ete "etche" au cours de l'iteration courante. */

     Test(IL_FAUT(Aetche__CoastLines_3D_____initialiser))
          Bblock
          Test(IFOU(IZLE(nombre_maximal_d_etchers),fN_EST_PAS_ENTIER(nombre_maximal_d_etchers)))
               Bblock
               PRINT_ERREUR("le nombre d'\"etcher\"s est incorrect, il vaut :");
               CAL1(Prer2("%f et la valeur effectivement utilisee sera %.0f\n"
                         ,nombre_maximal_d_etchers
                         ,Aetche__CoastLines_3D_____nombre_courant_d_etchers
                          )
                    );
               Eblock
          ATes
               Bblock
               Test(IFEQ(Aetche__CoastLines_3D_____nombre_courant_d_etchers,NOMBRE_COURANT_D_ETCHERS_DANS_Aetche__CoastLines_3D))
                                        /* Ce test a ete introduit le 20020606122020 afin de pouvoir separer les initialisations de  */
                                        /* de 'Aetche__CoastLines_3D_____nombre_courant_d_etchers' et de 'nombre_maximal_d_etchers'  */
                                        /* afin de ne pas perturber le calcul de 'concentration_courante_d_etchers' ci-apres lors    */
                                        /* de la reprise des resultats d'une simulation anterieure en tant que conditions Initiales  */
                                        /* d'une autre simulation (il est imperatif que 'nombre_maximal_d_etchers' ne change pas et  */
                                        /* qu'alors 'Aetche__CoastLines_3D_____nombre_courant_d_etchers' lui soit different...       */
                    Bblock
                    EGAL(Aetche__CoastLines_3D_____nombre_courant_d_etchers,nombre_maximal_d_etchers);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          EGAL(Aetche__CoastLines_3D_____initialiser,FAUX);
                                        /* L'initialisation est faite...                                                             */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(editer_quelques_nombres_utiles))
          Bblock
                                        /* ATTENTION : il est imperatif que la "clef" du premier nombre edite soit precedee d'un     */
                                        /* espace, afin que les espaces soient des limiteurs des nombre edites ou qu'ils soient      */
                                        /* situes dans la liste (premier ou dernier en particulier...).                              */
          CAL3(Prme1(" Temps=%f"
                    ,Aetche__CoastLines_3D_____temps_simule
                     )
               );
          CAL3(Prme1(" NombreEtchersAvant=%.0f"
                    ,Aetche__CoastLines_3D_____nombre_courant_d_etchers
                     )
               );
                                        /* Ainsi, on edite bien 'Aetche__CoastLines_3D_____nombre_courant_d_etchers' apres           */
                                        /* l'initialisation du modele (mais pas la valeur obtenue apres la derniere iteration).      */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Aetche__CoastLines_3D;
                                        /* Initialisation si necessaire du noyau (dans le cas ou il est de plus utilise...).         */

     Tant(IL_FAUT(boucler_sur_le_parcours_de_albumA))
          Bblock
          DEFV(Float,INIT(cumul_precedent_des_taux_d_etching,FLOT__UNDEF));
          DEFV(Float,INIT(cumul_courant_des_taux_d_etching,FZERO));
                                        /* Cumul courant des taux 'R' d'"etching"...                                                 */
          DEFV(Int,INIT(index_valeur_aleatoire,UNDEF));
          DEFV(Float,DdTb1(POINTERf
                          ,liste_des_valeurs_aleatoires_de_selection_du_point_a_etcher
                          ,Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher
                          ,fMalo(MUL2(Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher,size_Float))
                           )
               );
                                        /* Liste des probabilites associees a chaque point unique a "etcher". On notera que le       */
                                        /* 20020603085900 a ete introduite la possibilite d'avoir non plus un seul point "unique",   */
                                        /* mais 'Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher' de tels points...      */

          CLIR(Aetche__CoastLines_3D_____nombre_de_points_sur_la_frontiere);
                                        /* Afin de connaitre le nombre de points sur la frontiere (cela peut toujours servir...).    */

          Test(IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote))
               Bblock
               Eblock
          ATes
               Bblock
               Test(EST_VRAI(le_cumul_complet_des_taux_d_etching_est_connu))
                    Bblock
                    Test(IZLE(Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher))
                         Bblock
                         PRINT_ERREUR("le nombre de points a \"etcher\" doit etre strictement positif");

                         EGAL(Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher
                             ,NOMBRE_MAXIMAL_DE_POINTS_A_ETCHER_DANS_Aetche__CoastLines_3D
                              );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    DoIn(index_valeur_aleatoire
                        ,PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER
                        ,DERNIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER
                        ,I
                         )
                         Bblock
                         GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D(LISTE_DES_VALEURS_ALEATOIRES(index_valeur_aleatoire)
                                                                               ,PROBABILITE_NULLE
                                                                               ,PROBABILITE_UNITE
                                                                               ,ADD2(graine_de_selection_des_points_a_etcher
                                                                                    ,index_valeur_aleatoire
                                                                                     )
                                                                                );
                                        /* Generation de l'eventuel evenement d'"etching" unique. ATTENTION : cette generation ne    */
                                        /* doit etre faite qu'une seule fois par iteration {begin_album,end_album} et ainsi doit     */
                                        /* donc etre situee imperativement ici. On notera le 'ADD2(...,index_valeur_aleatoire)'      */
                                        /* destine au fait que 'GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D(...)' base    */
                                        /* sa generation sur les coordonnees {X,Y,Z} courantes qui dans le cas present n'evoluent    */
                                        /* evidemment pas dans la boucle 'DoIn(...)' (au passage, ces coordonnees n'ont ici en fait  */
                                        /* pas de sens et valent {Xmin,Ymin,Zmin}...). C'est a cause de cette incrementation que     */
                                        /* 'INCREMENT_DES_GRAINES' a ete modifie ('v $xci/CoastL_3D.21$K INCREMENT_DES_GRAINES').    */
                         Eblock
                    EDoI
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          begin_album
               Bblock
               Test(IZGT(Aetche__CoastLines_3D_____nombre_courant_d_etchers))
                    Bblock
                    DEFV(Positive,INIT(nombre_d_etats_de_type_terre,ZERO));
                    DEFV(Positive,INIT(nombre_d_etats__indetermines,ZERO));
                    DEFV(Positive,INIT(nombre_d_etats_de_type___mer,ZERO));
                                        /* Comptabilite des differents signes possibles de l'"etat".                                 */

                    DEFV(genere_Float,INIT(moyenne_des_etats_de_type_terre,FZERO));
                    DEFV(genere_Float,INIT(moyenne_des_etats__indetermines,FZERO));
                    DEFV(genere_Float,INIT(moyenne_des_etats_de_type___mer,FZERO));
                                        /* Moyenne des differents "etat"s.                                                           */

                    DEFV(genere_Float,INIT(etat__X__Y__Z,FLOT__UNDEF));
                    DEFV(genere_Float,INIT(nouvel_etat__X__Y__Z,FLOT__UNDEF));
                                        /* Etat du point courant {X,Y,Z} et son etat futur...                                        */

                    Test(IL_FAUT(Aetche__CoastLines_3D_____utiliser_un_noyau))
                         Bblock

#define   Xc                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   Yc                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   Zc                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {Xc,Yc,Zc} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}).                              */

                         DEFV(genere_Float,INIT(etat_iX_jY_kZ,FLOT__UNDEF));
                                        /* Etat du point courant du voisinage du point {Xc,Yc,Zc}.                                   */

                         begin_albumQ(DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasZ
                                     ,DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasY
                                     ,DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasX
                                      )
                              Bblock
                                        /* ATTENTION : dans cette boucle {X,Y,Z} designent l'element courant du noyau, alors que     */
                                        /* {Xc,Yc,Zc} designent le point courant dont on etudie le voisinage...                      */

                              Test(I3ET(IZEQ(X),IZEQ(Y),IZEQ(Z)))
                                   Bblock
                                   ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X__Y__Z
                                                                         ,NEUT(Xc),ZERO
                                                                         ,NEUT(Yc),ZERO
                                                                         ,NEUT(Zc),ZERO
                                                                         ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                                                                          );
                                        /* Traitement du point courant {Xc,Yc,Zc}.                                                   */
                                   Eblock
                              ATes
                                   Bblock
                                   ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat_iX_jY_kZ
                                                                         ,ADD2(Xc,X),Aetche__CoastLines_3D_____delta_X
                                                                         ,ADD2(Yc,Y),Aetche__CoastLines_3D_____delta_Y
                                                                         ,ADD2(Zc,Z),Aetche__CoastLines_3D_____delta_Z
                                                                         ,ACCES_NOYAU_DANS_Aetche__CoastLines_3D(X,Y,Z)
                                                                          );
                                        /* Traitement du point courant {Xc+X,Yc+Y,Zc+Z} du voisinage du point {Xc,Yc,Zc}.            */
                                   Eblock
                              ETes
                              Eblock
                         end_albumQ(EDoI,EDoI,EDoI)

#undef    Zc
#undef    Yc
#undef    Xc

                         Eblock
                    ATes
                         Bblock
                         DEFV(genere_Float,INIT(etat_sX__Y__Z,FLOT__UNDEF));
                         DEFV(genere_Float,INIT(etat__X_sY__Z,FLOT__UNDEF));
                         DEFV(genere_Float,INIT(etat__X__Y_sZ,FLOT__UNDEF));
                         DEFV(genere_Float,INIT(etat_pX__Y__Z,FLOT__UNDEF));
                         DEFV(genere_Float,INIT(etat__X_pY__Z,FLOT__UNDEF));
                         DEFV(genere_Float,INIT(etat__X__Y_pZ,FLOT__UNDEF));
                                        /* Etats des voisins du point {X,Y,Z}.                                                       */

                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X__Y__Z
                                                               ,NEUT(X),ZERO
                                                               ,NEUT(Y),ZERO
                                                               ,NEUT(Z),ZERO
                                                               ,PONDERATION_D_UN_POINT_DANS_Aetche__CoastLines_3D
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat_sX__Y__Z
                                                               ,SUCX(X),Aetche__CoastLines_3D_____delta_X
                                                               ,NEUT(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,NEUT(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point_sX__Y__Z
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X_sY__Z
                                                               ,NEUT(X),Aetche__CoastLines_3D_____delta_X
                                                               ,SUCY(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,NEUT(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point__X_sY__Z
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X__Y_sZ
                                                               ,NEUT(X),Aetche__CoastLines_3D_____delta_X
                                                               ,NEUT(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,SUCZ(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point__X__Y_sZ
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat_pX__Y__Z
                                                               ,PREX(X),Aetche__CoastLines_3D_____delta_X
                                                               ,NEUT(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,NEUT(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point_pX__Y__Z
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X_pY__Z
                                                               ,NEUT(X),Aetche__CoastLines_3D_____delta_X
                                                               ,PREY(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,NEUT(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point__X_pY__Z
                                                                );
                         ACCES_A_UN_POINT_D_ETCHE______COTES_3D(etat__X__Y_pZ
                                                               ,NEUT(X),Aetche__CoastLines_3D_____delta_X
                                                               ,NEUT(Y),Aetche__CoastLines_3D_____delta_Y
                                                               ,PREZ(Z),Aetche__CoastLines_3D_____delta_Z
                                                               ,Aetche__CoastLines_3D_____ponderation_du_point__X__Y_pZ
                                                                );
                                        /* Etats des points utiles avec ponderation eventuelle.                                      */
                         Eblock
                    ETes

                    EGAL(moyenne_des_etats_de_type_terre,DIVZ(moyenne_des_etats_de_type_terre,FLOT(nombre_d_etats_de_type_terre)));
                    EGAL(moyenne_des_etats__indetermines,DIVZ(moyenne_des_etats__indetermines,FLOT(nombre_d_etats__indetermines)));
                    EGAL(moyenne_des_etats_de_type___mer,DIVZ(moyenne_des_etats_de_type___mer,FLOT(nombre_d_etats_de_type___mer)));
                                        /* Moyenne des differents "etat"s.                                                           */

                    EGAL(nouvel_etat__X__Y__Z,etat__X__Y__Z);
                                        /* A priori, l'etat du point courant {X,Y,Z} est inchange...                                 */

                    Test(UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA_TERRE(etat__X__Y__Z))
                                        /* Cas ou l'on est sur la terre :                                                            */
                         Bblock
                         Test(IFOU(IFGT(ABSO(etat__X__Y__Z),ABSO(Aetche__CoastLines_3D_____niveau_de_la_terre))
                                  ,IFEXff(ABSO(etat__X__Y__Z),COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                                   )
                              )
                              Bblock
                              PRINT_ERREUR("un niveau de la terre est incorrect, il vaut :");
                              CAL1(Prer4("niveau(%d,%d,%d) = %g\n",X,Y,Z,etat__X__Y__Z));
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Test(IZGT(nombre_d_etats_de_type___mer))
                              Bblock
                                        /* Cas ou l'on est sur la frontiere (c'est-a-dire sur un point de la terre qui est au bord   */
                                        /* de la mer) :                                                                              */
                              DEFV(Float,INIT(taux_d_etching,FLOT__UNDEF));
                                        /* Taux 'R' d'"etching".                                                                     */
                              DEFV(Float,INIT(concentration_courante_d_etchers
                                             ,SCAL(Aetche__CoastLines_3D_____concentration_initiale_d_etchers
                                                  ,nombre_maximal_d_etchers
                                                  ,Aetche__CoastLines_3D_____nombre_courant_d_etchers
                                                   )
                                              )
                                   );
                                        /* Concentration courante d'"etcher"s.                                                       */

                              INCR(Aetche__CoastLines_3D_____nombre_de_points_sur_la_frontiere,I);
                                        /* Afin de connaitre le nombre de points sur la frontiere (cela peut toujours servir...).    */

                              EGAL(taux_d_etching
                                  ,TAUX_D_ETCHE______COTES_ND(concentration_courante_d_etchers
                                                             ,Aetche__CoastLines_3D_____frequence_de_la_reaction
                                                             ,Aetche__CoastLines_3D_____energie_minimale
                                                             ,Aetche__CoastLines_3D_____energie_maximale
                                                             ,ABSO(etat__X__Y__Z)
                                                             ,Aetche__CoastLines_3D_____constante_de_Boltzmann
                                                             ,TEMPERATURE_LOCALE(X,Y,Z)
                                                              )
                                   );
                                        /* Taux 'R' d'"etching" courant de la forme :                                                */
                                        /*                                                                                           */
                                        /*                               Em + p.(EM - Em)           E                                */
                                        /*                            - ------------------      - -----                              */
                                        /*                                     k.T                 k.T                               */
                                        /*                  taux = F.e                     = F.e                                     */
                                        /*                                                                                           */
                                        /* ou {Em,EM} designent {energie_minimale,energie_maximale} respectivement et 'p' un         */
                                        /* parametre de ponderation dans [0,1]. Ainsi, plus l'energie 'E' est elevee (voisine de     */
                                        /* 'EM ', 'p' proche de '1'), plus le taux d'activation est faible et moins la reaction      */
                                        /* d'"etching" a lieu ; inversement, plus l'energie 'E' est faible (voisine de 'Em', 'p'     */
                                        /* proche de 0), plus le taux d'activation est eleve et plus la reaction d'"etching" a lieu. */
                                        /*                                                                                           */
                                        /* On notera que par defaut :                                                                */
                                        /*                                                                                           */
                                        /*                  Em = 0                                                                   */
                                        /*                  EM = 1                                                                   */
                                        /*                  F  = 1                                                                   */
                                        /*                                                                                           */
                                        /* et que la plupart du temps :                                                              */
                                        /*                                                                                           */
                                        /*                  k  = 1                                                                   */
                                        /*                                                                                           */
                                        /* ('v $xci/CoastL_3D.21$K constante_de_Boltzmann').                                         */
                                        /*                                                                                           */
                                        /* Dans le cas 'IL_NE_FAUT_PAS(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)',   */
                                        /* on notera que lorsque 'EM-Em' est faible (voisin de 1 par exemple), la cote obtenue est   */
                                        /* tres peu tourmentee, alors que pour des valeurs plus elevees (100 par exemple), la cote   */
                                        /* est tres tourmentee avec des fjords tres longs (et donc des avalanches...). Par contre,   */
                                        /* lorsque 'IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)' les valeurs   */
                                        /* fortes de 'EM-Em' donnent tres peu d'evolution, alors que les valeurs faibles de 'EM-Em'  */
                                        /* donnent beaucoup de points "etche"s par iteration...                                      */

                              Test(IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote))
                                   Bblock
                                   DEFV(Float,INIT(valeur_aleatoire_de_selection_des_points_a_etcher,FLOT__UNDEF));
                                        /* Valeur aleatoire de choix des points a "etcher".                                          */

                                   GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D
                                       (valeur_aleatoire_de_selection_des_points_a_etcher
                                       ,gTAUX_D_ETCHE______COTES_ND(Aetche__CoastLines_3D_____concentration_initiale_d_etchers
                                                                   ,Aetche__CoastLines_3D_____frequence_de_la_reaction
                                                                   ,MINIMUM_FONCTION_ENERGIE_TEMPERATURE_DE_TAUX_D_ETCHE______COTES_ND
                                                                    )
                                       ,gTAUX_D_ETCHE______COTES_ND(Aetche__CoastLines_3D_____concentration_initiale_d_etchers
                                                                   ,Aetche__CoastLines_3D_____frequence_de_la_reaction
                                                                   ,MAXIMUM_FONCTION_ENERGIE_TEMPERATURE_DE_TAUX_D_ETCHE______COTES_ND
                                                                    )
                                       ,graine_de_selection_des_points_a_etcher
                                        );
                                        /* Generation de l'eventuel evenement d'"etching" multiple.                                  */

                                   Test(IFLE(valeur_aleatoire_de_selection_des_points_a_etcher,taux_d_etching))
                                        Bblock
                                        MARQUAGE_DU_POINT_ETCHE_COURANT_D_ETCHE______COTES_3D;
                                        /* Le point courant est "etche"...                                                           */
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(cumul_precedent_des_taux_d_etching,cumul_courant_des_taux_d_etching);
                                   INCR(cumul_courant_des_taux_d_etching,taux_d_etching);
                                        /* Cumul des taux d'"etching". Cette facon de faire permet au premier point d'etre "etche"   */
                                        /* (cas ou un element de 'liste_des_valeurs_aleatoires_de_selection_du_point_a_etcher'       */
                                        /* est une toute petite valeur...).                                                          */

                                   Test(EST_VRAI(le_cumul_complet_des_taux_d_etching_est_connu))
                                        Bblock
                                        Test(IFLT(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante
                                                 ,Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher
                                                  )
                                             )
                                             Bblock
                                             DEFV(Logical,INIT(un_point_a_ete_etche,FAUX));
                                        /* Afin de ne faire qu'un seul "etching" du point courant (si besoin est...).                */

                                             DoIn(index_valeur_aleatoire
                                                 ,PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER
                                                 ,DERNIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER
                                                 ,I
                                                  )
                                                  Bblock
                                                  Test(EST_FAUX(un_point_a_ete_etche))
                                                       Bblock
                                                       Test(IFINof(LISTE_DES_VALEURS_ALEATOIRES(index_valeur_aleatoire)
                                                                  ,DIVZ(cumul_precedent_des_taux_d_etching
                                                                       ,cumul_complet_des_taux_d_etching
                                                                        )
                                                                  ,DIVZ(cumul_courant_des_taux_d_etching
                                                                       ,cumul_complet_des_taux_d_etching
                                                                        )
                                                                   )
                                                            )
                                                            Bblock
                                                            MARQUAGE_DU_POINT_ETCHE_COURANT_D_ETCHE______COTES_3D;
                                        /* Le point courant est "etche". Ce point possede le rang 'k+1' sur la frontiere, tel que :  */
                                        /*                                                                                           */
                                        /*                   ___                    _____                                            */
                                        /*                   \                      \                                                */
                                        /*                   /   taux(i)            /     taux(i)                                    */
                                        /*                   ---                    -----                                            */
                                        /*                    k                      k+1                                             */
                                        /*                  ------------- < RDN <= ---------------                                   */
                                        /*                   ___                     ___                                             */
                                        /*                   \                       \                                               */
                                        /*                   /   taux(i)             /   taux(i)                                     */
                                        /*                   ---                     ---                                             */
                                        /*                    N                       N                                              */
                                        /*                                                                                           */
                                        /* ou 'N' designe le nombre de point total de la frontiere. On voit qu'ainsi une quantite    */
                                        /* importante est la longueur :                                                              */
                                        /*                                                                                           */
                                        /*                   _____           ___                                                     */
                                        /*                   \               \                                                       */
                                        /*                   /     taux(i) - /   taux(i)                                             */
                                        /*                   -----           ---                                                     */
                                        /*                    k+1             k                                                      */
                                        /*                                                                                           */
                                        /* et plus cette longueur est importante, plus le seuil aleatoire 'RDN' a de chance de       */
                                        /* tomber dans l'intervalle [k,k+1].                                                         */
                                        /*                                                                                           */
                                        /* On notera que 'taux(i)' etant de la forme :                                               */
                                        /*                                                                                           */
                                        /*                  taux(i) = C.F.exp(...)                                                   */
                                        /*                                                                                           */
                                        /* et etant donne que ci-dessus les quantites utiles sont des rapports de sommes des         */
                                        /* 'taux(i)', le produit 'C.F' disparait par simplification au numerateur et au              */
                                        /* denominateur. Moralite : 'Aetche__CoastLines_3D_____concentration_initiale_d_etchers'     */
                                        /* (la concentration 'C') et 'Aetche__CoastLines_3D_____frequence_de_la_reaction'            */
                                        /* (la frequence 'F') sont deux parametres inutiles (decouverte faite le 20020604114847) ;   */
                                        /* malgre tout, ils sont conserves d'une part par esprit de generalite et d'autre part       */
                                        /* parce que la concentration sert malgre tout pour definir l'echelle de temps lors du       */
                                        /* calcul de 'Aetche__CoastLines_3D_____temps_simule' ci-apres...                            */
                                        /*                                                                                           */
                                        /* ATTENTION : depuis qu'a ete introduite 'LISTE_DES_VALEURS_ALEATOIRES(...)' le             */
                                        /* 20020603085900, plusieurs valeurs 'RDN' de la liste aleatoire peuvent se situer           */
                                        /* a l'interieur d'un meme intervalle [k,k+1] alors que seule la premiere d'entre-elles      */
                                        /* rencontree sera utilisee. Cela explique donc que dans ces conditions que la valeur de     */
                                        /* 'Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante'          */
                                        /* puisse etre inferieur a 'Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher'     */
                                        /* en sortie de cette fonction, lorsque l'on est dans ce mode de calcul evidemment...        */

                                                            EGAL(un_point_a_ete_etche,VRAI);
                                        /* Afin de ne faire qu'un seul "etching" du point courant (si besoin est...).                */

#define   nombre_de_points_etches_lors_de_l_iteration_courante                                                                          \
                    Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante                                      \
                                        /* Afin de raccourcir la ligne suivante...                                                   */

                                                            Test(IFEQ(nombre_de_points_etches_lors_de_l_iteration_courante,UN))
                                        /* ATTENTION : ce test ne peut avoir lieu qu'apres que la mise a jour de ce compteur ait     */
                                        /* eu lieu dans 'MARQUAGE_DU_POINT_ETCHE_COURANT_D_ETCHE______COTES_3D'.                     */

#undef    nombre_de_points_etches_lors_de_l_iteration_courante

                                                                 Bblock
                                                                 EGAL(Aetche__CoastLines_3D_____pas_de_temps_simule
                                                                     ,INVZ(cumul_complet_des_taux_d_etching)
                                                                      );
                                                                 INCR(Aetche__CoastLines_3D_____temps_simule
                                                                     ,Aetche__CoastLines_3D_____pas_de_temps_simule
                                                                      );
                                        /* Enfin, le temps progresse, mais uniquement une seule fois : ce qui explique qu'on le      */
                                        /* fasse uniquement pour le premier point. On notera au passage qu'il est possible de        */
                                        /* jouer sur l'echelle de temps via 'concentration_courante_d_etchers' (et donc via          */
                                        /* 'Aetche__CoastLines_3D_____concentration_initiale_d_etchers') qui ne sert d'ailleurs      */
                                        /* qu'ici...                                                                                 */
                                        /*                                                                                           */
                                        /* Le 20020606132935, des tests complexes ont montre un comportement etonnant et apparemment */
                                        /* normal du temps siimule (via le cumul) decrit dans 'v $xiii/di_image$FON 20020606132935'. */
                                                                 Eblock
                                                            ATes
                                                                 Bblock
                                                                 Eblock
                                                            ETes
                                                            Eblock
                                                       ATes
                                                            Bblock
                                                            Eblock
                                                       ETes
                                                       Eblock
                                                  ATes
                                                       Bblock
                                                       Eblock
                                                  ETes
                                                  Eblock
                                             EDoI
                                             Eblock
                                        ATes
                                             Bblock
                                             Eblock
                                        ETes
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFOU(IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)
                             ,IFET(IL_NE_FAUT_PAS(Aetche__CoastLines_3D_____explorer_parallelement_la_cote)
                                  ,EST_VRAI(le_cumul_complet_des_taux_d_etching_est_connu)
                                   )
                              )
                         )
                         Bblock
                         AstoreF_point(nouvel_etat__X__Y__Z
                                      ,albumR
                                      ,X,Y,Z
                                       );
                                        /* Nouvel etat du point courant {X,Y,Z}...                                                   */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          end_album

          Test(IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote))
               Bblock
               EGAL(boucler_sur_le_parcours_de_albumA,FAUX);
                                        /* On a fini de parcourir 'imageA'...                                                        */
               Eblock
          ATes
               Bblock
               Test(EST_FAUX(le_cumul_complet_des_taux_d_etching_est_connu))
                    Bblock
                    EGAL(cumul_complet_des_taux_d_etching,cumul_courant_des_taux_d_etching);
                    EGAL(le_cumul_complet_des_taux_d_etching_est_connu,VRAI);
                                        /* Maintenant le cumul des taux d'"etching" est connu, mais il faut encore boucler sur       */
                                        /* le parcours de 'imageA'...                                                                */

                    TesF(IZEQ(cumul_complet_des_taux_d_etching))
                                        /* Ce test a ete "virtuellement" supprime le 20020710165836 (en remplacant 'Test(...)' par   */
                                        /* 'TesF(...)'), car cette situation est normale et correspond a l'epuisement des "etcher"s. */
                         Bblock
                         PRINT_ERREUR("le cumul complet des taux d'\"etching\" est nul");
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    TesF(IZEQ(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante))
                                        /* Ce test a ete "virtuellement" supprime le 20020710165836 (en remplacant 'Test(...)' par   */
                                        /* 'TesF(...)'), car cette situation est normale et correspond a l'epuisement des "etcher"s. */
                         Bblock
                         PRINT_ERREUR("aucun point a \"etcher\" n'a ete trouve");
                         CAL1(Prer1("cumul complet des taux d_etching.. = %g\n",cumul_complet_des_taux_d_etching));
                         CAL1(Prer1("cumul precedent des taux d_etching = %g\n",cumul_precedent_des_taux_d_etching));
                         CAL1(Prer1("cumul courant des taux d_etching.. = %g\n",cumul_courant_des_taux_d_etching));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(boucler_sur_le_parcours_de_albumA,FAUX);
                                        /* On a fini de parcourir 'imageA'...                                                        */
                    Eblock
               ETes
               Eblock
          ETes

          FdTb1(liste_des_valeurs_aleatoires_de_selection_du_point_a_etcher
               ,Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher
               ,Float
               ,ADRESSE_PLUS_DEFINIE
                );
                                        /* Liberation de la liste des probabilites associees a chaque point unique a "etcher".       */
                                        /*                                                                                           */
                                        /* Le 'ADRESSE_NON_ENCORE_DEFINIE' a ete introduit le 20050221164554...                      */
          Eblock
     ETan

     Test(IL_FAUT(Aetche__CoastLines_3D_____explorer_parallelement_la_cote))
          Bblock
          INCR(Aetche__CoastLines_3D_____temps_simule,Aetche__CoastLines_3D_____pas_de_temps_simule);
                                        /* Enfin, le temps progresse...                                                              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(editer_quelques_nombres_utiles))
          Bblock
          CAL3(Prme1(" NombreEtchesApres=%d"
                    ,Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante
                     )
               );
                                        /* Ainsi, on edite bien le nombre de points "etches" lors de l'iteration courante...         */

          Test(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement))
               Bblock
               CAL3(Prme1(" NiveauMarquage=%.^^^"
                         ,Aetche__CoastLines_3D_____marqueur_des_points_etches
                          )
                    );
                                        /* Ceci a ete introduit le 20020527101710 afin de permettre de faire au retour, par exemple, */
                                        /* des renormalisations en connaissant le dernier niveau de marquage (le premier etant       */
                                        /* evidemment connu puisque c'est un argument initial...).                                   */
                                        /*                                                                                           */
                                        /* Le 20060106160949, le format "16f" est passe a "^^f" pour plus de souplesse...            */
                                        /*                                                                                           */
                                        /* Le 20091123122733, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          CAL3(Prme1(" PasDeTemps=%f"
                    ,Aetche__CoastLines_3D_____pas_de_temps_simule
                     )
               );

          CALS(FPrme0(" \n"));
                                        /* L'espace devant le changement de ligne a ete introduit le 20020619135547 et c'est a       */
                                        /* cette date qu'ont ete supprimees les virgules de separation entre entites editees.        */
                                        /* Ceci est en fait destine a faciliter la recuperation automatique de ces entites qui       */
                                        /* sont donc systematiquement precedees et suivies par un espace...                          */
                                        /*                                                                                           */
                                        /* ATTENTION : il est donc imperatif que la "clef" du dernier nombre edite soit suivie d'un  */
                                        /* espace, afin que les espaces soient des limiteurs des nombre edites ou qu'ils soient      */
                                        /* situes dans la liste (premier ou dernier en particulier...).                              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETAF(albumR);
     Eblock

EFonctionF

#undef    MARQUAGE_DU_POINT_ETCHE_COURANT_D_ETCHE______COTES_3D

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#    undef     TEMPERATURE_LOCALE
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#    undef     TEMPERATURE_LOCALE
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02

#undef    LISTE_DES_VALEURS_ALEATOIRES

#undef    NOMBRE_COURANT_D_ETCHERS_DANS_Aetche__CoastLines_3D

#undef    DERNIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER
#undef    PREMIERE_VALEUR_ALEATOIRE_DE_SELECTION_DU_POINT_A_ETCHER

#undef    NOMBRE_MAXIMAL_DE_POINTS_A_ETCHER_DANS_Aetche__CoastLines_3D

#undef    NIVEAU_HORS_IMAGE_DANS_Aetche__CoastLines_3D
#undef    NIVEAU______MEDIAN_DANS_Aetche__CoastLines_3D

#undef    ACCES_A_UN_POINT_D_ETCHE______COTES_3D

#undef    UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA___MER
#undef    UN_POINT_D_ETCHE______COTES_3D_EST__INDETERMINE
#undef    UN_POINT_D_ETCHE______COTES_3D_EST_SUR_LA_TERRE

#undef    GENERATION_D_UN_NOMBRE_ALEATOIRE_D_ETCHE______COTES_3D

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O D E L E   T R I D I M E N S I O N N E L   D E   C O T E S   A V E C   " E T C H I N G "                                */
/*        A   T E M P E R A T U R E   G L O B A L E  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,POINTERF(Aetche__CoastLines_3D(albumR
                                                         ,albumA
                                                         ,nombre_maximal_d_etchers
                                                         ,graine_de_selection_des_points_a_etcher
                                                         ,temperature_globale
                                                         ,editer_quelques_nombres_utiles
                                                          )
                                    )
                 )
     )
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR=CoastLines(albumA).                                      */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument a traiter par le modele Lignes de Cotes tridimensionnel.                   */
DEFV(Argument,DEFV(Float,nombre_maximal_d_etchers));
                                        /* Nombre maximal (et initial) d'"etcher"s.                                                  */
DEFV(Argument,DEFV(Int,graine_de_selection_des_points_a_etcher));
                                        /* Pour choisir les points a "etcher".                                                       */
DEFV(Argument,DEFV(Float,temperature_globale));
                                        /* Temperature globale de la terre.                                                          */
DEFV(Argument,DEFV(Logical,editer_quelques_nombres_utiles));
                                        /* Afin de permettre l'edition du nombre d'"etchers" avant "etching" et du nombre de         */
                                        /* points "etches" apres "etching".                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
     DEFV(Float,INIT(temperature_locale,FLOT__UNDEF));
                                        /* Caracteristiques de la terre et de la mer respectivement, "locales" uniformes             */
                                        /* (c'est-a-dire independante du point {X,Y,Z}).                                             */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
     BDEFV(albumF,temperature_locale);
                                        /* Album flottant donnant la temperature en chaque point {X,Y,Z}.                            */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02

     /*..............................................................................................................................*/

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
     EGAL(temperature_locale,temperature_globale);
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
     CALS(dAFinitialisation(temperature_locale,temperature_globale));
                                        /* Temperature "locale" uniforme (c'est-a-dire independante du point {X,Y,Z}).               */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02

     CALS(Aetche__CoastLines_3D_a_temperatures_locales(albumR
                                                      ,albumA
                                                      ,nombre_maximal_d_etchers
                                                      ,graine_de_selection_des_points_a_etcher
                                                      ,temperature_locale
                                                      ,editer_quelques_nombres_utiles
                                                       )
          );
                                        /* Et calcul avec la meme temperature en chaque point {X,Y,Z} de la terre.                   */

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_01

#ifdef    Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
     EDEFV(albumF,temperature_locale);
                                        /* Album flottant donnant la temperature en chaque point {X,Y,Z}.                            */
#Aifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02
#Eifdef   Aetche__CoastLines_3D_a_temperatures_locales_VERSION_02

     RETAF(albumR);
     Eblock

EFonctionF

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F O R M A T I O N   " I N V E R S E "   T R I D I M E N S I O N N E L L E                                              */
/*        D ' U N E   I M A G E   N O N   S T A N D A R D   P A R   U N   A L B U M   N O N   S T A N D A R D  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_X_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_Y_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_Z_sont_normalisees,VRAI)));

DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____periodiser_X,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____periodiser_Y,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____periodiser_Z,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFdeformation_inverse_tridimensionnelle_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(AFdeformation_inverse_tridimensionnelle_____niveau_flottant_hors_image,FZERO)));

DEFV(Common,DEFV(FonctionF,POINTERF(AFdeformation_inverse_tridimensionnelle(imageR,albumA,diX,diY,diZ))))
                                        /* Fonction introduite le 20080930141126...                                                  */
DEFV(Argument,DEFV(imageF,imageR));
                                        /* Image Resultat, tel que : imageR[X][Y]=albumA[diX[X][Y],diY[X][Y],diZ[X][Y]].             */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(imageF,diX));
DEFV(Argument,DEFV(imageF,diY));
DEFV(Argument,DEFV(imageF,diZ));
                                        /* Definition de la deformation "Inverse" {diX,diY,diZ}.                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_image
          Bblock
          DEFV(Float,INIT(Xf
                         ,OPC1(EST_VRAI(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_X_sont_normalisees)
                              ,NEUT
                              ,_____cNORMALISE_OX
                              ,loadF_point(diX,X,Y)
                               )
                          )
               );
          DEFV(Float,INIT(Yf
                         ,OPC1(EST_VRAI(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_Y_sont_normalisees)
                              ,NEUT
                              ,_____cNORMALISE_OY
                              ,loadF_point(diY,X,Y)
                               )
                          )
               );
          DEFV(Float,INIT(Zf
                         ,OPC1(EST_VRAI(AFdeformation_inverse_tridimensionnelle_____les_coordonnees_Z_sont_normalisees)
                              ,NEUT
                              ,_____cNORMALISE_OZ
                              ,loadF_point(diZ,X,Y)
                               )
                          )
               );
                                        /* Coordonnees flottantes de deformation "inverse"...                                        */
          DEFV(genere_Float,INIT(niveau_courant,FLOT__NIVEAU_UNDEF));
                                        /* Donne le niveau flottant courant apres deformation "inverse"...                           */

          EGAL(niveau_courant
              ,FFAload_point_coordonnees_01(albumA
                                           ,Xf,Yf,Zf
                                           ,AFdeformation_inverse_tridimensionnelle_____periodiser_X
                                           ,AFdeformation_inverse_tridimensionnelle_____periodiser_Y
                                           ,AFdeformation_inverse_tridimensionnelle_____periodiser_Z
                                           ,AFdeformation_inverse_tridimensionnelle_____symetriser_X
                                           ,AFdeformation_inverse_tridimensionnelle_____symetriser_Y
                                           ,AFdeformation_inverse_tridimensionnelle_____symetriser_Z
                                           ,AFdeformation_inverse_tridimensionnelle_____prolonger_X
                                           ,AFdeformation_inverse_tridimensionnelle_____prolonger_Y
                                           ,AFdeformation_inverse_tridimensionnelle_____prolonger_Z
                                           ,AFdeformation_inverse_tridimensionnelle_____niveau_flottant_hors_image
                                            )
               );

          storeF_point(niveau_courant
                      ,imageR
                      ,X,Y
                       );
                                        /* Et on met a jour l'image Resultat flottante.                                              */
          Eblock
     end_image

     RETAF(imageR);
     Eblock

EFonctionF

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F O R M A T I O N   " I N V E R S E "   T R I D I M E N S I O N N E L L E                                              */
/*        D ' U N   A L B U M   S T A N D A R D   P A R   U N   A L B U M   S T A N D A R D   N O N   S T A N D A R D  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   COORDONNEES_NORMALISEES_DE_DEFORMATION_INVERSE                                                                                \
                    DEFV(Float,INIT(Xf                                                                                                  \
                                   ,OPC1(EST_VRAI(NomDeLaFonctionCourante QD@@__ _____les_coordonnees_X_sont_normalisees)               \
                                        ,NEUT                                                                                           \
                                        ,_____cNORMALISE_OX                                                                             \
                                        ,AloadF_point(diX,X,Y,Z)                                                                        \
                                         )                                                                                              \
                                    )                                                                                                   \
                         );                                                                                                             \
                    DEFV(Float,INIT(Yf                                                                                                  \
                                   ,OPC1(EST_VRAI(NomDeLaFonctionCourante QD@@__ _____les_coordonnees_Y_sont_normalisees)               \
                                        ,NEUT                                                                                           \
                                        ,_____cNORMALISE_OY                                                                             \
                                        ,AloadF_point(diY,X,Y,Z)                                                                        \
                                         )                                                                                              \
                                    )                                                                                                   \
                         );                                                                                                             \
                    DEFV(Float,INIT(Zf                                                                                                  \
                                   ,OPC1(EST_VRAI(NomDeLaFonctionCourante QD@@__ _____les_coordonnees_Z_sont_normalisees)               \
                                        ,NEUT                                                                                           \
                                        ,_____cNORMALISE_OZ                                                                             \
                                        ,AloadF_point(diZ,X,Y,Z)                                                                        \
                                         )                                                                                              \
                                    )                                                                                                   \
                         );                                                                                                             \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____iterer_le_calcul_des_coordonnees))                                 \
                                        /* Test introduit le 20200121164657...                                                       */ \
                         Bblock                                                                                                         \
                         Repe(NomDeLaFonctionCourante QD@@__ _____nombre_d_iterations_du_calcul_des_coordonnees)                        \
                              Bblock                                                                                                    \
                                        /* On notera qu'arrive ici, les coordonnees {Xf,Yf,Zf} sont normalisees...                   */ \
                              DEFV(Float,INIT(Xf_itere                                                                                  \
                                             ,AloadF_point(diX                                                                          \
                                                          ,_cDENORMALISE_OX(Xf)                                                         \
                                                          ,_cDENORMALISE_OY(Yf)                                                         \
                                                          ,_cDENORMALISE_OZ(Zf)                                                         \
                                                           )                                                                            \
                                              )                                                                                         \
                                   );                                                                                                   \
                              DEFV(Float,INIT(Yf_itere                                                                                  \
                                             ,AloadF_point(diY                                                                          \
                                                          ,_cDENORMALISE_OX(Xf)                                                         \
                                                          ,_cDENORMALISE_OY(Yf)                                                         \
                                                          ,_cDENORMALISE_OZ(Zf)                                                         \
                                                           )                                                                            \
                                              )                                                                                         \
                                   );                                                                                                   \
                              DEFV(Float,INIT(Zf_itere                                                                                  \
                                             ,AloadF_point(diZ                                                                          \
                                                          ,_cDENORMALISE_OX(Xf)                                                         \
                                                          ,_cDENORMALISE_OY(Yf)                                                         \
                                                          ,_cDENORMALISE_OZ(Zf)                                                         \
                                                           )                                                                            \
                                              )                                                                                         \
                                   );                                                                                                   \
                                                                                                                                        \
                              EGAL(Xf,Xf_itere);                                                                                        \
                              EGAL(Yf,Yf_itere);                                                                                        \
                              EGAL(Zf,Zf_itere);                                                                                        \
                              Eblock                                                                                                    \
                         ERep                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                        /* Transformation des coordonnees, la possibilite d'iterer ayant ete introduite le           */ \
                                        /* 20200121164657...                                                                         */

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____iterer_le_calcul_des_coordonnees,FAUX)));
DEFV(Common,DEFV(Int,SINT(Avraie_deformation_inverse_tridimensionnelle_____nombre_d_iterations_du_calcul_des_coordonnees,ZERO)));

DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____les_coordonnees_X_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____les_coordonnees_Y_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____les_coordonnees_Z_sont_normalisees,VRAI)));

DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____periodiser_X,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____periodiser_Y,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____periodiser_Z,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Avraie_deformation_inverse_tridimensionnelle_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_p,SINT(Avraie_deformation_inverse_tridimensionnelle_____niveau_hors_image,NOIR)));

DEFV(Common,DEFV(FonctionP,POINTERp(Avraie_deformation_inverse_tridimensionnelle(albumR,albumA,diX,diY,diZ))))
                                        /* Fonction introduite le 20200106103719...                                                  */
                                        /*                                                                                           */
                                        /* On notera qu'elle est dite "VRAIE_deformation_inverse_tridimensionnelle" par opposition a */
                                        /* "deformation_inverse_tridimensionnelle" car cette nouvelle fonction transforme un album   */
                                        /* en un autre album, alors que l'ancienne transforme un album en image...                   */
DEFV(Argument,DEFV(album,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[diX[X][Y][Z],diY[X][Y][Z],diZ[X][Y][Z]]. */
DEFV(Argument,DEFV(album,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(albumF,diX));
DEFV(Argument,DEFV(albumF,diY));
DEFV(Argument,DEFV(albumF,diZ));
                                        /* Definition de la deformation "Inverse" {diX,diY,diZ}.                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album_AvecEditionProgression
                                        /* La possibilite de suivre la progression a ete introduite le 20200109103959...             */
          Bblock
          COORDONNEES_NORMALISEES_DE_DEFORMATION_INVERSE;
                                        /* Coordonnees flottantes de deformation "inverse"...                                        */
          DEFV(genere_p,INIT(niveau_courant,NIVEAU_UNDEF));
                                        /* Donne le niveau courant apres deformation "inverse"...                                    */

          EGAL(niveau_courant
              ,FAload_point_coordonnees_01(albumA
                                          ,Xf,Yf,Zf
                                          ,Avraie_deformation_inverse_tridimensionnelle_____periodiser_X
                                          ,Avraie_deformation_inverse_tridimensionnelle_____periodiser_Y
                                          ,Avraie_deformation_inverse_tridimensionnelle_____periodiser_Z
                                          ,Avraie_deformation_inverse_tridimensionnelle_____symetriser_X
                                          ,Avraie_deformation_inverse_tridimensionnelle_____symetriser_Y
                                          ,Avraie_deformation_inverse_tridimensionnelle_____symetriser_Z
                                          ,Avraie_deformation_inverse_tridimensionnelle_____prolonger_X
                                          ,Avraie_deformation_inverse_tridimensionnelle_____prolonger_Y
                                          ,Avraie_deformation_inverse_tridimensionnelle_____prolonger_Z
                                          ,Avraie_deformation_inverse_tridimensionnelle_____niveau_hors_image
                                           )
               );

          Astore_point(niveau_courant
                      ,albumR
                      ,X,Y,Z
                       );
                                        /* Et on met a jour l'album Resultat.                                                        */
          Eblock
     end_album_back_AvecEditionProgression
                                        /* La possibilite de suivre la progression a ete introduite le 20200109103959...             */

     RETA(albumR);
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F O R M A T I O N   " I N V E R S E "   T R I D I M E N S I O N N E L L E                                              */
/*        D ' U N   A L B U M   N O N   S T A N D A R D   P A R   U N   A L B U M   N O N   S T A N D A R D  :                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____iterer_le_calcul_des_coordonnees,FAUX)));
DEFV(Common,DEFV(Int,SINT(AFvraie_deformation_inverse_tridimensionnelle_____nombre_d_iterations_du_calcul_des_coordonnees,ZERO)));

DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____les_coordonnees_X_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____les_coordonnees_Y_sont_normalisees,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____les_coordonnees_Z_sont_normalisees,VRAI)));

DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____periodiser_X,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____periodiser_Y,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____periodiser_Z,VRAI)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(AFvraie_deformation_inverse_tridimensionnelle_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(AFvraie_deformation_inverse_tridimensionnelle_____niveau_flottant_hors_image,FZERO)));

DEFV(Common,DEFV(FonctionF,POINTERF(AFvraie_deformation_inverse_tridimensionnelle(albumR,albumA,diX,diY,diZ))))
                                        /* Fonction introduite le 20180924151028...                                                  */
                                        /*                                                                                           */
                                        /* On notera qu'elle est dite "VRAIE_deformation_inverse_tridimensionnelle" par opposition a */
                                        /* "deformation_inverse_tridimensionnelle" car cette nouvelle fonction transforme un album   */
                                        /* en un autre album, alors que l'ancienne transforme un album en image...                   */
DEFV(Argument,DEFV(albumF,albumR));
                                        /* Album Resultat, tel que : albumR[X][Y][Z]=albumA[diX[X][Y][Z],diY[X][Y][Z],diZ[X][Y][Z]]. */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(albumF,diX));
DEFV(Argument,DEFV(albumF,diY));
DEFV(Argument,DEFV(albumF,diZ));
                                        /* Definition de la deformation "Inverse" {diX,diY,diZ}.                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     begin_album_AvecEditionProgression
                                        /* La possibilite de suivre la progression a ete introduite le 20200109103959...             */
          Bblock
          COORDONNEES_NORMALISEES_DE_DEFORMATION_INVERSE;
                                        /* Coordonnees flottantes de deformation "inverse"...                                        */
          DEFV(genere_Float,INIT(niveau_courant,FLOT__NIVEAU_UNDEF));
                                        /* Donne le niveau flottant courant apres deformation "inverse"...                           */

          EGAL(niveau_courant
              ,FFAload_point_coordonnees_01(albumA
                                           ,Xf,Yf,Zf
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____periodiser_X
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____periodiser_Y
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____periodiser_Z
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____symetriser_X
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____symetriser_Y
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____symetriser_Z
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____prolonger_X
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____prolonger_Y
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____prolonger_Z
                                           ,AFvraie_deformation_inverse_tridimensionnelle_____niveau_flottant_hors_image
                                            )
               );

          AstoreF_point(niveau_courant
                       ,albumR
                       ,X,Y,Z
                        );
                                        /* Et on met a jour l'album Resultat flottant.                                               */
          Eblock
     end_album_back_AvecEditionProgression
                                        /* La possibilite de suivre la progression a ete introduite le 20200109103959...             */

     RETAF(albumR);
     Eblock

EFonctionF

#undef    COORDONNEES_NORMALISEES_DE_DEFORMATION_INVERSE

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E   D ' U N   A L B U M  :                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota important :                                                                                                           */
/*                                                                                                                                   */
/*                    Lorsqu'il n'y a aucune rotation (par rapport                                                                   */
/*                  a aucun axe), cette accumulation equivaut a une                                                                  */
/*                  projection parallele. Cela peut avoir des consequences                                                           */
/*                  inattendues lorsque le 'Z-Buffer' est ensuite utilise,                                                           */
/*                  par exemple, pour un effet de brume.                                                                             */
/*                                                                                                                                   */
/*                    Cela s'est vu aux environs du 20171107153058                                                                   */
/*                  lors du calcul de 'v $xiirf/MENG.G2.3.1', pour laquelle                                                          */
/*                  l'image associee 'v $xiirf/MENG.G2.3.2' etait uniformement                                                       */
/*                  blanche (le 'Z-Buffer' ne contenait alors que deux valeurs                                                       */
/*                  differentes : celle du fond et celle de la face avant de                                                         */
/*                  l'Eponge de Menger). Voir 'v $xiirf/$Fnota MENG_G2_3' a                                                          */
/*                  ce propos...                                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ces fonctions reconstituent une structure tridimensionnelle                                                    */
/*                  a partir d'une serie de coupes (c'est-a-dire une serie d'images)                                                 */
/*                  avec implicitement un parcours d'arriere en avant (c'est-a-dire                                                  */
/*                  que la premiere image recuperee est mise en arriere-plan et la                                                   */
/*                  derniere au premier-plan), soit :                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                           ---------------------------------------                                 */
/*                                                          |image 1                                |                                */
/*                                                        . |                                     . |                                */
/*                                                          |                                       |                                */
/*                                                      .   |                                   .   |                                */
/*                                                          |                                       |                                */
/*                                                    .     |                                 .     |                                */
/*                                                          |                                       |                                */
/*                                                  .       |                               .       |                                */
/*                                                          |                                       |                                */
/*                                                 ---------------------------------------          |                                */
/*                                                |image N-2                              |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                            ---------------------------------------     |         |                                */
/*                                           |image N-1                              |    |---------                                 */
/*                                           |                                       |    |                                          */
/*                                           |                                       |    |       .                                  */
/*                                           |                                       |    |                                          */
/*                                       ---------------------------------------     |    |     .                                    */
/*                                      |image N                                |    |    |                                          */
/*                                      |                                       |    |    |   .                                      */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |    | .                                        */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |----                                           */
/*                                      |                                       |    |                                               */
/*                                      |                                       |----                                                */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                       ---------------------------------------                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                  ('v $xci/accumule.41$K inverser_l_axe_OZ').                                                                      */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   XC                                                                                                                            \
                    EnTete_de_sauvegardM ## X
#define   YC                                                                                                                            \
                    EnTete_de_sauvegardM ## Y
#define   ZC                                                                                                                            \
                    EnTete_de_sauvegardM ## Z
                                        /* Memorisation du point courant {XC,YC,ZC} (on notera que la procedure 'begin_albumQ(...)'  */
                                        /* permet d'y acceder via '{SavM_____X,SavM_____Y,SavM_____Z}). Ceci fut introduit le        */
                                        /* 20101129214228.                                                                           */

#define   Xfc                                                                                                                           \
                    SOUS(Xf,Xft)
#define   Yfc                                                                                                                           \
                    SOUS(Yf,Yft)
#define   Zfc                                                                                                                           \
                    SOUS(Zf,Zft)
                                        /* Coordonnees "Centrees" par rapport au centre des images...                                */

#define   Xb                                                                                                                            \
                    ADD2(XC,X_effectif)
#define   Yb                                                                                                                            \
                    ADD2(YC,Y_effectif)
#define   Zb                                                                                                                            \
                    ADD2(ZC,Z_effectif)
                                        /* Coordonnees a l'interieur d'une "Boite" de calcul du gradient...                          */

                                        /* Le 20180124104526 'DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT' a ete mis dans              */
                                        /* 'v $xiii/di_album$DEF 20180124104544' afin de pouvoir etre utilises dans                  */
                                        /* 'v $xci/accumule.42$K DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT'...                       */

#define   ACCES_MATRIX_CALCUL_GRADIENT(Xc,Yc,Zc,x,y,z)                                                                                  \
                    IdTb3(matrice_de_calcul_du_gradient                                                                                 \
                         ,INDX(SOUS(x,Xc),X_gauche)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                           \
                         ,INDX(SOUS(y,Yc),Y_bas___)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                           \
                         ,INDX(SOUS(z,Zc),Z_front_)                                                                                     \
                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                           \
                          )                                                                                                             \
                                        /* Acces a l'environnement du point courant {Xc,Yc,Zc} (coordonnees transformees)...         */

#define   CALCUL_DU_NIVEAU(cumuler,niveau)                                                                                              \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(cumuler))                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(niveau_resultant,MUL2(niveau_resultant,niveau));                                                          \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Calcul du 'niveau_resultant' par cumul multiplicatif (introduit le 20091206105641).       */

#define   Xf_DU_POINT_COURANT                                                                                                           \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101127)                                            \
                        ,Xn                                                                                                             \
                        ,coordonnee_X                                                                                                   \
                         )
#define   Yf_DU_POINT_COURANT                                                                                                           \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101127)                                            \
                        ,Yn                                                                                                             \
                        ,coordonnee_Y                                                                                                   \
                         )
#define   Zf_DU_POINT_COURANT                                                                                                           \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101127)                                            \
                        ,Zn                                                                                                             \
                        ,coordonnee_Z                                                                                                   \
                         )
#define   Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                                                                          \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101127)                                            \
                        ,Zn                                                                                                             \
                        ,Zf_transformee_du_point_courant                                                                                \
                         )
                                        /* Definitions introduites le 20101122095350...                                              */
                                        /*                                                                                           */
                                        /* Le 20101127082640, a cause des transformations geometriques, il a fallu distinger deux    */
                                        /* type de coordonnees 'Z' : celle qui sert pour le 'Z-Buffer' et les autres. En effet,      */
                                        /* pour le 'Z-Buffer' il convient d'utiliser le 'Z' transforme. Ainsi des points qui ont     */
                                        /* le meme 'Z' avant transformations, ne l'ont plus apres...                                 */
                                        /*                                                                                           */
                                        /* On notera que si 'Zf_DU_POINT_COURANT' est defini inconditionnellement avec 'Zn', alors   */
                                        /* si le "dpeth-cueing" est fonction de la coordonnee 'Z', alors le "depth-cueing" est tres  */
                                        /* discret et varie en marches d'escalier...                                                 */

#define   PAS_ENCORE_DE_TEXTURE                                                                                                         \
                    FZERO
#define   PAS_DE_TEXTURE                                                                                                                \
                    FU
                                        /* Indicateur d'absence de texture (introduit le 20101126181934).                            */

#define   CHECK_COORDONNEE(relation,XYZ,XYZC,XYZf,extremum)                                                                             \
                    Bblock                                                                                                              \
                    Test(relation(XYZf`transformee_dans_la_boite,extremum`de`XYZf`transformee_dans_la_boite))                           \
                         Bblock                                                                                                         \
                         EGAL(extremum`de`XYZf`transformee_dans_la_boite,XYZf`transformee_dans_la_boite);                               \
                         EGAL(XYZ`associe_au`extremum`de`XYZf`transformee_dans_la_boite,XYZC);                                          \
                                        /* Dispositif introduit le 20101129182111 pour indiquer les coordonnees hors de [0,1]...     */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Validation de la presence d'une coordonnee dans [0,1] (introduit le 20101129212403).      */

#define   ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(valeur_initiale_du_niveau_resultant)                                               \
                                        /* L'argument 'valeur_initiale_du_niveau_resultant' a ete introduit le 20100123111742 pour   */ \
                                        /* permettre l'introduction future du texturage...                                           */ \
                    Bblock                                                                                                              \
                    BDEFV(imageF,image_niveau_courant_effectif);                                                                        \
                    DEFV(Float,INIT(minimum_de_niveau_courant_effectif,F_INFINI));                                                      \
                    DEFV(Float,INIT(maximum_de_niveau_courant_effectif,F_MOINS_L_INFINI));                                              \
                                                                                                                                        \
                    BDEFV(imageF,image_niveau_lumineux_effectif);                                                                       \
                    DEFV(Float,INIT(minimum_de_niveau_lumineux_effectif,F_INFINI));                                                     \
                    DEFV(Float,INIT(maximum_de_niveau_lumineux_effectif,F_MOINS_L_INFINI));                                             \
                                                                                                                                        \
                    BDEFV(imageF,image_coordonnee_X);                                                                                   \
                    DEFV(Float,INIT(minimum_de_coordonnee_X,F_INFINI));                                                                 \
                    DEFV(Float,INIT(maximum_de_coordonnee_X,F_MOINS_L_INFINI));                                                         \
                                                                                                                                        \
                    BDEFV(imageF,image_coordonnee_Y);                                                                                   \
                    DEFV(Float,INIT(minimum_de_coordonnee_Y,F_INFINI));                                                                 \
                    DEFV(Float,INIT(maximum_de_coordonnee_Y,F_MOINS_L_INFINI));                                                         \
                                                                                                                                        \
                    BDEFV(imageF,image_coordonnee_Z);                                                                                   \
                    DEFV(Float,INIT(minimum_de_coordonnee_Z,F_INFINI));                                                                 \
                    DEFV(Float,INIT(maximum_de_coordonnee_Z,F_MOINS_L_INFINI));                                                         \
                                        /* Images intermediaires utiles pour une renormalisation prealables des differentes          */ \
                                        /* contributions au niveau final 'niveau_resultant' (introduites le 20091211113702)...       */ \
                                        /*                                                                                           */ \
                                        /* On notera qu'evidemment ces images ne servent a rien en mode 'compatibilite_20091211',    */ \
                                        /* mais qu'il n'est pas possible de les rendre conditionnelles...                            */ \
                    BDEFV(imageF,image_texture);                                                                                        \
                                        /* Image intermediaire utile (introduite le 20100708185838) contenant le niveau              */ \
                                        /* de la texture pour lequel il n'y aura pas renormalisation via ses extrema et ce           */ \
                                        /* afin de bien garder, dans le cas des ombres, le rapport entre l'ombre et la lumiere       */ \
                                        /* (ceci fut note le 20100709071615)...                                                      */ \
                    BDEFV(imageF,image_niveau_resultant);                                                                               \
                    DEFV(Float,INIT(minimum_de_niveau_resultant,F_INFINI));                                                             \
                    DEFV(Float,INIT(maximum_de_niveau_resultant,F_MOINS_L_INFINI));                                                     \
                                        /* Image intermediaire utile (introduite le 20091203145031) contenant le niveau              */ \
                                        /* resultant avant sa renormalisation via ses extrema...                                     */ \
                                                                                                                                        \
                    DEFV(Float,INIT(minimum_de_Xf_transformee_dans_la_boite,F_INFINI));                                                 \
                    DEFV(Float,INIT(maximum_de_Xf_transformee_dans_la_boite,F_MOINS_L_INFINI));                                         \
                    DEFV(Int,INIT(X_associe_au_minimum_de_Xf_transformee_dans_la_boite,UNDEF));                                         \
                    DEFV(Int,INIT(X_associe_au_maximum_de_Xf_transformee_dans_la_boite,UNDEF));                                         \
                                                                                                                                        \
                    DEFV(Float,INIT(minimum_de_Yf_transformee_dans_la_boite,F_INFINI));                                                 \
                    DEFV(Float,INIT(maximum_de_Yf_transformee_dans_la_boite,F_MOINS_L_INFINI));                                         \
                    DEFV(Int,INIT(Y_associe_au_minimum_de_Yf_transformee_dans_la_boite,UNDEF));                                         \
                    DEFV(Int,INIT(Y_associe_au_maximum_de_Yf_transformee_dans_la_boite,UNDEF));                                         \
                                                                                                                                        \
                    DEFV(Float,INIT(minimum_de_Zf_transformee_dans_la_boite,F_INFINI));                                                 \
                    DEFV(Float,INIT(maximum_de_Zf_transformee_dans_la_boite,F_MOINS_L_INFINI));                                         \
                    DEFV(Int,INIT(Z_associe_au_minimum_de_Zf_transformee_dans_la_boite,UNDEF));                                         \
                    DEFV(Int,INIT(Z_associe_au_maximum_de_Zf_transformee_dans_la_boite,UNDEF));                                         \
                                        /* Variables introduites le 20101129185813 afin de detecter les risques de trous dans la     */ \
                                        /* structure visualisee...                                                                   */ \
                                                                                                                                        \
                    DEFV(Float,INIT(Xft,FLOT__UNDEF));                                                                                  \
                    DEFV(Float,INIT(Yft,FLOT__UNDEF));                                                                                  \
                    DEFV(Float,INIT(Zft,FLOT__UNDEF));                                                                                  \
                                        /* Afin de pouvoir centrer les transformations geometriques (introduit le 20091205113618).   */ \
                                                                                                                                        \
                                        /* On notera que le 20091205092945, j'avais mis en place :                                   */ \
                                        /*                                                                                           */ \
                                        /*                  SAUVEGARDE_DE_LA_SUPER_ECHELLE;                                          */ \
                                        /*                  SUPER_ECHELLE_PETIT_CARRE;                                               */ \
                                        /*                                                                                           */ \
                                        /* mais que cela changeait les proportions de l'objet (contraction horizontale), alors       */ \
                                        /* que 'SUPER_ECHELLE_GRAND_CARRE' creait un probleme similaire, mais dans une direction     */ \
                                        /* orthogonale (dilatation verticale). J'ai donc du renoncer...                              */ \
                                                                                                                                        \
                    EGAL(Xft,f____cNORMALISE_OX(Xcentre));                                                                              \
                    EGAL(Yft,f____cNORMALISE_OY(Ycentre));                                                                              \
                    EGAL(Zft,f____cNORMALISE_OZ(Zcentre));                                                                              \
                                        /* Afin de pouvoir centrer les transformations geometriques...                               */ \
                                                                                                                                        \
                    CALS(IFinitialisation(image_niveau_courant_effectif,FLOT__NOIR));                                                   \
                    CALS(IFinitialisation(image_niveau_lumineux_effectif,FLOT__NOIR));                                                  \
                    CALS(IFinitialisation(image_coordonnee_X,COORDONNEE_BARYCENTRIQUE_MINIMALE));                                       \
                    CALS(IFinitialisation(image_coordonnee_Y,COORDONNEE_BARYCENTRIQUE_MINIMALE));                                       \
                    CALS(IFinitialisation(image_coordonnee_Z,COORDONNEE_BARYCENTRIQUE_MINIMALE));                                       \
                    CALS(IFinitialisation(image_texture,PAS_ENCORE_DE_TEXTURE));                                                        \
                    CALS(IFinitialisation(image_niveau_resultant,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_image));     \
                                        /* Initialisation des images intermediaires utiles...                                        */ \
                                                                                                                                        \
                    begin_album_back_AvecEditionProgression                                                                             \
                                        /* Le 20100120131636 fut introduit une optimisation consistant a parcourir l'axe 'Z'         */ \
                                        /* des grandes valeurs vers les petites valeurs afin de favoriser un peu plus loin le        */ \
                                        /* test relatif a 'le_point_courant_est_actuellement_visible'...                             */ \
                                        /*                                                                                           */ \
                                        /* Le 20170520104034 a ete introduit "_AvecEditionProgression"...                            */ \
                         Bblock                                                                                                         \
                         DEFV(Logical,INIT(le_point_courant_est_actuellement_visible,VRAI));                                            \
                                        /* Indicateur destine a accelerer le processus (introduit le 20100120131636). La valeur      */ \
                                        /* par defaut 'VRAI' est choisie afin d'etre en phase avec 'compatibilite_20100120'          */ \
                                        /* lorsque cette derniere est demandee...                                                    */ \
                                                                                                                                        \
                         DEFV(Int,INIT(X_courant,X));                                                                                   \
                         DEFV(Int,INIT(Y_courant,Y));                                                                                   \
                         DEFV(Int,INIT(Z_courant,Z));                                                                                   \
                                        /* Coordonnees {X,Y,Z} denormalisees en vue d'une eventuelle edition (introduites le         */ \
                                        /* 20210424174413...).                                                                       */ \
                                                                                                                                        \
                         DEFV(Float,INIT(Xn,f____cNORMALISE_OX(X)));                                                                    \
                         DEFV(Float,INIT(Yn,f____cNORMALISE_OY(Y)));                                                                    \
                         DEFV(Float,INIT(Zn,f____cNORMALISE_OZ(Z)));                                                                    \
                                        /* Coordonnees {X,Y,Z} normalisees...                                                        */ \
                         DEFV(Float,INIT(Xf_transformee_du_point_courant,FLOT__UNDEF));                                                 \
                         DEFV(Float,INIT(Yf_transformee_du_point_courant,FLOT__UNDEF));                                                 \
                         DEFV(Float,INIT(Zf_transformee_du_point_courant,FLOT__UNDEF));                                                 \
                                        /* Coordonnees {X,Y,Z} transformees geometriquement...                                       */ \
                         DEFV(genere_Float,INIT(niveau_courant,FLOT__UNDEF));                                                           \
                                        /* Niveau courant au point {X,Y,Z} normalisees...                                            */ \
                         DEFV(genere_Float,INIT(niveau_lumineux,FZERO));                                                                \
                                        /* Niveau lumineux au point {X,Y,Z} normalisees (la valeur par defaut correspond au          */ \
                                        /* au cas ou la scene n'est pas eclairee...).                                                */ \
                                                                                                                                        \
                         DEFV(Float,DdTb3(POINTERf                                                                                      \
                                         ,matrice_de_calcul_du_gradient                                                                 \
                                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                           \
                                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                           \
                                         ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                           \
                                         ,ADRESSE_NON_ENCORE_DEFINIE                                                                    \
                                          )                                                                                             \
                              );                                                                                                        \
                                        /* Definition de la matrice des distances.                                                   */ \
                                                                                                                                        \
                         DEFV(Int,INIT(X_gauche                                                                                         \
                                      ,NEGA(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_X)) \
                                       )                                                                                                \
                              );                                                                                                        \
                         DEFV(Int,INIT(X_centre,UNDEF));                                                                                \
                         DEFV(Int,INIT(X_droite                                                                                         \
                                      ,NEUT(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_X)) \
                                       )                                                                                                \
                              );                                                                                                        \
                                        /* Points interessants de l'axe 'OX'.                                                        */ \
                         DEFV(Int,INIT(Y_bas___                                                                                         \
                                      ,NEGA(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_Y)) \
                                       )                                                                                                \
                              );                                                                                                        \
                         DEFV(Int,INIT(Y_centre,UNDEF));                                                                                \
                         DEFV(Int,INIT(Y_haut__                                                                                         \
                                      ,NEUT(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_Y)) \
                                       )                                                                                                \
                              );                                                                                                        \
                                        /* Points interessants de l'axe 'OY'.                                                        */ \
                         DEFV(Int,INIT(Z_front_                                                                                         \
                                      ,NEGA(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_Z)) \
                                       )                                                                                                \
                              );                                                                                                        \
                         DEFV(Int,INIT(Z_centre,UNDEF));                                                                                \
                         DEFV(Int,INIT(Z_back__                                                                                         \
                                      ,NEUT(DEMI_DIMENSION(NomDeLaFonctionCourante QD@@__ _____demi_dimension_de_calcul_du_gradient_Z)) \
                                       )                                                                                                \
                              );                                                                                                        \
                                        /* Points interessants de l'axe 'OZ'.                                                        */ \
                                                                                                                                        \
                         EGAL(X_centre,MOYE(X_gauche,X_droite));                                                                        \
                         EGAL(Y_centre,MOYE(Y_bas___,Y_haut__));                                                                        \
                         EGAL(Z_centre,MOYE(Z_front_,Z_back__));                                                                        \
                                        /* Calcul des centres relatifs aux axes 'OX', 'OY' et 'OZ'.                                  */ \
                                                                                                                                        \
                         MdTb3(matrice_de_calcul_du_gradient                                                                            \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                      \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                      \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                      \
                              ,Float                                                                                                    \
                              ,ADRESSE_NON_ENCORE_DEFINIE                                                                               \
                               );                                                                                                       \
                                        /* Allocation de la matrice des distances.                                                   */ \
                                                                                                                                        \
                         Test(I3OU(IZNE(X_centre),IZNE(Y_centre),IZNE(Z_centre)))                                                       \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("le centre 'relatif' de la boite de calcul du gradient doit etre {0,0,0}");                  \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         begin_albumQ(DoIn,Z_front_,Z_back__,PasZ                                                                       \
                                     ,DoIn,Y_bas___,Y_haut__,PasY                                                                       \
                                     ,DoIn,X_gauche,X_droite,PasX                                                                       \
                                      )                                                                                                 \
                              Bblock                                                                                                    \
                              Test(EST_VRAI(le_point_courant_est_actuellement_visible))                                                 \
                                        /* Optimisation introduite le 20100121122207. Elle a permis de diviser le temps de calcul    */ \
                                        /* par 5 ! On notera que cela marche si bien parce que ce qui est fait apres permet de       */ \
                                        /* balayer 'matrice_de_calcul_du_gradient' en partant du centre qui correspond evidemment    */ \
                                        /* au point que l'on veut visualiser et s'il est nul, il n'y a rien a faire...               */ \
                                   Bblock                                                                                               \
                                   DEFV(Int,INIT(X_effectif,MODS(ADD2(X,SOUS(X_centre,X_gauche)),X_gauche,X_droite)));                  \
                                   DEFV(Int,INIT(Y_effectif,MODS(ADD2(Y,SOUS(Y_centre,Y_bas___)),Y_bas___,Y_haut__)));                  \
                                   DEFV(Int,INIT(Z_effectif,MODS(ADD2(Z,SOUS(Z_centre,Z_front_)),Z_front_,Z_back__)));                  \
                                        /* Introduit le 20100121115724 afin de pouvoir modifier l'ordre de parcours des points       */ \
                                        /* de 'matrice_de_calcul_du_gradient'. Cela a ete fait le 20100121121428, c'est le point     */ \
                                        /* {X_centre,Y_centre,Z_centre} qui sera accede en premier...                                */ \
                                                                                                                                        \
                                   DEFV(Float,INIT(Xf,FLOT__UNDEF));                                                                    \
                                   DEFV(Float,INIT(Yf,FLOT__UNDEF));                                                                    \
                                   DEFV(Float,INIT(Zf,FLOT__UNDEF));                                                                    \
                                        /* Coordonnees {X,Y,Z} normalisees et translatees...                                         */ \
                                   DEFV(Float,INIT(Xf_transformee_dans_la_boite,FLOT__UNDEF));                                          \
                                   DEFV(Float,INIT(Yf_transformee_dans_la_boite,FLOT__UNDEF));                                          \
                                   DEFV(Float,INIT(Zf_transformee_dans_la_boite,FLOT__UNDEF));                                          \
                                        /* Coordonnees {X,Y,Z} transformees geometriquement...                                       */ \
                                                                                                                                        \
                                   EGAL(Xf,f____cNORMALISE_OX(Xb));                                                                     \
                                   EGAL(Yf,f____cNORMALISE_OY(Yb));                                                                     \
                                   EGAL(Zf,f____cNORMALISE_OZ(Zb));                                                                     \
                                        /* Coordonnees {X,Y,Z} normalisees et translatees...                                         */ \
                                                                                                                                        \
                                   EGAL(Xf_transformee_dans_la_boite                                                                    \
                                       ,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Xfc,Yfc,Zfc                                                    \
                                                                        ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OX,Xft)   \
                                                                         )                                                              \
                                        );                                                                                              \
                                   EGAL(Yf_transformee_dans_la_boite                                                                    \
                                       ,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Xfc,Yfc,Zfc                                                    \
                                                                        ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OY,Yft)   \
                                                                         )                                                              \
                                        );                                                                                              \
                                   EGAL(Zf_transformee_dans_la_boite                                                                    \
                                       ,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Xfc,Yfc,Zfc                                                    \
                                                                        ,ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OZ,Zft)   \
                                                                         )                                                              \
                                        );                                                                                              \
                                        /* Transformation geometrique tridimensionnelle des coordonnees {X,Y,Z}...                   */ \
                                                                                                                                        \
                                   CHECK_COORDONNEE(IFLT,X,XC,Xf,minimum);                                                              \
                                   CHECK_COORDONNEE(IFGT,X,XC,Xf,maximum);                                                              \
                                   CHECK_COORDONNEE(IFLT,Y,YC,Yf,minimum);                                                              \
                                   CHECK_COORDONNEE(IFGT,Y,YC,Yf,maximum);                                                              \
                                   CHECK_COORDONNEE(IFLT,Z,ZC,Zf,minimum);                                                              \
                                   CHECK_COORDONNEE(IFGT,Z,ZC,Zf,maximum);                                                              \
                                        /* Dispositif introduit le 20101129182111 pour indiquer les coordonnees hors de [0,1]...     */ \
                                                                                                                                        \
                                   ACCES_A_UN_POINT_DE_L_ALBUM(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                  \
                                                                                           ,X_effectif,Y_effectif,Z_effectif            \
                                                                                            )                                           \
                                                              ,Xf_transformee_dans_la_boite                                             \
                                                              ,Yf_transformee_dans_la_boite                                             \
                                                              ,Zf_transformee_dans_la_boite                                             \
                                                               );                                                                       \
                                        /* Des experiences faites le 20100120175014 en remplacant 'ACCES_A_UN_POINT_DE_L_ALBUM(...)' */ \
                                        /* par 'FZERO' montrent que la sequence courante {begin_albumQ,end_albumQ} compte pour       */ \
                                        /* 89% du temps d'execution de 'ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM'. C'est donc      */ \
                                        /* ici qu'il faut agir pour accelerer le processus...                                        */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : je rappelle ici le 20101129163235 que si les coordonnees {Xf,Yf,Zf}           */ \
                                        /* transformees geometriquement ci-dessus sont hors de [0,1]x[0,1]x[0,1], alors              */ \
                                        /* 'ACCES_A_UN_POINT_DE_L_ALBUM(...)' renvoie le niveau "hors image"...                      */ \
                                                                                                                                        \
                                        /* Le 20120321113814 des experiences ont ete faites afin de comprendre les defauts lors      */ \
                                        /* de rotations, par exemple de '_____RotationX=0.3' pour 'v $xiirf/FRA3.Z2.02.2'. Pour      */ \
                                        /* cela l'album a deux couches suivant a ete genere :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Suh                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/init$X         n=$NOIR                                           \  */ \
                                        /*                                      R=$xTG/ALBUM.0001                                 \  */ \
                                        /*                                                                    $formatI               */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/gauss$X        c=8                                               \  */ \
                                        /*                                                                    $formatI      |     \  */ \
                                        /*                  $xci/passe_bande$X  inf=220 sup=225                                   \  */ \
                                        /*                                                                    $formatI      |     \  */ \
                                        /*                  $xci/seuil$X                                                          \  */ \
                                        /*                                      R=$xTG/ALBUM.0002                                 \  */ \
                                        /*                                                                    $formatI               */ \
                                        /*                                                                                           */ \
                                        /* qui a pris place dans 'xlistN Debut_listG_FRA3_Z2_02 Fin_listG_FRA3_Z2_02 ...' a la       */ \
                                        /* place du generateur d'album utile.                                                        */ \
                                        /*                                                                                           */ \
                                        /* Les editions suivantes ont ete obtenues avec '_____DxDyDz=0' et '_____RotationX=0.3' :    */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*    XC YC ZC     Xfc    Yfc    Zfc       Xf_tr  Yf_tr  Zf_tr   MAT     X  Y  Zf_ZBu  niv   */ \
                                        /*                                                                                           */ \
                                        /*   {29,24,1} -> {-0.046,-0.125,+0.0} -> {+0.453,+0.380,+0.463}=510 -> {29,24,+0.463}=510   */ \
                                        /*   {30,24,1} -> {-0.031,-0.125,+0.0} -> {+0.468,+0.380,+0.463}=510 -> {30,24,+0.463}=510   */ \
                                        /*   {31,24,1} -> {-0.015,-0.125,+0.0} -> {+0.484,+0.380,+0.463}=510 -> {31,24,+0.463}=510   */ \
                                        /*   {32,24,1} -> {+0.000,-0.125,+0.0} -> {+0.500,+0.380,+0.463}=510 -> {32,24,+0.463}=510   */ \
                                        /*   {33,24,1} -> {+0.015,-0.125,+0.0} -> {+0.515,+0.380,+0.463}=510 -> {33,24,+0.463}=510   */ \
                                        /*   {34,24,1} -> {+0.031,-0.125,+0.0} -> {+0.531,+0.380,+0.463}=510 -> {34,24,+0.463}=510   */ \
                                        /*   {35,24,1} -> {+0.046,-0.125,+0.0} -> {+0.546,+0.380,+0.463}=510 -> {35,24,+0.463}=510   */ \
                                        /*   {27,25,1} -> {-0.078,-0.109,+0.0} -> {+0.421,+0.395,+0.467}=510 -> {27,25,+0.467}=510   */ \
                                        /*   {28,25,1} -> {-0.062,-0.109,+0.0} -> {+0.437,+0.395,+0.467}=510 -> {28,25,+0.467}=510   */ \
                                        /*   {36,25,1} -> {+0.062,-0.109,+0.0} -> {+0.562,+0.395,+0.467}=510 -> {36,25,+0.467}=510   */ \
                                        /*   {37,25,1} -> {+0.078,-0.109,+0.0} -> {+0.578,+0.395,+0.467}=510 -> {37,25,+0.467}=510   */ \
                                        /*   {26,26,1} -> {-0.093,-0.093,+0.0} -> {+0.406,+0.410,+0.472}=510 -> {26,26,+0.472}=510   */ \
                                        /*   {38,26,1} -> {+0.093,-0.093,+0.0} -> {+0.593,+0.410,+0.472}=510 -> {38,26,+0.472}=510   */ \
                                        /*   {25,27,1} -> {-0.109,-0.078,+0.0} -> {+0.390,+0.425,+0.476}=510 -> {25,27,+0.476}=510   */ \
                                        /*   {39,27,1} -> {+0.109,-0.078,+0.0} -> {+0.609,+0.425,+0.476}=510 -> {39,27,+0.476}=510   */ \
                                        /*   {25,28,1} -> {-0.109,-0.062,+0.0} -> {+0.390,+0.440,+0.481}=510 -> {25,28,+0.481}=510   */ \
                                        /*   {39,28,1} -> {+0.109,-0.062,+0.0} -> {+0.609,+0.440,+0.481}=510 -> {39,28,+0.481}=510   */ \
                                        /*   {24,29,1} -> {-0.125,-0.046,+0.0} -> {+0.375,+0.455,+0.486}=510 -> {24,29,+0.486}=510   */ \
                                        /*   {40,29,1} -> {+0.125,-0.046,+0.0} -> {+0.625,+0.455,+0.486}=510 -> {40,29,+0.486}=510   */ \
                                        /*   {24,30,1} -> {-0.125,-0.031,+0.0} -> {+0.375,+0.470,+0.490}=510 -> {24,30,+0.490}=510   */ \
                                        /*   {40,30,1} -> {+0.125,-0.031,+0.0} -> {+0.625,+0.470,+0.490}=510 -> {40,30,+0.490}=510   */ \
                                        /*   {24,31,1} -> {-0.125,-0.015,+0.0} -> {+0.375,+0.485,+0.495}=510 -> {24,31,+0.495}=510   */ \
                                        /*   {40,31,1} -> {+0.125,-0.015,+0.0} -> {+0.625,+0.485,+0.495}=510 -> {40,31,+0.495}=510   */ \
                                        /*                                                                                           */ \
                                        /*   {25,28,0} -> {-0.109,-0.062,-0.5} -> {+0.390,+0.588,+0.003}=510                         */ \
                                        /*   {39,28,0} -> {+0.109,-0.062,-0.5} -> {+0.609,+0.588,+0.003}=510                         */ \
                                        /*   {26,29,0} -> {-0.093,-0.046,-0.5} -> {+0.406,+0.602,+0.008}=510 -> {26,29,+0.008}=510   */ \
                                        /*   {38,29,0} -> {+0.093,-0.046,-0.5} -> {+0.593,+0.602,+0.008}=510 -> {38,29,+0.008}=510   */ \
                                        /*   {27,30,0} -> {-0.078,-0.031,-0.5} -> {+0.421,+0.617,+0.013}=510 -> {27,30,+0.013}=510   */ \
                                        /*   {28,30,0} -> {-0.062,-0.031,-0.5} -> {+0.437,+0.617,+0.013}=510 -> {28,30,+0.013}=510   */ \
                                        /*   {36,30,0} -> {+0.062,-0.031,-0.5} -> {+0.562,+0.617,+0.013}=510 -> {36,30,+0.013}=510   */ \
                                        /*   {37,30,0} -> {+0.078,-0.031,-0.5} -> {+0.578,+0.617,+0.013}=510 -> {37,30,+0.013}=510   */ \
                                        /*   {29,31,0} -> {-0.046,-0.015,-0.5} -> {+0.453,+0.632,+0.017}=510 -> {29,31,+0.017}=510   */ \
                                        /*   {30,31,0} -> {-0.031,-0.015,-0.5} -> {+0.468,+0.632,+0.017}=510 -> {30,31,+0.017}=510   */ \
                                        /*   {31,31,0} -> {-0.015,-0.015,-0.5} -> {+0.484,+0.632,+0.017}=510 -> {31,31,+0.017}=510   */ \
                                        /*   {32,31,0} -> {+0.000,-0.015,-0.5} -> {+0.500,+0.632,+0.017}=510 -> {32,31,+0.017}=510   */ \
                                        /*   {33,31,0} -> {+0.015,-0.015,-0.5} -> {+0.515,+0.632,+0.017}=510 -> {33,31,+0.017}=510   */ \
                                        /*   {34,31,0} -> {+0.031,-0.015,-0.5} -> {+0.531,+0.632,+0.017}=510 -> {34,31,+0.017}=510   */ \
                                        /*   {35,31,0} -> {+0.046,-0.015,-0.5} -> {+0.546,+0.632,+0.017}=510 -> {35,31,+0.017}=510   */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* ou {Xf_tr,Yf_tr,Zf_tr} designent respectivement {Xf_transformee_dans_la_boite             */ \
                                        /* ,Yf_transformee_dans_la_boite,Zf_transformee_dans_la_boite}. Quant a 'MAT' il             */ \
                                        /* designe le 'ACCES_MATRIX_CALCUL_GRADIENT(...)' precedent. Enfin 'Zf_ZBu' et 'niv'         */ \
                                        /* designent 'Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER' et 'niveau_courant_effectif' lorsque     */ \
                                        /* les matrices du type 'niveau_courant_effectif' sont generees plus loin...                 */ \
                                        /*                                                                                           */ \
                                        /* On observe ainsi qu'une grosse moitie de l'anneau est generee avec 'ZC=1' et une petite   */ \
                                        /* moitie avec 'ZC=0'. C'est cela qui provoque cette "cassure" que l'on observe. Elle vient  */ \
                                        /* donc du fait que l'on ne dispose que de deux plans verticaux 'Z', alors que l'anneau      */ \
                                        /* tourne autour de l'axe 'OX' : il est donc logique que l'anneau soit coupe en deux, une    */ \
                                        /* partie dans un plan et l'autre partie dans l'autre plan, meme si 'Zf_ZBu' varie           */ \
                                        /* correctement lors de cette rotation.                                                      */ \
                                        /*                                                                                           */ \
                                        /* Je note le 20120322144054 que le vrai probleme est en fait la grande difference entre     */ \
                                        /* {dimX,dimY} d'un cote et 'dimZ' de l'autre. La solution est donc peut-etre d'etendre      */ \
                                        /* 'dimZ', d'ou peut-etre la solution 'v $xiii/files$DEF 20120322074924' qui permet          */ \
                                        /* d'etendre l'axe 'OZ' artificiellement (les pages absentes sont initialisees malgre        */ \
                                        /* tout en memoire...).                                                                      */ \
                                        /*                                                                                           */ \
                                        /* Le 20120323133857 apres l'introduction de 'v $xiipf/fonction.3$FON 20120323072315'        */ \
                                        /* je note dans la meme experience que ci-dessus (mais en 'Std') avec :                      */ \
                                        /*                                                                                           */ \
                                        /*                  $_____InterpolerA=FAUX                                                   */ \
                                        /*                  $_____Dx=0                                                               */ \
                                        /*                  $_____Dy=0                                                               */ \
                                        /*                  $_____Dz=0                                                               */ \
                                        /*                  cZmin=0.40 cZmax=0.60 lZmin=0.40 lZmax=0.60                              */ \
                                        /*                                                                                           */ \
                                        /* par exemple :                                                                             */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*    XC YC ZC       Xfc       Yfc       Zfc       Xf_tr     Yf_tr     Zf_tr      MAT        */ \
                                        /*                                                                                           */ \
                                        /*   {255,184,1} -> {-0.001953,-0.140625,+0.0} -> {+0.498047,+0.365656,+0.458442}=510 ----   */ \
                                        /*   {255,185,1} -> {-0.001953,-0.138672,+0.0} -> {+0.498047,+0.367522,+0.459020}=510     |  */ \
                                        /*   {255,186,1} -> {-0.001953,-0.136719,+0.0} -> {+0.498047,+0.369388,+0.459597}=510     |  */ \
                                        /*   {255,187,1} -> {-0.001953,-0.134766,+0.0} -> {+0.498047,+0.371253,+0.460174}=510     |  */ \
                                        /*   {255,188,1} -> {-0.001953,-0.132812,+0.0} -> {+0.498047,+0.373119,+0.460751}=510     |  */ \
                                        /*   {255,189,1} -> {-0.001953,-0.130859,+0.0} -> {+0.498047,+0.374985,+0.461328}=510     |  */ \
                                        /*   {255,190,1} -> {-0.001953,-0.128906,+0.0} -> {+0.498047,+0.376851,+0.461906}=510     |  */ \
                                        /*   {255,191,1} -> {-0.001953,-0.126953,+0.0} -> {+0.498047,+0.378717,+0.462483}=510     |  */ \
                                        /*                                                                                        |  */ \
                                        /*   {255,168,0} -> {-0.001953,-0.171875,-0.1} -> {+0.498047,+0.365354,+0.353674}=510 --- |  */ \
                                        /*   {255,169,0} -> {-0.001953,-0.169922,-0.1} -> {+0.498047,+0.367219,+0.354251}=510    ||  */ \
                                        /*   {255,170,0} -> {-0.001953,-0.167969,-0.1} -> {+0.498047,+0.369085,+0.354828}=510    ||  */ \
                                        /*   {255,171,0} -> {-0.001953,-0.166016,-0.1} -> {+0.498047,+0.370951,+0.355405}=510    ||  */ \
                                        /*   {255,172,0} -> {-0.001953,-0.164062,-0.1} -> {+0.498047,+0.372817,+0.355983}=510    ||  */ \
                                        /*   {255,173,0} -> {-0.001953,-0.162109,-0.1} -> {+0.498047,+0.374683,+0.356560}=510    ||  */ \
                                        /*   {255,174,0} -> {-0.001953,-0.160156,-0.1} -> {+0.498047,+0.376549,+0.357137}=510    ||  */ \
                                        /*   {255,175,0} -> {-0.001953,-0.158203,-0.1} -> {+0.498047,+0.378415,+0.357714}=510    ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*   {255,307,0} -> {-0.001953,+0.099609,-0.1} -> {+0.498047,+0.624712,+0.433903}=510    ||  */ \
                                        /*   {255,308,0} -> {-0.001953,+0.101562,-0.1} -> {+0.498047,+0.626578,+0.434480}=510    ||  */ \
                                        /*   {255,309,0} -> {-0.001953,+0.103516,-0.1} -> {+0.498047,+0.628444,+0.435057}=510    ||  */ \
                                        /*   {255,310,0} -> {-0.001953,+0.105469,-0.1} -> {+0.498047,+0.630310,+0.435634}=510    ||  */ \
                                        /*   {255,311,0} -> {-0.001953,+0.107422,-0.1} -> {+0.498047,+0.632176,+0.436212}=510    ||  */ \
                                        /*   {255,312,0} -> {-0.001953,+0.109375,-0.1} -> {+0.498047,+0.634042,+0.436789}=510    ||  */ \
                                        /*   {255,313,0} -> {-0.001953,+0.111328,-0.1} -> {+0.498047,+0.635908,+0.437366}=510    ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                                                                       ||  */ \
                                        /* Or une seule couche ('$xTG/ALBUM.0002') contient des points '$BLANC's. Il est donc    ||  */ \
                                        /* evident que dans la liste ci-dessus un meme point de l'album sert deux fois pour      ||  */ \
                                        /* des coordonnnees tres differentes. Ainsi, tres certainement, par exemple :            ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                       ------ {+0.498047,+0.365354,+0.353674} <-------- |  */ \
                                        /*                                      |                                                 |  */ \
                                        /*                  {255,184,1} <-------|                                                 |  */ \
                                        /*                           |          |                                                 |  */ \
                                        /*                           |           ------ {+0.498047,+0.365656,+0.458442} <---------   */ \
                                        /*                           |                                                               */ \
                                        /*                            --------> $xTG/ALBUM.0002 (='$BLANC')                          */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Le deuxieme ensemble ci-dessus (de {255,168,0} a {255,175,0}) semble donc etre "en trop", */ \
                                        /* mais il semble difficile d'eviter cela...                                                 */ \
                                        /*                                                                                           */ \
                                        /* Cela fut confirme le 20120326164254 grace a l'album suivant :                             */ \
                                        /*                                                                                           */ \
                                        /*                  Std                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/init$X         n=$NOIR                                           \  */ \
                                        /*                                      R=$xTG/ALBUM.0001                                 \  */ \
                                        /*                                                                    $formatI               */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/transpose$X    A=$xiio/MIRE                                      \  */ \
                                        /*                                      R=$xTG/MIRE                                       \  */ \
                                        /*                                                                    $formatI               */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/gauss$X        c=8                                               \  */ \
                                        /*                                                                    $formatI      |     \  */ \
                                        /*                  $xci/passe_bande$X  inf=220 sup=225                                   \  */ \
                                        /*                                                                    $formatI      |     \  */ \
                                        /*                  $xci/seuil$X                                                          \  */ \
                                        /*                                                                    $formatI      |     \  */ \
                                        /*                  $xci/multi_02.01$X                                                    \  */ \
                                        /*                                      A1=$xTG/MIRE                                      \  */ \
                                        /*                                      R=$xTG/ALBUM.0002                                 \  */ \
                                        /*                                                                    $formatI               */ \
                                        /*                                                                                           */ \
                                        /* ou les points de '$xTG/ALBUM.0002' ont leur coordonnee 'Y' codee en couleurs via la       */ \
                                        /* mire de barres horizontales. Avec les parametres suivants (les memes que ci-dessus) :     */ \
                                        /*                                                                                           */ \
                                        /*                  $_____InterpolerA=FAUX                                                   */ \
                                        /*                  $_____Dx=0                                                               */ \
                                        /*                  $_____Dy=0                                                               */ \
                                        /*                  $_____Dz=0                                                               */ \
                                        /*                  cZmin=0.40 cZmax=0.60 lZmin=0.40 lZmax=0.60                              */ \
                                        /*                                                                                           */ \
                                        /* cela donne, par exemple :                                                                 */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*    XC YC ZC       Xfc       Yfc       Zfc       Xf_tr     Yf_tr     Zf_tr      MAT        */ \
                                        /*                                                                                           */ \
                                        /*   {255,184,1} -> {-0.001953,-0.140625,+0.0} -> {+0.498047,+0.365656,+0.458442}=292 ----   */ \
                                        /*   {255,185,1} -> {-0.001953,-0.138672,+0.0} -> {+0.498047,+0.367522,+0.459020}=296     |  */ \
                                        /*   {255,186,1} -> {-0.001953,-0.136719,+0.0} -> {+0.498047,+0.369388,+0.459597}=296     |  */ \
                                        /*   {255,187,1} -> {-0.001953,-0.134766,+0.0} -> {+0.498047,+0.371253,+0.460174}=300     |  */ \
                                        /*   {255,188,1} -> {-0.001953,-0.132812,+0.0} -> {+0.498047,+0.373119,+0.460751}=300     |  */ \
                                        /*   {255,189,1} -> {-0.001953,-0.130859,+0.0} -> {+0.498047,+0.374985,+0.461328}=300     |  */ \
                                        /*   {255,190,1} -> {-0.001953,-0.128906,+0.0} -> {+0.498047,+0.376851,+0.461906}=302     |  */ \
                                        /*   {255,191,1} -> {-0.001953,-0.126953,+0.0} -> {+0.498047,+0.378717,+0.462483}=302     |  */ \
                                        /*   {255,168,0} -> {-0.001953,-0.171875,-0.1} -> {+0.498047,+0.365354,+0.353674}=292 --- |  */ \
                                        /*   {255,169,0} -> {-0.001953,-0.169922,-0.1} -> {+0.498047,+0.367219,+0.354251}=296    ||  */ \
                                        /*   {255,170,0} -> {-0.001953,-0.167969,-0.1} -> {+0.498047,+0.369085,+0.354828}=296    ||  */ \
                                        /*   {255,171,0} -> {-0.001953,-0.166016,-0.1} -> {+0.498047,+0.370951,+0.355405}=296    ||  */ \
                                        /*   {255,172,0} -> {-0.001953,-0.164062,-0.1} -> {+0.498047,+0.372817,+0.355983}=300    ||  */ \
                                        /*   {255,173,0} -> {-0.001953,-0.162109,-0.1} -> {+0.498047,+0.374683,+0.356560}=300    ||  */ \
                                        /*   {255,174,0} -> {-0.001953,-0.160156,-0.1} -> {+0.498047,+0.376549,+0.357137}=302    ||  */ \
                                        /*   {255,175,0} -> {-0.001953,-0.158203,-0.1} -> {+0.498047,+0.378415,+0.357714}=302    ||  */ \
                                        /*   {255,307,0} -> {-0.001953,+0.099609,-0.1} -> {+0.498047,+0.624712,+0.433903}=500    ||  */ \
                                        /*   {255,308,0} -> {-0.001953,+0.101562,-0.1} -> {+0.498047,+0.626578,+0.434480}=504    ||  */ \
                                        /*   {255,309,0} -> {-0.001953,+0.103516,-0.1} -> {+0.498047,+0.628444,+0.435057}=504    ||  */ \
                                        /*   {255,310,0} -> {-0.001953,+0.105469,-0.1} -> {+0.498047,+0.630310,+0.435634}=506    ||  */ \
                                        /*   {255,311,0} -> {-0.001953,+0.107422,-0.1} -> {+0.498047,+0.632176,+0.436212}=506    ||  */ \
                                        /*   {255,312,0} -> {-0.001953,+0.109375,-0.1} -> {+0.498047,+0.634042,+0.436789}=510    ||  */ \
                                        /*   {255,313,0} -> {-0.001953,+0.111328,-0.1} -> {+0.498047,+0.635908,+0.437366}=510    ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                                                                       ||  */ \
                                        /* qui confirme donc :                                                                   ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                                                                       ||  */ \
                                        /*                                       ------ {+0.498047,+0.365354,+0.353674} <-------- |  */ \
                                        /*                                      |                                                 |  */ \
                                        /*                  {255,184,1} <-------|                                                 |  */ \
                                        /*                           |          |                                                 |  */ \
                                        /*                           |           ------ {+0.498047,+0.365656,+0.458442} <---------   */ \
                                        /*                           |                                                               */ \
                                        /*                            --------> $xTG/ALBUM.0002 (='$BLANC')                          */ \
                                        /*                                                                                           */ \
                                        /* (voir les images 'v $xiirf/FRB3.22.02' et 'v $xiirf/FRB3.22.02$ROUGE p=$xiP/cercle.35'    */ \
                                        /* a ce propos).                                                                             */ \
                                        /*                                                                                           */ \
                                        /* Il semble donc qu'il n'y ait pas de solution a ce probleme de "double emploi"...          */ \
                                                                                                                                        \
                                   Test(OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101125)                        \
                                            ,IZEQ_a_peu_pres                                                                            \
                                            ,IFLT                                                                                       \
                                            ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                                    \
                                                                         ,X_effectif,Y_effectif,Z_effectif                              \
                                                                          )                                                             \
                                            ,mgEPSILON                                                                                  \
                                             )                                                                                          \
                                        )                                                                                               \
                                        /* Ce test fut corrige le 20101125125328 car, en effet, il semble que 'IZEQ_a_peu_pres(...)' */ \
                                        /* n'etait pas approprie...                                                                  */ \
                                        Bblock                                                                                          \
                                        EGAL(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                                    \
                                                                         ,X_effectif,Y_effectif,Z_effectif                              \
                                                                          )                                                             \
                                            ,FZERO                                                                                      \
                                             );                                                                                         \
                                        /* En effet, meme en partant de quantites positives, et a cause des interpolations,          */ \
                                        /* des quantites negatives peuvent apparaitre. Cela est corrige ici...                       */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211))                            \
                                        /* Test introduit le 20091211220621...                                                       */ \
                                        Bblock                                                                                          \
                                        Test(IZLT(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                               \
                                                                              ,X_effectif,Y_effectif,Z_effectif                         \
                                                                               )                                                        \
                                                  )                                                                                     \
                                             )                                                                                          \
                                             Bblock                                                                                     \
                                             PRINT_ERREUR("un niveau negatif est incompatible avec le calcul du niveau resultant");     \
                                             CAL1(Prer4("niveau(%d,%d,%d) = %g\n"                                                       \
                                                       ,X_effectif,Y_effectif,Z_effectif                                                \
                                                       ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                         \
                                                                                    ,X_effectif,Y_effectif,Z_effectif                   \
                                                                                     )                                                  \
                                                        )                                                                               \
                                                  );                                                                                    \
                                        /* En effet, si deux composantes negatives apparaissent, leur produit sera evidemment        */ \
                                        /* positif et sera donc "grand" alors qu'issu de valeurs negatives, il aurait ete logique    */ \
                                        /* qu'il soit "petit"...                                                                     */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(I3ET(IFEQ(X_effectif,X_centre)                                                                  \
                                            ,IFEQ(Y_effectif,Y_centre)                                                                  \
                                            ,IFEQ(Z_effectif,Z_centre)                                                                  \
                                             )                                                                                          \
                                        )                                                                                               \
                                        Bblock                                                                                          \
                                        EGAL(Xf_transformee_du_point_courant,Xf_transformee_dans_la_boite);                             \
                                        EGAL(Yf_transformee_du_point_courant,Yf_transformee_dans_la_boite);                             \
                                        EGAL(Zf_transformee_du_point_courant,Zf_transformee_dans_la_boite);                             \
                                        /* Memorisation du point courant central transforme...                                       */ \
                                                                                                                                        \
                                        Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____compatibilite_20100120))                \
                                        /* Test introduit le 20100121152800...                                                       */ \
                                             Bblock                                                                                     \
                                             Test(IZEQ(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                          \
                                                                                   ,X_effectif,Y_effectif,Z_effectif                    \
                                                                                    )                                                   \
                                                       )                                                                                \
                                                  )                                                                                     \
                                                  Bblock                                                                                \
                                                  EGAL(le_point_courant_est_actuellement_visible,FAUX);                                 \
                                        /* Le point est considere comme invisible puisqu'il est vide (introduit le 20100121122207).  */ \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         end_albumQ(EDoI,EDoI,EDoI)                                                                                     \
                                                                                                                                        \
                         Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____compatibilite_20100120))                               \
                                        /* Test introduit le 20100120135533...                                                       */ \
                              Bblock                                                                                                    \
                              Test(EST_VRAI(le_point_courant_est_actuellement_visible))                                                 \
                                        /* Test introduit le 20100121152800...                                                       */ \
                                   Bblock                                                                                               \
                                   EGAL(le_point_courant_est_actuellement_visible,FAUX);                                                \
                                        /* A priori le point courant sera cache par un autre point plus pres de l'observateur...     */ \
                                   bTEST_Z_Buffer_(X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                             \
                                                  ,BLOC(EGAL(le_point_courant_est_actuellement_visible,VRAI);)                          \
                                        /* En fait, le point courant est bien visible...                                             */ \
                                                  ,BLOC(VIDE;)                                                                          \
                                                  ,BLOC(VIDE;)                                                                          \
                                                  ,BLOC(VIDE;)                                                                          \
                                                   );                                                                                   \
                                        /* Je note le 20200210140651 que c'est certainement cette gestion des "parties cachees"      */ \
                                        /* par le 'Z-Buffer' qui fait que les images alors produites ne montrent aucun effet de      */ \
                                        /* perspective ('v $xiirf/MENG.22.5.1' par exemple...). Et donc la notion de perspective     */ \
                                        /* parait difficile, voire impossible, a introduire ici...                                   */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(le_point_courant_est_actuellement_visible,VRAI);                                                     \
                                        /* Introduit le 20100121122207, on ne sait jamais...                                         */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(EST_VRAI(le_point_courant_est_actuellement_visible))                                                      \
                                        /* Optimisation introduite le 20100120131636...                                              */ \
                                        /*                                                                                           */ \
                                        /* Des experiences faites le 20100120175014 en forcant :                                     */ \
                                        /*                                                                                           */ \
                                        /*                  EGAL(le_point_courant_est_actuellement_visible,FAUX);                    */ \
                                        /*                                                                                           */ \
                                        /* avant le 'Test(...)' montrent que la sequence qui suit (jusqu'au 'ATes' associe) ne       */ \
                                        /* compte que pour 4% du temps d'execution de 'ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM'.  */ \
                              Bblock                                                                                                    \
                              DEFV(Logical,INIT(le_module_du_gradient_local_etait_nul,FAUX));                                           \
                                        /* Indicateur introduit le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou          */ \
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */ \
                                                                                                                                        \
                              EGAL(niveau_courant                                                                                       \
                                  ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre,X_centre,Y_centre,Z_centre)                  \
                                   );                                                                                                   \
                                        /* Recuperation du point courant central transforme...                                       */ \
                                                                                                                                        \
                              Test(IFET(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____eclairer_par_une_source_lumineuse)                  \
                                       ,IFOU(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20141004)                        \
                                            ,IFET(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____compatibilite_20141004)            \
                                                 ,IFET(OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101008)         \
                                                           ,IFNE                                                                        \
                                                           ,IFGT                                                                        \
                                                           ,niveau_courant                                                              \
                                                           ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album             \
                                                            )                                                                           \
                                                      ,IFGE(niveau_courant                                                              \
                                                           ,NomDeLaFonctionCourante QD@@__ _____seuil_du_niveau_courant                 \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                                        /* L'optimisation relative a 'niveau_courant' a ete introduite le 20141004183844...          */ \
                                   Bblock                                                                                               \
                                   DEFV(deltaF_3D,gradient_local);                                                                      \
                                   DEFV(Float,INIT(module_du_gradient_local,FLOT__UNDEF));                                              \
                                        /* Definition du gradient local et de son module...                                          */ \
                                   DEFV(deltaF_3D,rayon_lumineux_local);                                                                \
                                   DEFV(Float,INIT(module_du_rayon_lumineux_local,FLOT__UNDEF));                                        \
                                        /* Definition du rayon lumineux local et de son module...                                    */ \
                                   DEFV(Float,INIT(cosinus_theta,FLOT__UNDEF));                                                         \
                                        /* Definition du cosinus de l'angle entre le gradient local et le rayon lumineux local.      */ \
                                                                                                                                        \
                                   INITIALISATION_ACCROISSEMENT_3D(rayon_lumineux_local                                                 \
                                                                  ,SOUS(Xf_transformee_du_point_courant                                 \
                                                                       ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_X          \
                                                                        )                                                               \
                                                                  ,SOUS(Yf_transformee_du_point_courant                                 \
                                                                       ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_Y          \
                                                                        )                                                               \
                                                                  ,SOUS(Zf_transformee_du_point_courant                                 \
                                                                       ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_Z          \
                                                                        )                                                               \
                                                                   );                                                                   \
                                   EGAL(module_du_rayon_lumineux_local                                                                  \
                                       ,longF3D(rayon_lumineux_local)                                                                   \
                                        );                                                                                              \
                                        /* Calcul du rayon lumineux local et de son module...                                        */ \
                                                                                                                                        \
                                   INITIALISATION_ACCROISSEMENT_3D(gradient_local                                                       \
                                                                  ,FZERO                                                                \
                                                                  ,FZERO                                                                \
                                                                  ,FZERO                                                                \
                                                                   );                                                                   \
                                        /* On notera que cette valeur initiale {FZERO,FZERO,FZERO} est compatible aussi bien avec    */ \
                                        /* les cumuls qu'avec les recherches de maxima puisque cette derniere utilise 'MAXA2(...)'   */ \
                                        /* (qui interdit une initialisation avec 'F_MOINS_L_INFINI' puisque la valeur absolue de     */ \
                                        /* cette valeur est egale a 'F_INFINI'...).                                                  */ \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____calculer_le_centre_de_gravite))                     \
                                        /* On notera le 20180510101014 que des tests avec 'v $xiirf/FRC3.5K.1' ont montre que        */ \
                                        /* le methode calculant le centre de gravite etait meilleure que celle qui consiste a ne     */ \
                                        /* pas le calculer. Cette derniere methode accentue excessivement la luminosite des          */ \
                                        /* marches d'escalier qui apparaissent necessairement aux bords de chaque couche...          */ \
                                        Bblock                                                                                          \
                                        begin_albumQ(DoIn,Z_front_,Z_back__,PasZ                                                        \
                                                    ,DoIn,Y_bas___,Y_haut__,PasY                                                        \
                                                    ,DoIn,X_gauche,X_droite,PasX                                                        \
                                                     )                                                                                  \
                                             Bblock                                                                                     \
                                             DEFV(Float,INIT(distance_au_centre                                                         \
                                                            ,GpytF3D(SOUS(X,X_centre),SOUS(Y,Y_centre),SOUS(Z,Z_centre))                \
                                                             )                                                                          \
                                                  );                                                                                    \
                                             Test(IZNE(distance_au_centre))                                                             \
                                                  Bblock                                                                                \
                                        /* Cas des autres points que le point central {X_centre,Y_centre,Z_centre} :                 */ \
                                                  INCR(ASD1(gradient_local,dx)                                                          \
                                                      ,MUL2(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre,X,Y,Z)              \
                                                           ,DIVI(FLOT(SOUS(X,X_centre)),distance_au_centre)                             \
                                                            )                                                                           \
                                                       );                                                                               \
                                                  INCR(ASD1(gradient_local,dy)                                                          \
                                                      ,MUL2(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre,X,Y,Z)              \
                                                           ,DIVI(FLOT(SOUS(Y,Y_centre)),distance_au_centre)                             \
                                                            )                                                                           \
                                                       );                                                                               \
                                                  INCR(ASD1(gradient_local,dz)                                                          \
                                                      ,MUL2(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre,X,Y,Z)              \
                                                           ,DIVI(FLOT(SOUS(Z,Z_centre)),distance_au_centre)                             \
                                                            )                                                                           \
                                                       );                                                                               \
                                        /* Dans ce cas, le gradient vaut (calcul du centre de gravite) :                             */ \
                                        /*                                                                                           */ \
                                        /*                             ---                                                           */ \
                                        /*                  ------->   \                ------>                                      */ \
                                        /*                  Gradient = /  Niveau(X,Y,Z).{X,Y,Z}                                      */ \
                                        /*                             ---                                                           */ \
                                        /*                                                                                           */ \
                                        /* (methode introduite le 20091204134434).                                                   */ \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                        /* Le point central {X_centre,Y_centre,Z_centre} est ignore avec cette methode. On notera    */ \
                                        /* que si la boite est reduite a un point, alors 'gradient_local' sera le vecteur nul et     */ \
                                        /* sera donc rendu egal a 'rayon_lumineux_local' ci-apres...                                 */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        end_albumQ(EDoI,EDoI,EDoI)                                                                      \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        begin_albumQ(DoIn,SUCZ(Z_front_),NEUT(Z_back__),PasZ                                            \
                                                    ,DoIn,SUCY(Y_bas___),NEUT(Y_haut__),PasY                                            \
                                                    ,DoIn,SUCX(X_gauche),NEUT(X_droite),PasX                                            \
                                                     )                                                                                  \
                                             Bblock                                                                                     \
                                             EGAL(ASD1(gradient_local,dx)                                                               \
                                                 ,OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_le_maximum_des_differences) \
                                                      ,MAXA2                                                                            \
                                                      ,ADD2                                                                             \
                                                      ,ASD1(gradient_local,dx)                                                          \
                                                      ,SOUS(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,NEUT(X),NEUT(Y),NEUT(Z)                        \
                                                                                         )                                              \
                                                           ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,PREX(X),NEUT(Y),NEUT(Z)                        \
                                                                                         )                                              \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  );                                                                                    \
                                             EGAL(ASD1(gradient_local,dy)                                                               \
                                                 ,OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_le_maximum_des_differences) \
                                                      ,MAXA2                                                                            \
                                                      ,ADD2                                                                             \
                                                      ,ASD1(gradient_local,dy)                                                          \
                                                      ,SOUS(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,NEUT(X),NEUT(Y),NEUT(Z)                        \
                                                                                         )                                              \
                                                           ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,NEUT(X),PREY(Y),NEUT(Z)                        \
                                                                                         )                                              \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  );                                                                                    \
                                             EGAL(ASD1(gradient_local,dz)                                                               \
                                                 ,OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____utiliser_le_maximum_des_differences) \
                                                      ,MAXA2                                                                            \
                                                      ,ADD2                                                                             \
                                                      ,ASD1(gradient_local,dz)                                                          \
                                                      ,SOUS(ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,NEUT(X),NEUT(Y),NEUT(Z)                        \
                                                                                         )                                              \
                                                           ,ACCES_MATRIX_CALCUL_GRADIENT(X_centre,Y_centre,Z_centre                     \
                                                                                        ,NEUT(X),NEUT(Y),PREZ(Z)                        \
                                                                                         )                                              \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  );                                                                                    \
                                        /* Dans ce cas, le gradient vaut :                                                           */ \
                                        /*                                                                                           */ \
                                        /*                             -----                                                         */ \
                                        /*                             \                                                             */ \
                                        /*                              \                                                            */ \
                                        /*                  ------->     \   Niveau(X,Y,Z) - Niveau(X-1,Y,Z)                         */ \
                                        /*                  Gradient =   /   Niveau(X,Y,Z) - Niveau(X,Y-1,Z)                         */ \
                                        /*                              /    Niveau(X,Y,Z) - Niveau(X,Y,Z-1)                         */ \
                                        /*                             /____                                                         */ \
                                        /*                                                                                           */ \
                                        /* ou le "sigma" signifie une recherche de maximum ('MAXA2(...)') ou bien un cumul           */ \
                                        /* additif ('ADD2(...)').                                                                    */ \
                                             Eblock                                                                                     \
                                        end_albumQ(EDoI,EDoI,EDoI)                                                                      \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                        /* Le 20210424103808, grace a 'v $xiirc/MANF.DB.5.1' je decouvre un grave probleme que l'on  */ \
                                        /* voit en haut et a droite ou, en particulier, une bande transversale allant de droite a    */ \
                                        /* gauche en montant lentement est entachee de bandes plus sombres qui de toute evidence     */ \
                                        /* correspondent exactement a la section situee juste derriere. Des tests ont ete faits au   */ \
                                        /* format 'Sud' avec les parametres suivants afin de faire un zoom de rapport 4 sur le coin  */ \
                                        /* haut-droite de cette image :                                                              */ \
                                        /*                                                                                           */ \
                                        /*                  SET       cPremiere=8                                                    */ \
                                        /*                  SET       cDerniere=64                                                   */ \
                                        /*                                                                                           */ \
                                        /*                  inverser_ZA=VRAI                                                         */ \
                                        /*                                                                                           */ \
                                        /*                  SET       _____OJ=0.7999713844                                           */ \
                                        /*                  SET       _____EJ=0.7995428847                                           */ \
                                        /*                  SET       _____xbg=-0.04259248037                                        */ \
                                        /*                  SET       _____xhd=-0.04259243685                                        */ \
                                        /*                  SET       _____ybg=-0.36450195290                                        */ \
                                        /*                  SET       _____yhd=-0.36450190940                                        */ \
                                        /*                                                                                           */ \
                                        /* L'axe des 'Z's etant inverse ("inverser_ZA=VRAI"), on a les coordonnees 'Z' suivantes :   */ \
                                        /*                                                                                           */ \
                                        /*                  ($cDerniere-($cPremiere+0)) = 56                                         */ \
                                        /*                  ($cDerniere-($cPremiere+1)) = 55                                         */ \
                                        /*                                                                                           */ \
                                        /* En editant ici meme les coordonnees entieres, le niveau et le gradient de ce zoom, on     */ \
                                        /* trouve en particulier :                                                                   */ \
                                        /*                                                                                           */ \
                                        /*                  point={98,94,55}    niveau=0      \                                      */ \
                                        /*                  point={99,94,55}    niveau=0       | ATTENTION : ces points ne sont      */ \
                                        /*                  point={100,94,55}   niveau=0       | pas editables grace a l'option      */ \
                                        /*                  point={101,94,55}   niveau=0       | "_____editer_gradient=VRAI".        */ \
                                        /*                  point={102,94,55}   niveau=0       | Ils ont ete obtenus par l'option    */ \
                                        /*                  point={103,94,55}   niveau=255     | "en=VRAI" de '$xci/croix.01$X'      */ \
                                        /*                  point={104,94,55}   niveau=255     | sur l'image '$_____ImageT1.0009'.   */ \
                                        /*                  point={105,94,55}   niveau=255     |                               |     */ \
                                        /*                  point={106,94,55}   niveau=255     |              64-55 = 9 -------      */ \
                                        /*                  point={107,94,55}   niveau=255    /                                      */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                  point={98,94,56}    niveau=255    grad={ 0.000000, 0.000000, 0.000000}   */ \
                                        /*                  point={99,94,56}    niveau=255    grad={ 0.000000, 0.000000, 0.000000}   */ \
                                        /*                  point={100,94,56}   niveau=255    grad={ 0.000000, 0.000000, 0.000000}   */ \
                                        /*                                                                                           */ \
                                        /*                  point={101,94,56}   niveau=255    grad={+0.577350,-0.577350,-0.577350}   */ \
                                        /*                  point={102,94,56}   niveau=255    grad={+1.284457,-1.284457,-1.991564}   */ \
                                        /*                  point={103,94,56}   niveau=255    grad={+1.284457,-1.284457,-4.146264}   */ \
                                        /*                  point={104,94,56}   niveau=255    grad={+0.577350,-0.577350,-5.560478}   */ \
                                        /*                                                                                           */ \
                                        /*                  point={105,94,56}   niveau=255    grad={ 0.000000, 0.000000,-6.137828}   */ \
                                        /*                  point={106,94,56}   niveau=255    grad={ 0.000000, 0.000000,-6.137828}   */ \
                                        /*                  point={107,94,56}   niveau=255    grad={ 0.000000, 0.000000,-6.137828}   */ \
                                        /*                                                                                           */ \
                                        /* ce qui correspond aux couches 55 et 56 "vues de dessus" (les "*"s materialisant les       */ \
                                        /* "niveau=255"s et les " "s les "niveau=0"s...) :                                           */ \
                                        /*                                                                                           */ \
                                        /*                      ------------------------> [a cause de l'option "inverser_ZA=VRAI"]   */ \
                                        /*                     |                                                          |          */ \
                                        /*                     |                                                         \|/         */ \
                                        /*                     |                                                          .          */ \
                                        /*                  Z=55                     *****                    (section 0009)         */ \
                                        /*                  Z=56                **********                    (section 0008)         */ \
                                        /*                                         |  |                                              */ \
                                        /*                                         |   ------- X=104                                 */ \
                                        /*                                         |                                                 */ \
                                        /*                                          ---------- X=101                                 */ \
                                        /*                                                                                           */ \
                                        /* Ainsi lorsqu'une couche est isolee (par exemple c'est le cas du point {100,94,56}, le     */ \
                                        /* gradient est nul. Puis, lorsque cet isolement disparait (a partir de X=101), le gradient  */ \
                                        /* devient non nul avec ses trois composantes non nulles sur la zonne de transition (dans    */ \
                                        /* le segment X E [101,104]), puis ensuite (a partir de X=105) seule la composante en 'Z'    */ \
                                        /* du gradient susbsiste en etant negative.                                                  */ \
                                        /*                                                                                           */ \
                                        /* La consequence de cela est l'apparition de discontinuites de la luminance ci-apres        */ \
                                        /* lors du calcul du produit scalaire entre le gradient et le rayon lumineux...              */ \
                                        /*                                                                                           */ \
                                        /* Que faire pour corriger cela ?                                                            */ \
                                        /*                                                                                           */ \
                                        /* Le 20210427081517, une solution possible consiste a dupliquer chaque couche (voir a ce    */ \
                                        /* propos 'v $xiirc/MANF.DC.5.21') et effectivement, le 20210427122659, cela marche bien...  */ \
                                        /*                                                                                           */ \
                                        /* Le 20210428143051, je precise que 'v $xiirc/.MANE.h5.5.$U _____DoublerSections' montre    */ \
                                        /* ce qu'il faut faire pour les fractales, 'v $xiirc/.LYAP.C3.1.$U _____DoublerSections'     */ \
                                        /* montre ce qu'il faut faire pour les 'Lyapunov's et 'v $xiirc/.MANF.DC.5.$U' est un        */ \
                                        /* outil general de duplication des couches (en general une seule fois ce qui se traduit     */ \
                                        /*                                                                                           */ \
                                        /* par :                                                                                     */ \
                                        /*                                                                                           */ \
                                        /*                  _____DoublerSections=1                  (=une duplication)               */ \
                                        /*                                                                                           */ \
                                        /* alors que par defaut, il n'y a pas de duplication, soit :                                 */ \
                                        /*                                                                                           */ \
                                        /*                  _____DoublerSections=0                                                   */ \
                                        /*                                                                                           */ \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____editer_gradient))                                   \
                                        /* Test introduit le 20210424174413...                                                       */ \
                                        Bblock                                                                                          \
                                        Test(EST_VRAI(UNE_EDITION_PARALLELE_EST_POSSIBLE))                                              \
                                             Bblock                                                                                     \
                                             CAL3(Prme3("coordonnees={%d,%d,%d}     ",X_courant,Y_courant,Z_courant));                  \
                                             CAL3(Prme1("niveau=%d     ",Aload_point(albumA,X_courant,Y_courant,Z_courant)));           \
                                             CAL3(Prme3("gradient={%+.^^^,%+.^^^,%+.^^^}\n"                                             \
                                                       ,ASD1(gradient_local,dx)                                                         \
                                                       ,ASD1(gradient_local,dy)                                                         \
                                                       ,ASD1(gradient_local,dz)                                                         \
                                                        )                                                                               \
                                                  );                                                                                    \
                                        /* Editions introduites le 20210424174413 pour aider a resoudre le probleme evoque ci-dessus */ \
                                        /* le 20210424103808...                                                                      */ \
                                        /*                                                                                           */ \
                                        /* Le 20210424185622, je note qu'utiliser simultanement :                                    */ \
                                        /*                                                                                           */ \
                                        /*                  gPRINT_DEFAUT_____n_editer_que_le_message_principal=VRAI                 */ \
                                        /*                                                                                           */ \
                                        /* via l'option :                                                                            */ \
                                        /*                                                                                           */ \
                                        /*                  Alleger=VRAI                                                             */ \
                                        /*                                                                                           */ \
                                        /* est plus que recommande...                                                                */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   EGAL(module_du_gradient_local                                                                        \
                                       ,longF3D(gradient_local)                                                                         \
                                        );                                                                                              \
                                        /* Calcul du gradient local et de son module...                                              */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123191213 je note qu'en fait le vecteur gradient doit aller des valeurs fortes    */ \
                                        /* ("presence de matiere") aux valeurs faibles ("vide")...                                   */ \
                                                                                                                                        \
                                   Test(IZEQ(module_du_gradient_local))                                                                 \
                                        Bblock                                                                                          \
                                        EGAL(le_module_du_gradient_local_etait_nul,VRAI);                                               \
                                        TRANSFERT_ACCROISSEMENT_3D(gradient_local,rayon_lumineux_local);                                \
                                        EGAL(module_du_gradient_local,module_du_rayon_lumineux_local);                                  \
                                        /* Dans le cas ou le gradient est nul, on considere que le point {X,Y,Z} est isole et donc   */ \
                                        /* parfaitement lumineux (introduit le 20091124180007...).                                   */ \
                                                                                                                                        \
                                        Test(IZEQ(module_du_rayon_lumineux_local))                                                      \
                                        /* Test introduit le 20101125100508 lors des tests destines a comprendre l'existence de      */ \
                                        /* "bandes" verticales apparues dans les stereogrammes 'v $xiac/INTE.41.2$R16',              */ \
                                        /* 'v $xiac/LYAP.91.2$R16', 'v $xiac/LYAP.B1.2$R16' et 'v $xiac/LYAP.E5.2$R16'.              */ \
                                        /* Le 20101125110655, en ayant impose une rotation par rapport a 'OY' d'un angle de pi/2     */ \
                                        /* je constate que l'espace est aplati le long de l'axe 'OZ' (128 unites de long) et que     */ \
                                        /* c'est peut etre cela qui est la cause du probleme. En fait, il semblerait que ce soit     */ \
                                        /* le fait d'interpoler dans 'FFAload_point_coordonnees_01(...)' qui soit responsable...     */ \
                                        /* Si cela ne se voit pas sur d'autres stereogrammes ('v $xiaf/FRA3.Q1.2$R16' par exemple),  */ \
                                        /* c'est peut-etre que dans les cas a problemes il y a beaucoup de petites zones isolees     */ \
                                        /* (voire de points isoles...). Le 20101125133007, je note donc que de ne plus interpoler    */ \
                                        /* resout le probleme : l'interpolation (lineaire comme cubique...) est responsable !        */ \
                                        /* Cela concerne donc aussi l'ombrage par 'AFombrage(...)'. Non, le 20101203131353, je note  */ \
                                        /* que ce sont les rotations qui sont responsables : c'est pourquoi, dorenavant elles seront */ \
                                        /* reportees a l'exterieur ('v $xci/densite_3D.11$K 20101203121552')...                      */ \
                                        /*                                                                                           */ \
                                        /* Le 20101206164709 la longue suite de tests effectues ont amene aux conclusions            */ \
                                        /* suivantes concernant l'origine de ces "bandes" verticales :                               */ \
                                        /*                                                                                           */ \
                                        /*   1-Elles etaient verticales parce que la rotation etait relative a l'axe 'OY'. En        */ \
                                        /*   faisant une rotation par rapport a l'axe 'OX', elles sont devenues horizontales.        */ \
                                        /*                                                                                           */ \
                                        /*   2-A l'interieur de 'ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(...)', la rotation       */ \
                                        /*   est difficile a comprendre. D'une part, par exemple, 'v $xiaf/FRA3.Q1.2$R16' prouve     */ \
                                        /*   que cela ne marche pas trop mal. D'autre part, il semblerait malgre tout qu'il y        */ \
                                        /*   ait des discontinuites lorsque une ligne n'est plus dans un plan de coordonnees a       */ \
                                        /*   cause de la rotation.                                                                   */ \
                                        /*                                                                                           */ \
                                        /*   3-Les calculs defectueux evoques ci-dessous avaient ete faits dans un espace tres       */ \
                                        /*   distordus : 'Pal' pour les axes 'OX' et 'OY', et [0,127] pour l'axe 'OZ' ce qui ne      */ \
                                        /*   pouvait que nuire lors des interpolations.                                              */ \
                                        /*                                                                                           */ \
                                        /* Il a donc ete decide :                                                                    */ \
                                        /*                                                                                           */ \
                                        /*   1-De faire les rotations hors de 'ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(...)'      */ \
                                        /*   et dans les cas defectueux, elles seront faites grace a 'v $xci/densite_3D.11$K'        */ \
                                        /*   dorenavant. Alors, le sens de rotation doit etre inverse (voir comment elle est         */ \
                                        /*   faite dans 'v $xiii/di_album$FON 20101203112910').                                      */ \
                                        /*                                                                                           */ \
                                        /*   2-L'espace de calcul sera moins distordus : 'Pal' pour les axes 'OX' et 'OY', et        */ \
                                        /*   [0,511] pour l'axe 'OZ'.                                                                */ \
                                        /*                                                                                           */ \
                                        /* En fait, je note le 20101207144433 que le phenomene, meme s'il s'est attenue, n'a pas     */ \
                                        /* completement disparu. Cela peut se voir de la facon suivante :                            */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*   :Debut_listG_AnomaliesInterpolation_1:                                                  */ \
                                        /*                                                                                           */ \
                                        /*   $Z             Std                                                                      */ \
                                        /*                                                                                           */ \
                                        /*   $Z             setenv    xTV                 $xTG                                       */ \
                                        /*   $Z             setenv    LONGUEUR_NOMS       $xLONGUEUR_NOMS                            */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       cPremiere=0                                                    */ \
                                        /*   $Z             set       cDerniere=8                                                    */ \
                                        /*   $Z             set       cCentrale=`calcul ($cPremiere+$cDerniere)/2`                   */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       _____ImageT1=$xTV/AVANT                                        */ \
                                        /*   $Z             set       _____ImageT2=$xTV/APRES                                        */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       execALBUM_Para=FAUX                                            */ \
                                        /*   $Z   execALBUM $cPremiere $cDerniere                                                 \  */ \
                                        /*   $Z             $xci/init$X                                                           \  */ \
                                        /*   $Z                                 standard=FAUX                                     \  */ \
                                        /*   $Z                                 valeur=0                                          \  */ \
                                        /*   $Z                                 R=$_____ImageT1.%04d                              \  */ \
                                        /*   $Z                                                               $formatI               */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       CeNtRe=`$xci/nombres$X A="$K_VIDE" p=$cCentrale d=$cCentrale`  */ \
                                        /*                                                                                           */ \
                                        /*   $Z             $xci/init$X                                                           \  */ \
                                        /*   $Z                                 standard=FAUX                                     \  */ \
                                        /*   $Z                                 valeur=1                                          \  */ \
                                        /*   $Z                                 R=$_____ImageT1.$CeNtRe                           \  */ \
                                        /*   $Z                                                               $formatI               */ \
                                        /*                                                                                           */ \
                                        /*   $Z             $xci/densite_3D.11$X                                                  \  */ \
                                        /*   $Z                                 A=$_____ImageT1.                                  \  */ \
                                        /*   $Z                                 standard=FAUX                                     \  */ \
                                        /*   $Z                                 premiere=$cPremiere                               \  */ \
                                        /*   $Z                                 Zmin=$cPremiere Zmax=$cDerniere                   \  */ \
                                        /*   $Z                                 ValiderAxes=FAUX                                  \  */ \
                                        /*   $Z                                 super_echelle=FAUX                                \  */ \
                                        /*   $Z                                 rotation=VRAI ROTATION_OY=-0.026179938779915      \  */ \
                                        /*   $Z                                 lineaire=VRAI                                     \  */ \
                                        /*   $Z                                 dx=1 dy=1 dz=1                                    \  */ \
                                        /*   $Z                                 R=$_____ImageT2.                                  \  */ \
                                        /*   $Z                                                               $formatI               */ \
                                        /*                                                                                           */ \
                                        /*   :Fin_listG_AnomaliesInterpolation_1:                                                    */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Alors, l'image 'v $_____ImageT2.0003 p=$xiP/plan.01' presente des anomalies dans          */ \
                                        /* l'espacement des barres verticales. Au passage, l'angle '-0.026179938779915' correspond   */ \
                                        /* a '$LAnGlEs[9]' de la sequence 'v $xiac/$Fnota Debut_listG_INTE_41'...                    */ \
                                        /*                                                                                           */ \
                                        /* Ces experiences montre l'importance de 'v $xiii/Images$STR DENORMALISE_AXES_____epsilon', */ \
                                        /* parametre utilise dans 'v $xiif/format$DEF _cDENORMALISE_AXES' via 'gINTE(...)'. Ce       */ \
                                        /* parametre peut etre modifie via l'argument "EpsilonAxes=" (dans '$xci/densite_3D.11$X'    */ \
                                        /* ci-dessus evidemment, les experiences ayant porte en particulier sur "EpsilonAxes=0.5").  */ \
                                        /*                                                                                           */ \
                                        /* Aux environs du 20101209152519, je note qu'en fait le phenomene ne se manifeste que lors  */ \
                                        /* de rotations avec des petits angles. En particulier les angles dans ~[-0.1400,+0.1400]    */ \
                                        /* (exception faite du 0 evidemment...) posent problemes. C'est pourquoi, une solution (pas  */ \
                                        /* tres elegante en fait !) consiste a les eviter ('v $xiac/$Fnota Debut_listG_LYAP_91' par  */ \
                                        /* exemple ou seize angles regulierement espaces dans [-1.05,+1.20] sont utilises ; c'est    */ \
                                        /* donc la solution -provisoire ?- choisie pour les stereogrammes 'v $xiac/INTE.41.2$R16',   */ \
                                        /* 'v $xiac/LYAP.91.2$R16', 'v $xiac/LYAP.B1.2$R16' et 'v $xiac/LYAP.E5.2$R16').             */ \
                                             Bblock                                                                                     \
                                             PRINT_ATTENTION("le module du rayon lumineux 'local' est nul'");                           \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____ne_visualiser_que_les_gradients_nuls))              \
                                        /* Possibilite introduite le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */ \
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : en fait cette option est plus destinee a faire des tests afin de voir         */ \
                                        /* s'il y a effectivement des zones a gradient nul...                                        */ \
                                        Bblock                                                                                          \
                                        Test(EST_VRAI(le_module_du_gradient_local_etait_nul))                                           \
                                             Bblock                                                                                     \
                                             EGAL(niveau_lumineux,COORDONNEE_BARYCENTRIQUE_MAXIMALE);                                   \
                                        /* Ainsi, on ne verra que les points ou le gradient etait nul...                             */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             EGAL(niveau_lumineux,COORDONNEE_BARYCENTRIQUE_MINIMALE);                                   \
                                        /* Ainsi, on ne verra que les points ou le gradient etait nul...                             */ \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        EGAL(cosinus_theta                                                                              \
                                            ,DIVI(prdF3D(gradient_local,rayon_lumineux_local)                                           \
                                                 ,MUL2(module_du_gradient_local,module_du_rayon_lumineux_local)                         \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Calcul du cosinus de l'angle entre le gradient local et le rayon lumineux local.          */ \
                                                                                                                                        \
                                        EGAL(niveau_lumineux,COS1(cosinus_theta));                                                      \
                                        /* Et enfin, conversion en un niveau lumineux en notant que celui-ci est toujours positif... */ \
                                                                                                                                        \
                                        Test(IFEXff(niveau_lumineux                                                                     \
                                                   ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                   \
                                                   ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                   \
                                                    )                                                                                   \
                                             )                                                                                          \
                                        /* Test introduit le 20101125100508 (voir les remarques faites a cette date ci-dessus...).   */ \
                                             Bblock                                                                                     \
                                             PRINT_ATTENTION("le niveau lumineux n'est pas dans [0,1]");                                \
                                             CAL1(Prer1("(niveau lumineux=%d)\n",niveau_lumineux));                                     \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20141005))                                 \
                                        /* On notera le 20210420150901 que le non respect de cette compatibilite cree des problemes  */ \
                                        /* lorsque des sections n'ont qu'un plan d'epaisseur. Cela s'est vu a cette date lors du     */ \
                                        /* calcul de 'v $xiirc/MANF.D8.5.21' dans laquelle apparaissaient des contours filiformes    */ \
                                        /* non remplis ('v $xiirc/MANF.D8.5.NonCompatible_20160125.21'...).                          */ \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____ne_visualiser_que_les_gradients_nuls))              \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Test(EST_VRAI(le_module_du_gradient_local_etait_nul))                                           \
                                             Bblock                                                                                     \
                                             Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____visualiser_les_gradients_nuls))           \
                                                  Bblock                                                                                \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  EGAL(niveau_courant,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album); \
                                        /* Introduit le 20141005111632 afin de pouvoir eliminer les points ou le gradient est nul.   */ \
                                        /* Cela s'est vu lors du calcul de 'v $xiirf/FRB3.s7.1' ou des zones sur-lumineuses dues     */ \
                                        /* a des gradients nuls apparaissaient...                                                    */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              Test(IFET(OPC2(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101008)                        \
                                            ,IFNE                                                                                       \
                                            ,IFGT                                                                                       \
                                            ,niveau_courant                                                                             \
                                            ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_album                            \
                                             )                                                                                          \
                                       ,IFGE(niveau_courant,NomDeLaFonctionCourante QD@@__ _____seuil_du_niveau_courant)                \
                                        )                                                                                               \
                                   )                                                                                                    \
                                        /* Jusqu'au 20091206104059, il y avait ci-dessus :                                           */ \
                                        /*                                                                                           */ \
                                        /*                  Test(IZNE(niveau_courant))                                               */ \
                                        /*                                                                                           */ \
                                        /* que je ne comprenais pas en fait...                                                       */ \
                                        /*                                                                                           */ \
                                        /* Le test 'IFGE(...)' est compatible avec 'v $xiii/Images$DEF Masque_____seuil'...          */ \
                                   Bblock                                                                                               \
                                   DEFV(genere_Float,INIT(niveau_courant_effectif                                                       \
                                                         ,PUIX(niveau_courant                                                           \
                                                              ,NomDeLaFonctionCourante QD@@__ _____exposant_du_niveau                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                   DEFV(genere_Float,INIT(niveau_lumineux_effectif                                                      \
                                                         ,PUIX(niveau_lumineux                                                          \
                                                              ,NomDeLaFonctionCourante QD@@__ _____source_lumineuse_specularite         \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211))                            \
                                        /* Test introduit le 20091211113702...                                                       */ \
                                        Bblock                                                                                          \
                                        DEFV(genere_Float,INIT(coordonnee_X,f____cNORMALISE_OX(X)));                                    \
                                        DEFV(genere_Float,INIT(coordonnee_Y,f____cNORMALISE_OY(Y)));                                    \
                                        DEFV(genere_Float,INIT(coordonnee_Z,f____cNORMALISE_OZ(Z)));                                    \
                                        /* Introduit le 20100123114826 pour la procedure 'TEXTURAGE_D_UNE_ACCUMULATION'...           */ \
                                                                                                                                        \
                                        DEFV(genere_Float,INIT(niveau_resultant,FLOT__NIVEAU_UNDEF));                                   \
                                        valeur_initiale_du_niveau_resultant(niveau_resultant);                                          \
                                        /* Forcage a priori du niveau resultant (le parametrage a ete introduit le 20100123111742).  */ \
                                                                                                                                        \
                                        CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_le_niveau_courant                  \
                                                        ,niveau_courant_effectif                                                        \
                                                         );                                                                             \
                                        /* Cet exposant peut prendre n'importe quelle valeur, mais une valeur INFERIEURE ou egale    */ \
                                        /* a un est suggeree (a comparer a la "specularite"...).                                     */ \
                                                                                                                                        \
                                        Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____eclairer_par_une_source_lumineuse))            \
                                             Bblock                                                                                     \
                                             CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_le_niveau_lumineux            \
                                                             ,niveau_lumineux_effectif                                                  \
                                                              );                                                                        \
                                        /* En ce qui concerne l'exposant de "specularite", il peut prendre n'importe quelle          */ \
                                        /* valeur, mais une valeur SUPERIEURE ou egale a un est ce qui donne l'effet recherche       */ \
                                        /* (a comparer a l'exposant du niveau...).                                                   */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                                                                                                                        \
                                        CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_les_coordonnees_XYZ                \
                                                        ,LIZ3(NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_X       \
                                                             ,Xn                                                                        \
                                                             ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_Y       \
                                                             ,Yn                                                                        \
                                                             ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_Z       \
                                                             ,Zn                                                                        \
                                                              )                                                                         \
                                                         );                                                                             \
                                                                                                                                        \
                                        CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_les_coordonnees_RPT                \
                                                        ,LIZ3(NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_R       \
                                                             ,Rho_3D(Xn,Yn,Zn)                                                          \
                                                             ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_P       \
                                                             ,Phi_3D(Xn,Yn,Zn)                                                          \
                                                             ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_T       \
                                                             ,Theta_3D(Xn,Yn,Zn)                                                        \
                                                              )                                                                         \
                                                         );                                                                             \
                                        /* Niveau resultant des differents calculs. On notera que 'niveau_courant' doit etre         */ \
                                        /* positif (ce qui a ete verifie ci-dessus), que 'niveau_lumineux' est positif par           */ \
                                        /* construction et qu'enfin la combinaison 'LIN3(...)' des trois coordonnees {X,Y,Z}         */ \
                                        /* peut donc etre negative. Le probleme aurait ete que plus d'une quantite puissent etre     */ \
                                        /* negatives car alors le produit aurait ete positif...                                      */ \
                                        /*                                                                                           */ \
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */ \
                                                                                                                                        \
                                        EGAL(minimum_de_niveau_resultant                                                                \
                                            ,MIN2(minimum_de_niveau_resultant                                                           \
                                                 ,niveau_resultant                                                                      \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        EGAL(maximum_de_niveau_resultant                                                                \
                                            ,MAX2(maximum_de_niveau_resultant                                                           \
                                                 ,niveau_resultant                                                                      \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Extrema du niveau resultant avant renormalisation...                                      */ \
                                                                                                                                        \
                                        storeF_point_3D(niveau_resultant                                                                \
                                                       ,image_niveau_resultant                                                          \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        /* Generation de l'image intermediaire non renormalisee...                                   */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        DEFV(genere_Float,INIT(coordonnee_X,Xf_transformee_du_point_courant));                          \
                                        DEFV(genere_Float,INIT(coordonnee_Y,Yf_transformee_du_point_courant));                          \
                                        DEFV(genere_Float,INIT(coordonnee_Z,Zf_transformee_du_point_courant));                          \
                                        /* Introduit le 20100708185838 pour la procedure 'TEXTURAGE_D_UNE_ACCUMULATION'...           */ \
                                        /*                                                                                           */ \
                                        /* On notera qu'a priori (et si je ne dis pas de betises...) :                               */ \
                                        /*                                                                                           */ \
                                        /*        coordonnee_X = Xf_transformee_du_point_courant = Xf_transformee_dans_la_boite      */ \
                                        /*        coordonnee_Y = Yf_transformee_du_point_courant = Yf_transformee_dans_la_boite      */ \
                                        /*        coordonnee_Z = Zf_transformee_du_point_courant = Zf_transformee_dans_la_boite      */ \
                                        /*                                                                                           */ \
                                        /* A la date du 20101126090127, on ne fait plus tourner la texture. Le 'ADD2(...)' des       */ \
                                        /* coordonnees avec {Xft,Yft,Zft} est destine a compenser le 'SOUS(...)' qui sert a definir  */ \
                                        /* {Xfc,Yfc,Zfc}.                                                                            */ \
                                                                                                                                        \
                                        DEFV(genere_Float,INIT(niveau_initial,FLOT__NIVEAU_UNDEF));                                     \
                                        valeur_initiale_du_niveau_resultant(niveau_initial);                                            \
                                        /* Introduit le 20101126080947 pour alleger sa validation. On notera l'initialisation via    */ \
                                        /* le 'EGAL(...)' et non pas le 'INIT(...)' de definition qui precede a cause de l'usage     */ \
                                        /* possible de {coordonnee_X,coordonnee_Y,coordonnee_Z}...                                   */ \
                                                                                                                                        \
                                        storeF_point_3D(NEGA(NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_image)           \
                                                       ,image_niveau_resultant                                                          \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        /* Et ce afin de savoir plus tard quels sont les points qui ont ete marques...               */ \
                                                                                                                                        \
                                        storeF_point_3D(niveau_courant_effectif                                                         \
                                                       ,image_niveau_courant_effectif                                                   \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        storeF_point_3D(niveau_lumineux_effectif                                                        \
                                                       ,image_niveau_lumineux_effectif                                                  \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        storeF_point_3D(Xf_DU_POINT_COURANT                                                             \
                                                       ,image_coordonnee_X                                                              \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        storeF_point_3D(Yf_DU_POINT_COURANT                                                             \
                                                       ,image_coordonnee_Y                                                              \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        storeF_point_3D(Zf_DU_POINT_COURANT                                                             \
                                                       ,image_coordonnee_Z                                                              \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        /* On notera que jusqu'au 20101202132137 on memorisait ci-dessus {Xn,Yn,Zn}, or ces trois    */ \
                                        /* coordonnees sont en fait {X,Y,Z} normalisees : elles sont donc tres "quantifiees". D'ou   */ \
                                        /* la modification les remplacant par {?f_transformee_du_point_courant}... C'est cela qui    */ \
                                        /* etait responsable des "bandes" verticales apparues dans les stereogrammes                 */ \
                                        /* 'v $xiac/INTE.41.2$R16', 'v $xiac/LYAP.91.2$R16', 'v $xiac/LYAP.B1.2$R16' et              */ \
                                        /* 'v $xiac/LYAP.E5.2$R16'. En effet, dans leur cas, il y avait une rotation autour de       */ \
                                        /* l'axe 'OY'. Dans ces conditions 'Zf_transformee_du_point_courant' n'etait plus egal       */ \
                                        /* a 'Zn' ; en utilisant 'Zn' on utilisait un 'Z' variant en marches d'escalier (ce qui      */ \
                                        /* est normal puisqu'il s'agit de 'Z' normalise) alors que 'Zf_transformee_du_point_courant' */ \
                                        /* lui, varie "continument"...                                                               */ \
                                                                                                                                        \
                                        Test(IZLE(niveau_initial))                                                                      \
                                        /* Test introduit le 20101126080947 et passe de 'IZLT(...)' (ce qui etait une erreur) a      */ \
                                        /* 'IZLE(...)' le 20101127162514.                                                            */ \
                                             Bblock                                                                                     \
                                             Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____accepter_les_points_isoles))              \
                                        /* Test introduit le 20190208151238 et justifie le 20190208145301 ci-dessous...              */ \
                                                  Bblock                                                                                \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  PRINT_ATTENTION("le niveau initial de texturage est negatif ou nul");                 \
                                        /* Voir 'v $xiirk/$Fnota texturage.est.negatif.ou.nul' pour un exemple d'apparition de       */ \
                                        /* ce probleme...                                                                            */ \
                                        /*                                                                                           */ \
                                        /* Le 20220622172915, j'ai reteste la generation de 'v $xiirk/REFM.m5.21' en acceptant       */ \
                                        /* les points isoles (via "accepter_points_isoles=VRAI") et avec la palette qui posait       */ \
                                        /* probleme ("_____PaletteT=$xiP/arc_ciel.L1") pour voir. Et cela marche...                  */ \
                                                  CAL1(Prer4("DensiteCourante[%f,%f,%f]=%f\n"                                           \
                                                            ,Xf_transformee_du_point_courant                                            \
                                                            ,Yf_transformee_du_point_courant                                            \
                                                            ,Zf_transformee_du_point_courant                                            \
                                                            ,niveau_courant                                                             \
                                                             )                                                                          \
                                                       );                                                                               \
                                                  CAL1(Prer7("NiveauTexture..[%f,%f,%f][%d,%d,%d]=%f\n"                                 \
                                                            ,Xn                                                                         \
                                                            ,Yn                                                                         \
                                                            ,Zn                                                                         \
                                                            ,X                                                                          \
                                                            ,Y                                                                          \
                                                            ,Z                                                                          \
                                                            ,niveau_initial                                                             \
                                                             )                                                                          \
                                                       );                                                                               \
                                        /* L'edition du niveau et autres choses fut introduite le 20101127162514...                  */ \
                                        /*                                                                                           */ \
                                        /* Je note le 20190208145301 que ces circonstances sont en general certainement liees        */ \
                                        /* a des points isoles qui n'ont pas ete reperes par 'v $xci/ombrage.11$K'. Cela s'est       */ \
                                        /* vu a cette date lors de la mise au point de 'v $xiirf/FRC3.6K.21'. En effet, avant        */ \
                                        /* l'introduction de 'v $xiirf/.FRC3.6K.1.$U .xci.convol_3D.01.X', etant donnee la finesse   */ \
                                        /* des filaments crees par 'v $xiirf/.FRC3.21.1.2.$U .xci.conversion_3D.X', la               */ \
                                        /* transformation 'v $xiirf/.MENG.67.5.$U .xci.o_homogra.81.X' cree alors beaucoup de        */ \
                                        /* points isoles. Avec le parametre "_____FElargissement=40.0", il y en avait 140 :          */ \
                                        /*                                                                                           */ \
                                        /*        [0656,0825,0891]    [0695,0991,0888]    [0713,1004,0972]    [0751,0972,1444]       */ \
                                        /*        [0755,0636,1718]    [0758,1231,0982]    [0763,1122,0886]    [0772,1209,0977]       */ \
                                        /*        [0835,1288,0889]    [0840,1022,1868]    [0844,1016,1413]    [0849,0987,1360]       */ \
                                        /*        [0860,0919,1358]    [0867,0914,1540]    [0867,0916,1553]    [0870,0896,1469]       */ \
                                        /*        [0870,0960,1501]    [0872,1035,1410]    [0876,1109,1405]    [0877,0669,1181]       */ \
                                        /*        [0878,1110,1580]    [0879,1110,1575]    [0884,1107,1502]    [0890,0924,1508]       */ \
                                        /*        [0891,0943,1420]    [0893,0954,1585]    [0895,0962,1573]    [0896,0966,1580]       */ \
                                        /*        [0897,0944,1342]    [0899,1112,1739]    [0900,1070,1365]    [0901,1106,1740]       */ \
                                        /*        [0903,1075,1574]    [0904,1075,1566]    [0904,1105,1710]    [0904,1165,1443]       */ \
                                        /*        [0905,1092,1352]    [0906,1111,1716]    [0910,1079,1719]    [0911,1079,1709]       */ \
                                        /*        [0912,1029,1575]    [0913,1000,1739]    [0914,0996,1723]    [0926,1025,1738]       */ \
                                        /*        [0930,1102,1423]    [0932,1106,1159]    [0933,0857,1493]    [0933,0915,1580]       */ \
                                        /*        [0933,0947,1714]    [0934,1233,1186]    [0938,1286,0829]    [0943,1066,1689]       */ \
                                        /*        [0943,1177,1422]    [0945,1311,0862]    [0947,0949,1487]    [0948,1202,1363]       */ \
                                        /*        [0949,0940,1439]    [0957,0885,1443]    [0957,1158,1441]    [0960,1104,1352]       */ \
                                        /*        [0961,0776,1434]    [0961,0987,1550]    [0965,0979,1725]    [0966,0986,1758]       */ \
                                        /*        [0967,0941,1719]    [0973,1453,0873]    [0974,1032,1820]    [0976,0966,1736]       */ \
                                        /*        [0976,1139,1682]    [0977,1104,1379]    [0979,0986,1727]    [0979,1019,1719]       */ \
                                        /*        [0979,1089,1737]    [0980,0985,1758]    [0980,1034,1713]    [0982,0951,1714]       */ \
                                        /*        [0982,0982,1562]    [0982,0999,1456]    [0982,1000,1447]    [0984,0994,1346]       */ \
                                        /*        [0990,1003,1696]    [0991,0990,1475]    [0994,0963,1858]    [0997,1132,1716]       */ \
                                        /*        [0998,0913,1745]    [0999,0964,1702]    [1000,1035,1536]    [1001,1030,1722]       */ \
                                        /*        [1002,0949,1400]    [1003,1033,1946]    [1007,0576,1270]    [1007,0999,1728]       */ \
                                        /*        [1008,1029,1785]    [1010,1027,1867]    [1012,0950,1732]    [1014,1375,1718]       */ \
                                        /*        [1016,1072,1389]    [1019,1042,1775]    [1021,1127,1387]    [1032,0958,1775]       */ \
                                        /*        [1045,1045,1636]    [1048,1059,1690]    [1051,1102,1377]    [1058,1004,1845]       */ \
                                        /*        [1059,1030,1849]    [1060,1047,1695]    [1063,0762,1301]    [1063,0863,1439]       */ \
                                        /*        [1065,1045,1712]    [1069,1141,1426]    [1071,1062,1375]    [1078,0997,1745]       */ \
                                        /*        [1079,1075,1725]    [1090,1036,1767]    [1091,1070,1730]    [1093,1034,1740]       */ \
                                        /*        [1095,0971,1857]    [1096,1004,1739]    [1096,1068,1714]    [1098,1038,1733]       */ \
                                        /*        [1105,1143,1383]    [1106,1143,1378]    [1115,0999,1707]    [1121,0645,0891]       */ \
                                        /*        [1126,1305,1718]    [1129,1185,1274]    [1131,1242,1270]    [1133,1242,1252]       */ \
                                        /*        [1136,1055,1719]    [1148,1082,1382]    [1161,0913,0956]    [1181,0971,0961]       */ \
                                        /*        [1182,1205,1407]    [1187,1206,1512]    [1199,1067,1394]    [1236,0756,0834]       */ \
                                        /*        [1273,1085,1363]    [1285,0675,0871]    [1325,0380,0983]    [1357,1156,0890]       */ \
                                        /*                                                                                           */ \
                                        /* avec :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  DensiteCourante=1                                                        */ \
                                        /*                  NiveauTexture..=0                                                        */ \
                                        /*                                                                                           */ \
                                        /* ce qui semble bien etre des points isoles non vus par l'ombrage. On rappelle au passage   */ \
                                        /* que l'axe 'OZ' est inverse ('v $xiirc/.MANE.41.4.$U inverser_Z..VRAI') et qu'ainsi le     */ \
                                        /* numero d'image contenant le plan 'Z' est '$Zmax-Z+1' ("Zmax=2047" dans ce cas...). Le     */ \
                                        /* probleme venait du fait que la definition de 'v $xiirf/FRC3.6K.21' etait alors :          */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*   :Debut_listG_FRC3_6K:                                                                   */ \
                                        /*                                                                                           */ \
                                        /*   $Z             Squ                                                                      */ \
                                        /*                                                                                           */ \
                                        /*   $Z             setenv    xTV                 $DStemporairesUG                           */ \
                                        /*                                                                                           */ \
                                        /*   $Z             SET       cPremiere=1                                                    */ \
                                        /*   $Z             SET       cDerniere=2048                                                 */ \
                                        /*                                                                                           */ \
                                        /*   $Z             setenv    _____ImageT2        $xTV/SECTIONS.1                            */ \
                                        /*   $Z             setenv    _____ImageT1        $xTV/SECTIONS.2                            */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       _____Iterations=15                                             */ \
                                        /*   $Z             set       _____FElargissement=40.0                                       */ \
                                        /*   $m4            _____include(_____xiirf/.FRC3.21.1._____U)                               */ \
                                        /*                                                                                           */ \
                                        /*   $Z             SET       _____Facteur=300000                                            */ \
                                        /*   $m4            _____include(_____xiirf/.MENG.67.5._____U)                               */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       _____ValidMalo=FAUX                                            */ \
                                        /*   $Z             set       _____SRotationX=0                                              */ \
                                        /*   $Z             set       _____SRotationY=0                                              */ \
                                        /*   $Z             set       _____DemiNoyauX=3                                              */ \
                                        /*   $Z             set       _____DemiNoyauY=3                                              */ \
                                        /*   $Z             set       _____DemiNoyauZ=3                                              */ \
                                        /*   $Z             set       _____Dx=1                                                      */ \
                                        /*   $Z             set       _____Dy=1                                                      */ \
                                        /*   $Z             set       _____Dz=1                                                      */ \
                                        /*                                                                                           */ \
                                        /*   $Z             set       _____imagesR=$xiirf/FRC3.6K                                    */ \
                                        /*   $m4            _____include(_____xiirf/.FRC3.5H.3._____U)                               */ \
                                        /*                                                                                           */ \
                                        /*   :Fin_listG_FRC3_6K:                                                                     */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* soit :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/rotate_3D.11$X _____ImageT2   -->  _____ImageT1                     */ \
                                        /*                  $xci/ombrage.11$X   _____ImageTd   -->  _____ImageTo                     */ \
                                        /*                  $xci/convol_3D.01$X _____ImageTo   -->  _____ImageTo                     */ \
                                        /*                  $xci/accumule.42$X                                                       */ \
                                        /*                                                                                           */ \
                                        /* alors que la bonne definition est :                                                       */ \
                                        /*                                                                                           */ \
                                        /*                  $xci/convol_3D.01$X _____ImageT2   -->  _____ImageT1                     */ \
                                        /*                  $xci/ombrage.11$X   _____ImageTd   -->  _____ImageTo                     */ \
                                        /*                  $xci/accumule.42$X                                                       */ \
                                        /*                                                                                           */ \
                                        /* ('v $xiirf/$Fnota Fin_listG_FRC3_6K'), le '$xci/convol_3D.01$X' etalant les points        */ \
                                        /* isoles (necessairement nombreux comme cela est decrit plus haut...).                      */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                                                                                                                        \
                                        storeF_point_3D(niveau_initial                                                                  \
                                                       ,image_texture                                                                   \
                                                       ,X,Y,Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER                                        \
                                                        );                                                                              \
                                        /* Generation des images intermediaires non renormalisees...                                 */ \
                                        /*                                                                                           */ \
                                        /* On notera que le test 'IFGE(...)' de 'v $xiii/Images$DEF TEST_Z_Buffer_' permet de        */ \
                                        /* faire sans probleme plusieurs 'storeF_point_3D(...)' de suite avec la meme coordonnee     */ \
                                        /* 'Z'...                                                                                    */ \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         FdTb3(matrice_de_calcul_du_gradient                                                                            \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                      \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                      \
                              ,DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                      \
                              ,Float                                                                                                    \
                              ,ADRESSE_NON_ENCORE_DEFINIE                                                                               \
                               );                                                                                                       \
                                        /* Liberation de la matrice des distances.                                                   */ \
                         Eblock                                                                                                         \
                    end_album_back_AvecEditionProgression                                                                               \
                                        /* Le 20170520104034 a ete introduit "_AvecEditionProgression"...                            */ \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____avertir_coordonnees_hors_espace))                                  \
                                        /* Test introduit le 20101206152939...                                                       */ \
                         Bblock                                                                                                         \
                         Test(I3OU(IFOU(IFEXff(minimum_de_Xf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                       ,IFEXff(maximum_de_Xf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                        )                                                                                               \
                                  ,IFOU(IFEXff(minimum_de_Yf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                       ,IFEXff(maximum_de_Yf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                        )                                                                                               \
                                  ,IFOU(IFEXff(minimum_de_Zf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                       ,IFEXff(maximum_de_Zf_transformee_dans_la_boite                                                  \
                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                        \
                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                        \
                                               )                                                                                        \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Test introduit le 20101129182111 car en effet ce sont des coordonnees hors de [0,1] qui   */ \
                                        /* creent des "trous" dans la structure visualisee. Ce fut le cas, par exemple, lors du      */ \
                                        /* calcul de 'v $xiac/LYAP.E5.2$R16'...                                                      */ \
                              Bblock                                                                                                    \
                              PRINT_ATTENTION("au moins l'une des coordonnees s'est retrouvee hors de [0,1]");                          \
                                                                                                                                        \
                              CAL1(Prer2("MinimumX=%+f <-0-> %d\n"                                                                      \
                                        ,minimum_de_Xf_transformee_dans_la_boite                                                        \
                                        ,X_associe_au_minimum_de_Xf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                              CAL1(Prer2("MaximumX=%+f <-0-> %d\n"                                                                      \
                                        ,maximum_de_Xf_transformee_dans_la_boite                                                        \
                                        ,X_associe_au_maximum_de_Xf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                                                                                                                                        \
                              CAL1(Prer2("MinimumY=%+f <-0-> %d\n"                                                                      \
                                        ,minimum_de_Yf_transformee_dans_la_boite                                                        \
                                        ,Y_associe_au_minimum_de_Yf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                              CAL1(Prer2("MaximumY=%+f <-0-> %d\n"                                                                      \
                                        ,maximum_de_Yf_transformee_dans_la_boite                                                        \
                                        ,Y_associe_au_maximum_de_Yf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                                                                                                                                        \
                              CAL1(Prer2("MinimumZ=%+f <-0-> %d\n"                                                                      \
                                        ,minimum_de_Zf_transformee_dans_la_boite                                                        \
                                        ,Z_associe_au_minimum_de_Zf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                              CAL1(Prer2("MaximumZ=%+f <-0-> %d\n"                                                                      \
                                        ,maximum_de_Zf_transformee_dans_la_boite                                                        \
                                        ,Z_associe_au_maximum_de_Zf_transformee_dans_la_boite                                           \
                                         )                                                                                              \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211))                                           \
                                        /* Test introduit le 20091211113702...                                                       */ \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         begin_image                                                                                                    \
                              Bblock                                                                                                    \
                              Test(IFNE(loadF_point(image_niveau_resultant,X,Y)                                                         \
                                       ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_image                                 \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   EGAL(minimum_de_niveau_courant_effectif                                                              \
                                       ,MIN2(minimum_de_niveau_courant_effectif                                                         \
                                            ,loadF_point(image_niveau_courant_effectif,X,Y)                                             \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_niveau_courant_effectif                                                              \
                                       ,MAX2(maximum_de_niveau_courant_effectif                                                         \
                                            ,loadF_point(image_niveau_courant_effectif,X,Y)                                             \
                                             )                                                                                          \
                                        );                                                                                              \
                                                                                                                                        \
                                   EGAL(minimum_de_niveau_lumineux_effectif                                                             \
                                       ,MIN2(minimum_de_niveau_lumineux_effectif                                                        \
                                            ,loadF_point(image_niveau_lumineux_effectif,X,Y)                                            \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_niveau_lumineux_effectif                                                             \
                                       ,MAX2(maximum_de_niveau_lumineux_effectif                                                        \
                                            ,loadF_point(image_niveau_lumineux_effectif,X,Y)                                            \
                                             )                                                                                          \
                                        );                                                                                              \
                                                                                                                                        \
                                   EGAL(minimum_de_coordonnee_X                                                                         \
                                       ,MIN2(minimum_de_coordonnee_X                                                                    \
                                            ,loadF_point(image_coordonnee_X,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_coordonnee_X                                                                         \
                                       ,MAX2(maximum_de_coordonnee_X                                                                    \
                                            ,loadF_point(image_coordonnee_X,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                                                                                                                        \
                                   EGAL(minimum_de_coordonnee_Y                                                                         \
                                       ,MIN2(minimum_de_coordonnee_Y                                                                    \
                                            ,loadF_point(image_coordonnee_Y,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_coordonnee_Y                                                                         \
                                       ,MAX2(maximum_de_coordonnee_Y                                                                    \
                                            ,loadF_point(image_coordonnee_Y,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                                                                                                                        \
                                   EGAL(minimum_de_coordonnee_Z                                                                         \
                                       ,MIN2(minimum_de_coordonnee_Z                                                                    \
                                            ,loadF_point(image_coordonnee_Z,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_coordonnee_Z                                                                         \
                                       ,MAX2(maximum_de_coordonnee_Z                                                                    \
                                            ,loadF_point(image_coordonnee_Z,X,Y)                                                        \
                                             )                                                                                          \
                                        );                                                                                              \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         end_image                                                                                                      \
                                                                                                                                        \
                         begin_image                                                                                                    \
                              Bblock                                                                                                    \
                              Test(IFNE(loadF_point(image_niveau_resultant,X,Y)                                                         \
                                       ,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_image                                 \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   DEFV(genere_Float,INIT(niveau_courant_effectif                                                       \
                                                         ,NORZ(loadF_point(image_niveau_courant_effectif,X,Y)                           \
                                                              ,minimum_de_niveau_courant_effectif                                       \
                                                              ,maximum_de_niveau_courant_effectif                                       \
                                                              ,ZNE2(minimum_de_niveau_courant_effectif                                  \
                                                                   ,maximum_de_niveau_courant_effectif                                  \
                                                                   ,FU                                                                  \
                                                                    )                                                                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                   DEFV(genere_Float,INIT(niveau_lumineux_effectif                                                      \
                                                         ,NORZ(loadF_point(image_niveau_lumineux_effectif,X,Y)                          \
                                                              ,minimum_de_niveau_lumineux_effectif                                      \
                                                              ,maximum_de_niveau_lumineux_effectif                                      \
                                                              ,ZNE2(minimum_de_niveau_lumineux_effectif                                 \
                                                                   ,maximum_de_niveau_lumineux_effectif                                 \
                                                                   ,FU                                                                  \
                                                                    )                                                                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                   DEFV(genere_Float,INIT(coordonnee_X                                                                  \
                                                         ,HOMZ(loadF_point(image_coordonnee_X,X,Y)                                      \
                                                              ,minimum_de_coordonnee_X                                                  \
                                                              ,maximum_de_coordonnee_X                                                  \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____minimum_de_coordonnee_X         \
                                                                    )                                                                   \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____maximum_de_coordonnee_X         \
                                                                    )                                                                   \
                                                              ,ZNE2(minimum_de_coordonnee_X                                             \
                                                                   ,maximum_de_coordonnee_X                                             \
                                                                   ,FU                                                                  \
                                                                    )                                                                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                   DEFV(genere_Float,INIT(coordonnee_Y                                                                  \
                                                         ,HOMZ(loadF_point(image_coordonnee_Y,X,Y)                                      \
                                                              ,minimum_de_coordonnee_Y                                                  \
                                                              ,maximum_de_coordonnee_Y                                                  \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____minimum_de_coordonnee_Y         \
                                                                    )                                                                   \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____maximum_de_coordonnee_Y         \
                                                                    )                                                                   \
                                                              ,ZNE2(minimum_de_coordonnee_Y                                             \
                                                                   ,maximum_de_coordonnee_Y                                             \
                                                                   ,FU                                                                  \
                                                                    )                                                                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                   DEFV(genere_Float,INIT(coordonnee_Z                                                                  \
                                                         ,HOMZ(loadF_point(image_coordonnee_Z,X,Y)                                      \
                                                              ,minimum_de_coordonnee_Z                                                  \
                                                              ,maximum_de_coordonnee_Z                                                  \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____minimum_de_coordonnee_Z         \
                                                                    )                                                                   \
                                                              ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20160125) \
                                                                   ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                   \
                                                                   ,NomDeLaFonctionCourante QD@@__ _____maximum_de_coordonnee_Z         \
                                                                    )                                                                   \
                                                              ,ZNE2(minimum_de_coordonnee_Z                                             \
                                                                   ,maximum_de_coordonnee_Z                                             \
                                                                   ,FU                                                                  \
                                                                    )                                                                   \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                        /* Recuperation des niveaux utiles (introduits le 20091211211742).                           */ \
                                        /*                                                                                           */ \
                                        /* Lors de la mise au point de l'image 'v $xiirv/KNOT.82.3.1' un probleme delicat est        */ \
                                        /* apparu. Il venait du fait qu'une partie de la structure etait faite d'un plan orthogonal  */ \
                                        /* a l'axe 'OZ' (plan situe derriere un noeud 3-trefle). Ce plan etant donc la partie la     */ \
                                        /* plus eloignee de l'observateur et orthogonal a la ligne de visee, toutes ses coordonnees  */ \
                                        /* 'Z' (toutes egales entre-elles evidemment) etaient renormalisees a la valeur 0. Cela      */ \
                                        /* ramenait le 'niveau_resultant' a 0 lors de l'operation de "depth-cueing" un peu plus      */ \
                                        /* loin avec la fonction 'PUIX(...)', en rappelant que :                                     */ \
                                        /*                                                                                           */ \
                                        /*                  PUIX(0,y) = 0                                                            */ \
                                        /*                                                                                           */ \
                                        /* pour y#0...                                                                               */ \
                                                                                                                                        \
                                   DEFV(genere_Float,INIT(niveau_resultant                                                              \
                                                         ,NEUT(loadF_point(image_texture,X,Y)                                           \
                                                               )                                                                        \
                                                          )                                                                             \
                                        );                                                                                              \
                                        /* Forcage a priori du niveau resultant (le parametrage a ete introduit le 20100123111742).  */ \
                                                                                                                                        \
                                   CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_le_niveau_courant                       \
                                                   ,niveau_courant_effectif                                                             \
                                                    );                                                                                  \
                                        /* Cet exposant peut prendre n'importe quelle valeur, mais une valeur INFERIEURE ou egale    */ \
                                        /* a un est suggeree (a comparer a la "specularite"...).                                     */ \
                                                                                                                                        \
                                   Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____eclairer_par_une_source_lumineuse))                 \
                                        Bblock                                                                                          \
                                        CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_le_niveau_lumineux                 \
                                                        ,niveau_lumineux_effectif                                                       \
                                                         );                                                                             \
                                        /* En ce qui concerne l'exposant de "specularite", il peut prendre n'importe quelle          */ \
                                        /* valeur, mais une valeur SUPERIEURE ou egale a un est ce qui donne l'effet recherche       */ \
                                        /* (a comparer a l'exposant du niveau...).                                                   */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_les_coordonnees_XYZ                     \
                                                   ,LIZ3(NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_X            \
                                                        ,coordonnee_X                                                                   \
                                                        ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_Y            \
                                                        ,coordonnee_Y                                                                   \
                                                        ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_Z            \
                                                        ,coordonnee_Z                                                                   \
                                                         )                                                                              \
                                                    );                                                                                  \
                                                                                                                                        \
                                   CALCUL_DU_NIVEAU(NomDeLaFonctionCourante QD@@__ _____cumuler_les_coordonnees_RPT                     \
                                                   ,LIZ3(NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_R            \
                                                        ,Rho_3D(coordonnee_X,coordonnee_Y,coordonnee_Z)                                 \
                                                        ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_P            \
                                                        ,Phi_3D(coordonnee_X,coordonnee_Y,coordonnee_Z)                                 \
                                                        ,NomDeLaFonctionCourante QD@@__ _____ponderation_de_la_coordonnees_T            \
                                                        ,Theta_3D(coordonnee_X,coordonnee_Y,coordonnee_Z)                               \
                                                         )                                                                              \
                                                    );                                                                                  \
                                        /* Niveau resultant des differents calculs. On notera que 'niveau_courant' doit etre         */ \
                                        /* positif (ce qui a ete verifie ci-dessus), que 'niveau_lumineux' est positif par           */ \
                                        /* construction et qu'enfin la combinaison 'LIN3(...)' des trois coordonnees {X,Y,Z}         */ \
                                        /* peut donc etre negative. Le probleme aurait ete que plus d'une quantite puissent etre     */ \
                                        /* negatives car alors le produit aurait ete positif...                                      */ \
                                        /*                                                                                           */ \
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */ \
                                                                                                                                        \
                                   EGAL(niveau_resultant                                                                                \
                                       ,MUL2(MUL3(PUIX(coordonnee_X                                                                     \
                                                      ,NomDeLaFonctionCourante QD@@__ _____exposant_de_la_coordonnees_X                 \
                                                       )                                                                                \
                                                 ,PUIX(coordonnee_Y                                                                     \
                                                      ,NomDeLaFonctionCourante QD@@__ _____exposant_de_la_coordonnees_Y                 \
                                                       )                                                                                \
                                                 ,PUIX(coordonnee_Z                                                                     \
                                                      ,NomDeLaFonctionCourante QD@@__ _____exposant_de_la_coordonnees_Z                 \
                                                       )                                                                                \
                                                  )                                                                                     \
                                            ,niveau_resultant                                                                           \
                                             )                                                                                          \
                                        );                                                                                              \
                                        /* Avant le 20101126181934 cette modulation eventuelle de 'niveau_resultant' par les trois   */ \
                                        /* coordonnees etait a l'interieur du 'storeF_point(...)' qui suit, soit apres le calcul     */ \
                                        /* de ses extrema, ce qui etait evidemment incorrect...                                      */ \
                                                                                                                                        \
                                   EGAL(minimum_de_niveau_resultant                                                                     \
                                       ,MIN2(minimum_de_niveau_resultant                                                                \
                                            ,niveau_resultant                                                                           \
                                             )                                                                                          \
                                        );                                                                                              \
                                   EGAL(maximum_de_niveau_resultant                                                                     \
                                       ,MAX2(maximum_de_niveau_resultant                                                                \
                                            ,niveau_resultant                                                                           \
                                             )                                                                                          \
                                        );                                                                                              \
                                        /* Extrema du niveau resultant avant renormalisation...                                      */ \
                                                                                                                                        \
                                   storeF_point(niveau_resultant                                                                        \
                                               ,image_niveau_resultant                                                                  \
                                               ,X,Y                                                                                     \
                                                );                                                                                      \
                                        /* Generation de l'image intermediaire non renormalisee...                                   */ \
                                        /*                                                                                           */ \
                                        /* Le 20091211211742 est introduite une "modulation" via les coordonnees {X,Y,Z} qui         */ \
                                        /* permet "en activant" la coordonnee 'Z' de faire du "depth-cueing" : une valeur nulle      */ \
                                        /* de l'exposant donne le "depth-cueing" minimal (absent) alors qu'une valeur unite donne    */ \
                                        /* le "depth-cueing" maximal...                                                              */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         end_image                                                                                                      \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____editer_extrema_niveau_resultant))                                  \
                         Bblock                                                                                                         \
                         CAL3(Prme2("extrema du niveau resultant={%+.^^^,%+.^^^}\n"                                                     \
                                   ,minimum_de_niveau_resultant                                                                         \
                                   ,maximum_de_niveau_resultant                                                                         \
                                    )                                                                                                   \
                              );                                                                                                        \
                                        /* Introduit le 20111121120141 afin de pouvoir "ajuster" les parametres                      */ \
                                        /* {_____minimum_force_du_niveau_resultant,_____maximum_force_du_niveau_resultant}...        */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    begin_image                                                                                                         \
                         Bblock                                                                                                         \
                         DEFV(genere_Float,INIT(niveau_resultant                                                                        \
                                               ,loadF_point(image_niveau_resultant                                                      \
                                                           ,X,Y                                                                         \
                                                            )                                                                           \
                                                )                                                                                       \
                              );                                                                                                        \
                         DEFV(genere_p,INIT(niveau_resultant_renormalise,NIVEAU_UNDEF));                                                \
                                        /* Niveau "final" de 'imageR' au point {X,Y} avant renormalisation...                        */ \
                                                                                                                                        \
                         Test(IFEQ(niveau_resultant,NomDeLaFonctionCourante QD@@__ _____niveau_du_vide_dans_l_image))                   \
                              Bblock                                                                                                    \
                              EGAL(niveau_resultant_renormalise,NomDeLaFonctionCourante QD@@__ _____niveau_du_fond);                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(niveau_resultant_renormalise                                                                         \
                                  ,__DENORMALISE_NIVEAU(COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____renormaliser_niveau_resultant) \
                                                            ,HOMZ(niveau_resultant                                                      \
                                                                 ,minimum_de_niveau_resultant                                           \
                                                                 ,maximum_de_niveau_resultant                                           \
                                                                 ,NomDeLaFonctionCourante QD@@__ _____minimum_force_du_niveau_resultant \
                                                                 ,NomDeLaFonctionCourante QD@@__ _____maximum_force_du_niveau_resultant \
                                                                 ,ZNE2(minimum_de_niveau_resultant                                      \
                                                                      ,maximum_de_niveau_resultant                                      \
                                                                      ,FU                                                               \
                                                                       )                                                                \
                                                                  )                                                                     \
                                                            ,TRON(niveau_resultant                                                      \
                                                                 ,NomDeLaFonctionCourante QD@@__ _____minimum_force_du_niveau_resultant \
                                                                 ,NomDeLaFonctionCourante QD@@__ _____maximum_force_du_niveau_resultant \
                                                                  )                                                                     \
                                                             )                                                                          \
                                                        )                                                                               \
                                   );                                                                                                   \
                                        /* La possibilite de ne pas renormaliser le niveau resultant a ete introduite le             */ \
                                        /* 20111119114928 principalement pour 'v $xiirv/STRU.d3.4.2' a cette date... On notera       */ \
                                        /* que le calcul de {minimum_de_niveau_resultant,maximum_de_niveau_resultant} ne semble      */ \
                                        /* plus utile mais je prefere le conserver au cas ou (et pour eviter les problemes.).        */ \
                                        /*                                                                                           */ \
                                        /* Le 20120905100024, le 'NORZ(...)' a ete remplace par 'HOMZ(...)' plus general puisque     */ \
                                        /* les bornes de renormalisation sont parametrables et non plus [0,1] obligatoirement...     */ \
                                                                                                                                        \
                              Test(IFEQ(niveau_resultant_renormalise,NOIR))                                                             \
                                   Bblock                                                                                               \
                                   EGAL(niveau_resultant_renormalise,NOIR_PLANCHER);                                                    \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         store_point(niveau_resultant_renormalise                                                                       \
                                    ,imageR                                                                                             \
                                    ,X,Y                                                                                                \
                                    ,FVARIABLE                                                                                          \
                                     );                                                                                                 \
                                        /* Generation de l'image Resultat...                                                         */ \
                         Eblock                                                                                                         \
                    end_image                                                                                                           \
                                                                                                                                        \
                    Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101121))                                           \
                                        /* Test introduit le 20101121111043...                                                       */ \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test(IFOU(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211)                                  \
                                  ,IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20100120)                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Test introduit le 20101124110657 et complete le 20101124111212...                         */ \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101127))                                 \
                                        /* Test introduit le 20101127094557...                                                       */ \
                                   Bblock                                                                                               \
                                   Test(IFNE(minimum_de_coordonnee_Z,Z_Buffer_____minimum))                                             \
                                        /* Test introduit le 20101122100312 pour valider le 'CHOI(...)' qui va suivre...             */ \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("probleme de coherence du minimum de la coordonnee 'Z'");                          \
                                        CAL1(Prer2("MinimumZ=%f MinimumZBuffer=%f\n",minimum_de_coordonnee_Z,Z_Buffer_____minimum));    \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CALS(IFmove_avec_remplacement_d_un_niveau(Z_Buffer                                                             \
                                                                  ,Z_Buffer                                                             \
                                                                  ,Z_Buffer_____valeur_initiale                                         \
                                                                  ,SE22(minimum_de_coordonnee_Z,Z_Buffer_____minimum)                   \
                                                                   )                                                                    \
                              );                                                                                                        \
                                        /* Afin d'eliminer les valeurs "non physiques" dans le 'Z-Buffer' en particulier ci celui-ci */ \
                                        /* sert ensuite a generer un champ de brume...                                               */ \
                                        /*                                                                                           */ \
                                        /* Le 20101124112113 'SE22(...)' a remplace 'CHOI(...)' car, en effet, c'est la valeur       */ \
                                        /* 'Z_Buffer_____minimum' qui a le plus de chances d'etre correcte et cela a cause des       */ \
                                        /* differentes options de compatibilite...                                                   */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EDEFV(imageF,image_niveau_resultant);                                                                               \
                    EDEFV(imageF,image_texture);                                                                                        \
                                        /* Images intermediaires utiles (introduites le 20091203145031).                             */ \
                    EDEFV(imageF,image_coordonnee_Z);                                                                                   \
                    EDEFV(imageF,image_coordonnee_Y);                                                                                   \
                    EDEFV(imageF,image_coordonnee_X);                                                                                   \
                    EDEFV(imageF,image_niveau_lumineux_effectif);                                                                       \
                    EDEFV(imageF,image_niveau_courant_effectif);                                                                        \
                                        /* Images intermediaires utiles pour une renormalisation prealables des differentes          */ \
                                        /* contributions au niveau final 'niveau_resultant' (introduites le 20091211113702)...       */ \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20091203103538...                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I S P O S I T I F   D ' A C C E L E R A T I O N   D E S   T E S T S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   GENERER_____Iaccumulation_tri_dimensionnelle_standard
#define   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard
#define   GENERER_____Iaccumulation_tri_dimensionnelle_standard_texturee
#define   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard_texturee
                                        /* Dispositif introduit le 20101129163235 et destine a ne compiler que la ou les fonctions   */
                                        /* utile(s) a un test...                                                                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   S A N S   T E X T U R A G E  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   NON_TEXTURAGE_D_UNE_ACCUMULATION(valeur)                                                                                      \
                    EGAL(valeur,PAS_DE_TEXTURE);                                                                                        \
                                        /* Acces a la non-texture introduite le 20101129111412 sous cette forme...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   " S T A N D A R D "  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20100120,FAUX)));
                                        /* Option de compatibilite introduite le 20100120135533 et concernant l'optimisation liee    */
                                        /* aux tests du 'Z-Buffer'...                                                                */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20091211,FAUX)));
                                        /* Option de compatibilite introduite le 20091211113702 et concernant la renormalisation     */
                                        /* des differentes contributions :                                                           */
                                        /*                                                                                           */
                                        /*                  niveau_courant_effectif                                                  */
                                        /*                  niveau_lumineux_effectif                                                 */
                                        /*                  coordonnee_X                                                             */
                                        /*                  coordonnee_Y                                                             */
                                        /*                  coordonnee_Z                                                             */
                                        /*                                                                                           */
                                        /* au niveau de visualisation. Avant cette date, elles n'etaient pas renormalisees, alors    */
                                        /* qu'apres, elles le sont (et sont donc positives ou nulles...).                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20101121,FAUX)));
                                        /* Option de compatibilite introduite le 20101121111043 et concernant l'elimination (ou      */
                                        /* plutot la non elimination si la compatibilite anterieure est demandee) des valeurs        */
                                        /* d'initialisation du 'Z-Buffer' apres sa generation...                                     */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20101125,FAUX)));
                                        /* Option de compatibilite introduite le 20101125125328 et concernant le test des valeurs    */
                                        /* de l'album afin d'eliminer les valeurs faibles ou negatives...                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20101127,FAUX)));
                                        /* Option de compatibilite introduite le 20101127082640 et concernant la coordonnee 'Z'      */
                                        /* utilisee pour le 'Z-Buffer'.                                                              */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20101128,FAUX)));
                                        /* Option de compatibilite introduite le 20101128150104 et destine a pouvoir ne pas          */
                                        /* utiliser les fonction de type '..._etendu(...)' pour 'ACCES_A_UN_POINT_DE_L_ALBUM(...)'.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20141004,FAUX)));
                                        /* Option de compatibilite introduite le 20141004183844 et destine a supprimer une           */
                                        /* nouvelle optimisation de parcours des albums...                                           */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20141005,FAUX)));
                                        /* Option de compatibilite introduite le 20141005111632 et destine a retablir la             */
                                        /* visualisation des gradients nuls a priori...                                              */
                                        /*                                                                                           */
                                        /* On notera le 20210420150901 que le non respect de cette compatibilite cree des problemes  */
                                        /* lorsque des sections n'ont qu'un plan d'epaisseur. Cela s'est vu a cette date lors du     */
                                        /* calcul de 'v $xiirc/MANF.D8.5.21' dans laquelle apparaissaient des contours filiformes    */
                                        /* non remplis ('v $xiirc/MANF.D8.5.NonCompatible_20160125.21'...).                          */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____compatibilite_20160125,FAUX)));
                                        /* Option de compatibilite introduite le 20160125104015 et destine a retablir les            */
                                        /* bornes de renormalisation des coordonnees {X,Y,Z} anterieures a cette date...             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____optimisation_1,FAUX)));
                                        /* Option d'activation de l'optimisation de l'accumulation (introduite le 20170829150744).   */
                                        /*                                                                                           */
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */
                                        /* utilisees, sauf pour des tests...                                                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____avertir_coordonnees_hors_espace,VRAI)));
                                        /* Indicateur introduit le 20101206152939...                                                 */
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____renvoyer_le_niveau_maximal_de_albumA,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____niveau_flottant_hors_image,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */
                                        /*                                                                                           */
                                        /* On notera qu'il s'agit d'un 'genere_Float' (et non pas d'un 'genere_p' comme il           */
                                        /* conviendrait) a cause de 'v $xci/accumule.41$K GET_ARGUMENTS2_F..niveau_hors_image..'.    */
                                        /*                                                                                           */
                                        /* L'indicateur du type '_____renvoyer_le_niveau_maximal_pour_album?' a ete introduit        */
                                        /* le 20101129111412...                                                                      */
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____niveau_du_vide_dans_l_album,FZERO)));
DEFV(Local,DEFV(genere_Float,INIT(Iaccumulation_tri_dimensionnelle_standard_____niveau_du_vide_dans_l_image,F_MOINS_L_INFINI)));
                                        /* Niveau correspondant au "vide" dans l'album Argument (introduit le 20091206105641) et     */
                                        /* dans l'image Resultat...                                                                  */
                                        /*                                                                                           */
                                        /* Le 20101008112709 la declaration 'Local' fut remplacee par 'Common'...                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____accepter_les_points_isoles,FAUX)));
                                        /* Introduit le 20190208151238...                                                            */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____minimum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____maximum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____minimum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____maximum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____minimum_de_coordonnee_Z
                           ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE,FRA10(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____maximum_de_coordonnee_Z
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
                                        /* Les bornes de renormalisation des coordonnees {X,Y,Z} ont ete introduites le              */
                                        /* 20160125104015...                                                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____exposant_du_niveau,FU)));
                                        /* L'exposant du niveau a ete introduit le 20091207082620...                                 */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____calculer_le_centre_de_gravite,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____utiliser_le_maximum_des_differences,VRAI)));
                                        /* Indicateurs de controle de calcul du gradient (introduits le 20091204134434).             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____eclairer_par_une_source_lumineuse,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____source_lumineuse_Z,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____source_lumineuse_specularite,FU)));
                                        /* L'eclairage a ete introduit le 20091123135737 et complete le 20091126135417 en ce         */
                                        /* qui concerne la specularite...                                                            */

#define   DEMI_DIMENSION(demi_dimension)                                                                                                \
                    COND(IL_FAUT(Iaccumulation_tri_dimensionnelle_standard_____eclairer_par_une_source_lumineuse)                       \
                        ,demi_dimension                                                                                                 \
                        ,ZERO                                                                                                           \
                         )                                                                                                              \
                                        /* Optimisation introduite le 20091126095840 afin de ne calculer que ce qui est vraiment     */ \
                                        /* necessaire...                                                                             */
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_X
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_Y
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_Z
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
                                        /* Le calcul du gradient a ete introduit le 20091123135737...                                */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____ne_visualiser_que_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */
                                        /*                                                                                           */
                                        /* ATTENTION : en fait cette option est plus destinee a faire des tests afin de voir         */
                                        /* s'il y a effectivement des zones a gradient nul...                                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____visualiser_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005111632 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls et la          */
                                        /* seule solution semble de ne pas les visualiser...                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____seuil_du_niveau_courant,F_MOINS_L_INFINI)));
                                        /* Seuil introduit le 20091206104059...                                                      */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____cumuler_le_niveau_courant,VRAI)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____cumuler_le_niveau_lumineux,FAUX)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____cumuler_les_coordonnees_XYZ,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_Z,FZERO)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____cumuler_les_coordonnees_RPT,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_R,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_P,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____ponderation_de_la_coordonnees_T,FZERO)));
                                        /* Ponderations du niveau de marquage de 'imageR'...                                         */
                                        /*                                                                                           */
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____exposant_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____exposant_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____exposant_de_la_coordonnees_Z,FZERO)));
                                        /* Exposants des coordonnees {X,Y,Z} destines en particulier a faire du "depth-cueing" via   */
                                        /* la coordonnee 'Z' (introduits le 20091211211742).                                         */
                                        /*                                                                                           */
                                        /* Parametrage du "depth-cueing" :                                                           */
                                        /*                                                                                           */
                                        /*                  exposant_de_la_coordonnees_Z=0          pas de "depth-cueing",           */
                                        /*                  exposant_de_la_coordonnees_Z=1          "depth-cueing" maximal...        */
                                        /*                                                                                           */

DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_standard_____niveau_du_fond,NOIR)));
                                        /* Niveau du fond introduit le 20091212093827...                                             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____editer_gradient,FAUX)));
                                        /* Cette possibilite d'edition a ete introduite le 20210424174413...                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____editer_extrema_niveau_resultant,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_____renormaliser_niveau_resultant,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____minimum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_____maximum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                            )
                 )
     );
                                        /* Introduit le 20111119114928 afin de pouvoir bloquer la renormalisation du niveau          */
                                        /* resultant (pour 'v $xiirv/STRU.d3.4.2' a cette date...).                                  */
                                        /*                                                                                           */
                                        /* Ceci fut complete le 20111121114056 par la possibilite de modifier les extrema            */
                                        /* {minimum_force_du_niveau_resultant,maximum_force_du_niveau_resultant} losrqu'il n'y a     */
                                        /* pas renormalisation et le 20111121120141 pour ce qui est de l'edition des extrema         */
                                        /* du niveau resultant...                                                                    */

#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_X)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_Y)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_____demi_dimension_de_calcul_du_gradient_Z)
                                        /* Dimension de la boite a utiliser.                                                         */

#define   ACCES_A_UN_POINT_DE_L_ALBUM(valeur,Xf,Yf,Zf)                                                                                  \
                    Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____optimisation_1))                                            \
                                        /* Test introduit le 20170829150744...                                                       */ \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                          \
                                            ,NomDeLaFonctionCourante QD@@__ _____renvoyer_le_niveau_maximal_de_albumA                   \
                                             );                                                                                         \
                                        /* Evidemment, cela n'a de sens que si 'FAload_point_coordonnees_01_etendu(...)' est         */ \
                                        /* utilisee ci-apres...                                                                      */ \
                         EGAL(valeur                                                                                                    \
                             ,______NORMALISE_NIVEAU                                                                                    \
                                  (OPC14(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101128)                            \
                                        ,FAload_point_coordonnees_01                                                                    \
                                        ,FAload_point_coordonnees_01_etendu                                                             \
                                        ,albumA                                                                                         \
                                        ,Xf                                                                                             \
                                        ,Yf                                                                                             \
                                        ,Zf                                                                                             \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                \
                                        ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                           \
                                         )                                                                                              \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Le 'GENP(...)' fut introduit le 20091218131902 car, en effet, il manquait ! Cela s'est    */ \
                                        /* vu uniquement sur 'maubert.polytechnique.fr' (equivalent a '$CMAP28') dans le calcul      */ \
                                        /* d'une densite via la procedure 'ACCES_A_UN_POINT_DE_L_ALBUM(...)' (le 20091218110248).    */ \
                                        /*                                                                                           */ \
                                        /* Le 20101128092931 la fonction 'FAload_point_coordonnees_01_etendu(...)' a remplace        */ \
                                        /* 'FAload_point_coordonnees_01(...)'.                                                       */ \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                          \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                            ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                       \
                                             );                                                                                         \
                         EGAL(valeur                                                                                                    \
                             ,Aload_point_valide(albumA                                                                                 \
                                                ,_cDENORMALISE_OX(Xf)                                                                   \
                                                ,_cDENORMALISE_OY(Yf)                                                                   \
                                                ,_cDENORMALISE_OZ(Zf)                                                                   \
                                                 )                                                                                      \
                              );                                                                                                        \
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */ \
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */ \
                                        /* utilisees, sauf pour des tests...                                                         */ \
                         ESaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                        /* Acces au point courant {Xc,Yc,Zc} de l'album (introduit le 20091203102053 sous cette      */ \
                                        /* forme).                                                                                   */

DEFV(Common,DEFV(FonctionP,POINTERp(Iaccumulation_tri_dimensionnelle_standard(imageR,albumA))))
                                        /* Fonction introduite le 20091203110327...                                                  */
DEFV(Argument,DEFV(image,imageR));
                                        /* Image Resultat, tel que : imageR[X][Y]=albumA[diX[X][Y],diY[X][Y],diZ[X][Y]].             */
DEFV(Argument,DEFV(album,albumA));
                                        /* Image Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

#ifdef    GENERER_____Iaccumulation_tri_dimensionnelle_standard
     ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(NON_TEXTURAGE_D_UNE_ACCUMULATION);
                                        /* Le parametre 'NON_TEXTURAGE_D_UNE_ACCUMULATION' a ete introduit le 20100123111742...      */

#    undef     GENERER_____Iaccumulation_tri_dimensionnelle_standard
#Aifdef   GENERER_____Iaccumulation_tri_dimensionnelle_standard
     PRINT_ATTENTION("provisoirement, cette fonction n'a pas ete generee");
#Eifdef   GENERER_____Iaccumulation_tri_dimensionnelle_standard

     RETI(imageR);
     Eblock

#undef    ACCES_A_UN_POINT_DE_L_ALBUM

#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_X

#undef    DEMI_DIMENSION

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   " N O N   S T A N D A R D "  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20100120,FAUX)));
                                        /* Option de compatibilite introduite le 20100120135533 et concernant l'optimisation liee    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20091211,FAUX)));
                                        /* Option de compatibilite introduite le 20091211113702 et concernant la renormalisation     */
                                        /* des differentes contributions :                                                           */
                                        /*                                                                                           */
                                        /*                  niveau_courant_effectif                                                  */
                                        /*                  niveau_lumineux_effectif                                                 */
                                        /*                  coordonnee_X                                                             */
                                        /*                  coordonnee_Y                                                             */
                                        /*                  coordonnee_Z                                                             */
                                        /*                                                                                           */
                                        /* au niveau de visualisation. Avant cette date, elles n'etaient pas renormalisees, alors    */
                                        /* qu'apres, elles le sont (et sont donc positives ou nulles...).                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20101121,FAUX)));
                                        /* Option de compatibilite introduite le 20101121111043 et concernant l'elimination (ou      */
                                        /* plutot la non elimination si la compatibilite anterieure est demandee) des valeurs        */
                                        /* d'initialisation du 'Z-Buffer' apres sa generation...                                     */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20101125,FAUX)));
                                        /* Option de compatibilite introduite le 20101125125328 et concernant le test des valeurs    */
                                        /* de l'album afin d'eliminer les valeurs faibles ou negatives...                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20101127,FAUX)));
                                        /* Option de compatibilite introduite le 20101127082640 et concernant la coordonnee 'Z'      */
                                        /* utilisee pour le 'Z-Buffer'.                                                              */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20101128,FAUX)));
                                        /* Option de compatibilite introduite le 20101128150104 et destine a pouvoir ne pas          */
                                        /* utiliser les fonction de type '..._etendu(...)' pour 'ACCES_A_UN_POINT_DE_L_ALBUM(...)'.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20141004,FAUX)));
                                        /* Option de compatibilite introduite le 20141004183844 et destine a supprimer une           */
                                        /* nouvelle optimisation de parcours des albums...                                           */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20141005,FAUX)));
                                        /* Option de compatibilite introduite le 20141005111632 et destine a retablir la             */
                                        /* visualisation des gradients nuls a priori...                                              */
                                        /*                                                                                           */
                                        /* On notera le 20210420150901 que le non respect de cette compatibilite cree des problemes  */
                                        /* lorsque des sections n'ont qu'un plan d'epaisseur. Cela s'est vu a cette date lors du     */
                                        /* calcul de 'v $xiirc/MANF.D8.5.21' dans laquelle apparaissaient des contours filiformes    */
                                        /* non remplis ('v $xiirc/MANF.D8.5.NonCompatible_20160125.21'...).                          */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____compatibilite_20160125,FAUX)));
                                        /* Option de compatibilite introduite le 20160125104015 et destine a retablir les            */
                                        /* bornes de renormalisation des coordonnees {X,Y,Z} anterieures a cette date...             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____optimisation_1,FAUX)));
                                        /* Option d'activation de l'optimisation de l'accumulation (introduite le 20170829150744).   */
                                        /*                                                                                           */
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */
                                        /* utilisees, sauf pour des tests...                                                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____avertir_coordonnees_hors_espace,VRAI)));
                                        /* Indicateur introduit le 20101206152939...                                                 */
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____renvoyer_le_niveau_maximal_de_albumA,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____niveau_flottant_hors_image,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */
                                        /*                                                                                           */
                                        /* L'indicateur du type '_____renvoyer_le_niveau_maximal_pour_album?' a ete introduit        */
                                        /* le 20101129111412...                                                                      */
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____niveau_du_vide_dans_l_album,FZERO)));
DEFV(Local,DEFV(genere_Float,INIT(Iaccumulation_tri_dimensionnelle_non_standard_____niveau_du_vide_dans_l_image,F_MOINS_L_INFINI)));
                                        /* Niveau correspondant au "vide" dans l'album Argument (introduit le 20091206105641) et     */
                                        /* dans l'image Resultat...                                                                  */
                                        /*                                                                                           */
                                        /* Le 20101008112709 la declaration 'Local' fut remplacee par 'Common'...                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____accepter_les_points_isoles,FAUX)));
                                        /* Introduit le 20190208151238...                                                            */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____minimum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____maximum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____minimum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____maximum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____minimum_de_coordonnee_Z
                           ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE,FRA10(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____maximum_de_coordonnee_Z
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
                                        /* Les bornes de renormalisation des coordonnees {X,Y,Z} ont ete introduites le              */
                                        /* 20160125104015...                                                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____exposant_du_niveau,FU)));
                                        /* L'exposant du niveau a ete introduit le 20091207082620...                                 */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____calculer_le_centre_de_gravite,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____utiliser_le_maximum_des_differences,VRAI)));
                                        /* Indicateurs de controle de calcul du gradient (introduits le 20091204134434).             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____eclairer_par_une_source_lumineuse,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____source_lumineuse_Z,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____source_lumineuse_specularite,FU)));
                                        /* L'eclairage a ete introduit le 20091123135737 et complete le 20091126135417 en ce         */
                                        /* qui concerne la specularite...                                                            */

#define   DEMI_DIMENSION(demi_dimension)                                                                                                \
                    COND(IL_FAUT(Iaccumulation_tri_dimensionnelle_non_standard_____eclairer_par_une_source_lumineuse)                   \
                        ,demi_dimension                                                                                                 \
                        ,ZERO                                                                                                           \
                         )                                                                                                              \
                                        /* Optimisation introduite le 20091126095840 afin de ne calculer que ce qui est vraiment     */ \
                                        /* necessaire...                                                                             */
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_X
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_Y
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_Z
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
                                        /* Le calcul du gradient a ete introduit le 20091123135737...                                */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ne_visualiser_que_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */
                                        /*                                                                                           */
                                        /* ATTENTION : en fait cette option est plus destinee a faire des tests afin de voir         */
                                        /* s'il y a effectivement des zones a gradient nul...                                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____visualiser_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005111632 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls et la          */
                                        /* seule solution semble de ne pas les visualiser...                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____seuil_du_niveau_courant,F_MOINS_L_INFINI)));
                                        /* Seuil introduit le 20091206104059...                                                      */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____cumuler_le_niveau_courant,VRAI)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____cumuler_le_niveau_lumineux,FAUX)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____cumuler_les_coordonnees_XYZ,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_Z,FZERO)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____cumuler_les_coordonnees_RPT,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_R,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_P,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____ponderation_de_la_coordonnees_T,FZERO)));
                                        /* Ponderations du niveau de marquage de 'imageR'...                                         */
                                        /*                                                                                           */
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____exposant_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____exposant_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____exposant_de_la_coordonnees_Z,FZERO)));
                                        /* Exposants des coordonnees {X,Y,Z} destines en particulier a faire du "depth-cueing" via   */
                                        /* la coordonnee 'Z' (introduits le 20091211211742).                                         */
                                        /*                                                                                           */
                                        /* Parametrage du "depth-cueing" :                                                           */
                                        /*                                                                                           */
                                        /*                  exposant_de_la_coordonnees_Z=0          pas de "depth-cueing",           */
                                        /*                  exposant_de_la_coordonnees_Z=1          "depth-cueing" maximal...        */
                                        /*                                                                                           */

DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____niveau_du_fond,NOIR)));
                                        /* Niveau du fond introduit le 20091212093827...                                             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____editer_gradient,FAUX)));
                                        /* Cette possibilite d'edition a ete introduite le 20210424174413...                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____editer_extrema_niveau_resultant,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____renormaliser_niveau_resultant,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____minimum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_____maximum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                            )
                 )
     );
                                        /* Introduit le 20111119114928 afin de pouvoir bloquer la renormalisation du niveau          */
                                        /* resultant (pour 'v $xiirv/STRU.d3.4.2' a cette date...).                                  */
                                        /*                                                                                           */
                                        /* Ceci fut complete le 20111121114056 par la possibilite de modifier les extrema            */
                                        /* {minimum_force_du_niveau_resultant,maximum_force_du_niveau_resultant} losrqu'il n'y a     */
                                        /* pas renormalisation et le 20111121120141 pour ce qui est de l'edition des extrema         */
                                        /* du niveau resultant...                                                                    */

#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_X)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_Y)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_____demi_dimension_de_calcul_du_gradient_Z)
                                        /* Dimension de la boite a utiliser.                                                         */

#define   ACCES_A_UN_POINT_DE_L_ALBUM(valeur,Xf,Yf,Zf)                                                                                  \
                    Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____optimisation_1))                                            \
                                        /* Test introduit le 20170829150744...                                                       */ \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                         \
                                            ,NomDeLaFonctionCourante QD@@__ _____renvoyer_le_niveau_maximal_de_albumA                   \
                                             );                                                                                         \
                                        /* Evidemment, cela n'a de sens que si 'FFAload_point_coordonnees_01_etendu(...)' est        */ \
                                        /* utilisee ci-apres...                                                                      */ \
                         EGAL(valeur                                                                                                    \
                             ,OPC14(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101128)                                 \
                                   ,FFAload_point_coordonnees_01                                                                        \
                                   ,FFAload_point_coordonnees_01_etendu                                                                 \
                                   ,albumA                                                                                              \
                                   ,Xf                                                                                                  \
                                   ,Yf                                                                                                  \
                                   ,Zf                                                                                                  \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image                                      \
                                    )                                                                                                   \
                              );                                                                                                        \
                                        /* Le 20101128092931 la fonction 'FFAload_point_coordonnees_01_etendu(...)' a remplace       */ \
                                        /* 'FFAload_point_coordonnees_01(...)'.                                                      */ \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                         \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                            ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                       \
                                             );                                                                                         \
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */ \
                         EGAL(valeur                                                                                                    \
                             ,AloadF_point_valide(albumA                                                                                \
                                                 ,_cDENORMALISE_OX(Xf)                                                                  \
                                                 ,_cDENORMALISE_OY(Yf)                                                                  \
                                                 ,_cDENORMALISE_OZ(Zf)                                                                  \
                                                  )                                                                                     \
                              );                                                                                                        \
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */ \
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */ \
                                        /* utilisees, sauf pour des tests...                                                         */ \
                         ESaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                             );                                                                                         \
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                        /* Acces au point courant {Xc,Yc,Zc} de l'album (introduit le 20091203102053 sous cette      */ \
                                        /* forme).                                                                                   */

DEFV(Common,DEFV(FonctionP,POINTERp(Iaccumulation_tri_dimensionnelle_non_standard(imageR,albumA))))
                                        /* Fonction introduite le 20091120192658...                                                  */
DEFV(Argument,DEFV(image,imageR));
                                        /* Image Resultat, tel que : imageR[X][Y]=albumA[diX[X][Y],diY[X][Y],diZ[X][Y]].             */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

#ifdef    GENERER_____Iaccumulation_tri_dimensionnelle_non_standard
     ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(NON_TEXTURAGE_D_UNE_ACCUMULATION);
                                        /* Le parametre 'NON_TEXTURAGE_D_UNE_ACCUMULATION' a ete introduit le 20100123111742...      */

#    undef     GENERER_____Iaccumulation_tri_dimensionnelle_non_standard
#Aifdef   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard
     PRINT_ATTENTION("provisoirement, cette fonction n'a pas ete generee");
#Eifdef   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard

     RETI(imageR);
     Eblock

#undef    ACCES_A_UN_POINT_DE_L_ALBUM

#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_X

#undef    DEMI_DIMENSION

#undef    NON_TEXTURAGE_D_UNE_ACCUMULATION

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   A V E C   T E X T U R A G E  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   XftAv                                                                                                                         \
                    f____cNORMALISE_OX(Xcentre)
#define   YftAv                                                                                                                         \
                    f____cNORMALISE_OY(Ycentre)
#define   ZftAv                                                                                                                         \
                    f____cNORMALISE_OZ(Zcentre)

#define   Xftc                                                                                                                          \
                    SOUS(coordonnee_X,XftAv)
#define   Yftc                                                                                                                          \
                    SOUS(coordonnee_Y,YftAv)
#define   Zftc                                                                                                                          \
                    SOUS(coordonnee_Z,ZftAv)

#define   XftAp                                                                                                                         \
                    ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OX,XftAv)
#define   YftAp                                                                                                                         \
                    ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OY,YftAv)
#define   ZftAp                                                                                                                         \
                    ADD2(NomDeLaFonctionCourante QD@@__ _____translation_OZ,ZftAv)
                                        /* Definitions introduites le 20100124084423 afin de pouvoir transformer geometriquement     */
                                        /* la texture comme l'album a accumuler...                                                   */

#define   Xtransforme                                                                                                                   \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211)                                            \
                        ,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Xftc,Yftc,Zftc                                                                \
                                                         ,XftAp                                                                         \
                                                          )                                                                             \
                        ,coordonnee_X                                                                                                   \
                         )
#define   Ytransforme                                                                                                                   \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211)                                            \
                        ,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Xftc,Yftc,Zftc                                                                \
                                                         ,YftAp                                                                         \
                                                          )                                                                             \
                        ,coordonnee_Y                                                                                                   \
                         )
#define   Ztransforme                                                                                                                   \
                    COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20091211)                                            \
                        ,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Xftc,Yftc,Zftc                                                                \
                                                         ,ZftAp                                                                         \
                                                          )                                                                             \
                        ,coordonnee_Z                                                                                                   \
                         )
                                        /* Definitions introduites le 20100702120259 pour prendre en compte 'compatibilite_20091211' */
                                        /* oubliee avant cette date...                                                               */

#define   TEXTURAGE_D_UNE_ACCUMULATION(valeur)                                                                                          \
                    BSaveModifyVariable(Logical                                                                                         \
                                       ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                               \
                                       ,NomDeLaFonctionCourante QD@@__ _____renvoyer_le_niveau_maximal_de_albumT                        \
                                        );                                                                                              \
                                        /* Evidemment, cela n'a de sens que si 'FAload_point_coordonnees_01_etendu(...)' est         */ \
                                        /* utilisee ci-apres...                                                                      */ \
                    EGAL(valeur                                                                                                         \
                        ,COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____texturer)                                                     \
                             ,______NORMALISE_NIVEAU                                                                                    \
                                  (COND(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20100625)                             \
                                       ,Aload_point_valide(albumT                                                                       \
                                                          ,_cDENORMALISE_OX(Xtransforme)                                                \
                                                          ,_cDENORMALISE_OY(Ytransforme)                                                \
                                                          ,_cDENORMALISE_OZ(Ztransforme)                                                \
                                                           )                                                                            \
                                       ,FAload_point_coordonnees_01_etendu                                                              \
                                            (albumT                                                                                     \
                                            ,Xtransforme                                                                                \
                                            ,Ytransforme                                                                                \
                                            ,Ztransforme                                                                                \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_periodiser_X                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_periodiser_Y                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_periodiser_Z                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_symetriser_X                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_symetriser_Y                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_symetriser_Z                                   \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_prolonger_X                                    \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_prolonger_Y                                    \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_prolonger_Z                                    \
                                            ,NomDeLaFonctionCourante QD@@__ _____texture_niveau_hors_image                              \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,FU                                                                                                        \
                              )                                                                                                         \
                         );                                                                                                             \
                    ESaveModifyVariable(Logical                                                                                         \
                                       ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                               \
                                        );                                                                                              \
                                        /* Acces a la texture introduite le 20100123114826. La possibilite d'interpoler fut          */ \
                                        /* introduite le 20100625090426 via 'FAload_point_coordonnees_01(...)'.                      */ \
                                        /*                                                                                           */ \
                                        /* Le 20100703111018 la fonction 'FAload_point_coordonnees_01_etendu(...)' a remplace        */ \
                                        /* 'FAload_point_coordonnees_01(...)' afin de supprimer l'interpolation dans le cas d'un     */ \
                                        /* ombrage car, en effet, l'interpolation perturbe la difference qui existe entre les zones  */ \
                                        /* eclairees et celles qui sont a la lumiere tel que 'v $xiii/di_album$FON AFombrage' les    */ \
                                        /* calcule. L'interpolation introduit (qu'elle soit bilineaire ou bicubique) des valeurs     */ \
                                        /* complement disparates et inexploitables...                                                */ \
                                        /*                                                                                           */ \
                                        /* Le 20101125212816 'Aload_point' fut remplace par 'Aload_point_valide(...)' plus correct.  */ \
                                        /*                                                                                           */ \
                                        /* Le 20101125215151 fut introduite la possibilite de ne pas texturer...                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   " S T A N D A R D "   A V E C   T E X T U R A G E  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20100120,FAUX)));
                                        /* Option de compatibilite introduite le 20100120135533 et concernant l'optimisation liee    */
                                        /* aux tests du 'Z-Buffer'...                                                                */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20091211,FAUX)));
                                        /* Option de compatibilite introduite le 20091211113702 et concernant la renormalisation     */
                                        /* des differentes contributions :                                                           */
                                        /*                                                                                           */
                                        /*                  niveau_courant_effectif                                                  */
                                        /*                  niveau_lumineux_effectif                                                 */
                                        /*                  coordonnee_X                                                             */
                                        /*                  coordonnee_Y                                                             */
                                        /*                  coordonnee_Z                                                             */
                                        /*                                                                                           */
                                        /* au niveau de visualisation. Avant cette date, elles n'etaient pas renormalisees, alors    */
                                        /* qu'apres, elles le sont (et sont donc positives ou nulles...).                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20101121,FAUX)));
                                        /* Option de compatibilite introduite le 20101121111043 et concernant l'elimination (ou      */
                                        /* plutot la non elimination si la compatibilite anterieure est demandee) des valeurs        */
                                        /* d'initialisation du 'Z-Buffer' apres sa generation...                                     */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20101125,FAUX)));
                                        /* Option de compatibilite introduite le 20101125125328 et concernant le test des valeurs    */
                                        /* de l'album afin d'eliminer les valeurs faibles ou negatives...                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20101127,FAUX)));
                                        /* Option de compatibilite introduite le 20101127082640 et concernant la coordonnee 'Z'      */
                                        /* utilisee pour le 'Z-Buffer'.                                                              */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20101128,FAUX)));
                                        /* Option de compatibilite introduite le 20101128150104 et destine a pouvoir ne pas          */
                                        /* utiliser les fonction de type '..._etendu(...)' pour 'ACCES_A_UN_POINT_DE_L_ALBUM(...)'.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20141004,FAUX)));
                                        /* Option de compatibilite introduite le 20141004183844 et destine a supprimer une           */
                                        /* nouvelle optimisation de parcours des albums...                                           */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20141005,FAUX)));
                                        /* Option de compatibilite introduite le 20141005111632 et destine a retablir la             */
                                        /* visualisation des gradients nuls a priori...                                              */
                                        /*                                                                                           */
                                        /* On notera le 20210420150901 que le non respect de cette compatibilite cree des problemes  */
                                        /* lorsque des sections n'ont qu'un plan d'epaisseur. Cela s'est vu a cette date lors du     */
                                        /* calcul de 'v $xiirc/MANF.D8.5.21' dans laquelle apparaissaient des contours filiformes    */
                                        /* non remplis ('v $xiirc/MANF.D8.5.NonCompatible_20160125.21'...).                          */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20160125,FAUX)));
                                        /* Option de compatibilite introduite le 20160125104015 et destine a retablir les            */
                                        /* bornes de renormalisation des coordonnees {X,Y,Z} anterieures a cette date...             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____optimisation_1,FAUX)));
                                        /* Option d'activation de l'optimisation de l'accumulation (introduite le 20170829150744).   */
                                        /*                                                                                           */
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */
                                        /* utilisees, sauf pour des tests...                                                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____avertir_coordonnees_hors_espace,VRAI)));
                                        /* Indicateur introduit le 20101206152939...                                                 */
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____renvoyer_le_niveau_maximal_de_albumA,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____renvoyer_le_niveau_maximal_de_albumT,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____niveau_flottant_hors_image,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */
                                        /*                                                                                           */
                                        /* On notera qu'il s'agit d'un 'genere_Float' (et non pas d'un 'genere_p' comme il           */
                                        /* conviendrait) a cause de 'v $xci/accumule.41$K GET_ARGUMENTS2_F..niveau_hors_image..'.    */
                                        /*                                                                                           */
                                        /* Les indicateurs du type '_____renvoyer_le_niveau_maximal_pour_album?' ont ete introduits  */
                                        /* le 20101129111412...                                                                      */
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____niveau_du_vide_dans_l_album,FZERO)));
DEFV(Local,DEFV(genere_Float,INIT(Iaccumulation_tri_dimensionnelle_standard_texturee_____niveau_du_vide_dans_l_image
                                 ,F_MOINS_L_INFINI
                                  )
                )
     );
                                        /* Niveau correspondant au "vide" dans l'album Argument et dans l'image Resultat...          */
                                        /*                                                                                           */
                                        /* Le 20101008112709 la declaration 'Local' fut remplacee par 'Common'...                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____accepter_les_points_isoles,FAUX)));
                                        /* Introduit le 20190208151238...                                                            */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____minimum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____maximum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____minimum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____maximum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____minimum_de_coordonnee_Z
                           ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE,FRA10(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____maximum_de_coordonnee_Z
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
                                        /* Les bornes de renormalisation des coordonnees {X,Y,Z} ont ete introduites le              */
                                        /* 20160125104015...                                                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____exposant_du_niveau,FU)));
                                        /* Exposant du niveau.                                                                       */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____calculer_le_centre_de_gravite,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____utiliser_le_maximum_des_differences,VRAI)));
                                        /* Indicateurs de controle de calcul du gradient.                                            */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____eclairer_par_une_source_lumineuse,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____source_lumineuse_Z,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____source_lumineuse_specularite,FU)));
                                        /* Definition de l'eclairage.                                                                */

#define   DEMI_DIMENSION(demi_dimension)                                                                                                \
                    COND(IL_FAUT(Iaccumulation_tri_dimensionnelle_standard_texturee_____eclairer_par_une_source_lumineuse)              \
                        ,demi_dimension                                                                                                 \
                        ,ZERO                                                                                                           \
                         )                                                                                                              \
                                        /* Optimisation destinee a ne calculer que ce qui est vraiment necessaire...                 */
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_X
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_Y
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_Z
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
                                        /* Calcul du gradient.                                                                       */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ne_visualiser_que_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */
                                        /*                                                                                           */
                                        /* ATTENTION : en fait cette option est plus destinee a faire des tests afin de voir         */
                                        /* s'il y a effectivement des zones a gradient nul...                                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____visualiser_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005111632 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls et la          */
                                        /* seule solution semble de ne pas les visualiser...                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____seuil_du_niveau_courant,F_MOINS_L_INFINI)));
                                        /* Seuil.                                                                                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____cumuler_le_niveau_courant,VRAI)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____cumuler_le_niveau_lumineux,FAUX)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____cumuler_les_coordonnees_XYZ,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_Z,FZERO)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____cumuler_les_coordonnees_RPT,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_R,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_P,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____ponderation_de_la_coordonnees_T,FZERO)));
                                        /* Ponderations du niveau de marquage de 'imageR'...                                         */
                                        /*                                                                                           */
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____exposant_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____exposant_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____exposant_de_la_coordonnees_Z,FZERO)));
                                        /* Exposants des coordonnees {X,Y,Z} destines en particulier a faire du "depth-cueing" via   */
                                        /* la coordonnee 'Z'.                                                                        */
                                        /*                                                                                           */
                                        /* Parametrage du "depth-cueing" :                                                           */
                                        /*                                                                                           */
                                        /*                  exposant_de_la_coordonnees_Z=0          pas de "depth-cueing",           */
                                        /*                  exposant_de_la_coordonnees_Z=1          "depth-cueing" maximal...        */
                                        /*                                                                                           */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____compatibilite_20100625,FAUX)));
                                        /* Option de compatibilite introduite le 20100625090426 et concernant l'acces a la texture.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texture_niveau_hors_image,NOIR)));
                                        /* Arguments implicites de 'FAload_point_coordonnees_01(...)'.                               */

DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____niveau_du_fond,NOIR)));
                                        /* Niveau du fond.                                                                           */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____editer_gradient,FAUX)));
                                        /* Cette possibilite d'edition a ete introduite le 20210424174413...                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____editer_extrema_niveau_resultant,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____renormaliser_niveau_resultant,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____minimum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____maximum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                            )
                 )
     );
                                        /* Introduit le 20111119114928 afin de pouvoir bloquer la renormalisation du niveau          */
                                        /* resultant (pour 'v $xiirv/STRU.d3.4.2' a cette date...).                                  */
                                        /*                                                                                           */
                                        /* Ceci fut complete le 20111121114056 par la possibilite de modifier les extrema            */
                                        /* {minimum_force_du_niveau_resultant,maximum_force_du_niveau_resultant} losrqu'il n'y a     */
                                        /* pas renormalisation et le 20111121120141 pour ce qui est de l'edition des extrema         */
                                        /* du niveau resultant...                                                                    */

#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_X)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_Y)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_standard_texturee_____demi_dimension_de_calcul_du_gradient_Z)
                                        /* Dimension de la boite a utiliser.                                                         */

#define   ACCES_A_UN_POINT_DE_L_ALBUM(valeur,Xf,Yf,Zf)                                                                                  \
                    Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____optimisation_1))                                            \
                                        /* Test introduit le 20170829150744...                                                       */ \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                          \
                                            ,NomDeLaFonctionCourante QD@@__ _____renvoyer_le_niveau_maximal_de_albumA                   \
                                             );                                                                                         \
                                        /* Evidemment, cela n'a de sens que si 'FAload_point_coordonnees_01_etendu(...)' est         */ \
                                        /* utilisee ci-apres...                                                                      */ \
                         EGAL(valeur                                                                                                    \
                             ,______NORMALISE_NIVEAU                                                                                    \
                                  (OPC14(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101128)                            \
                                        ,FAload_point_coordonnees_01                                                                    \
                                        ,FAload_point_coordonnees_01_etendu                                                             \
                                        ,albumA                                                                                         \
                                        ,Xf                                                                                             \
                                        ,Yf                                                                                             \
                                        ,Zf                                                                                             \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                               \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                \
                                        ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                \
                                        ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                           \
                                         )                                                                                              \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Le 20101128092931 la fonction 'FAload_point_coordonnees_01_etendu(...)' a remplace        */ \
                                        /* 'FAload_point_coordonnees_01(...)'.                                                       */ \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                          \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                            ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                       \
                                             );                                                                                         \
                         EGAL(valeur                                                                                                    \
                             ,Aload_point_valide(albumA                                                                                 \
                                                ,_cDENORMALISE_OX(Xf)                                                                   \
                                                ,_cDENORMALISE_OY(Yf)                                                                   \
                                                ,_cDENORMALISE_OZ(Zf)                                                                   \
                                                 )                                                                                      \
                              );                                                                                                        \
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */ \
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */ \
                                        /* utilisees, sauf pour des tests...                                                         */ \
                         ESaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                        /* Acces au point courant {Xc,Yc,Zc} de l'album.                                             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_standard_texturee_____texturer,VRAI)));
                                        /* Introduit le 20101125215151 pour faciliter les tests...                                   */

DEFV(Common,DEFV(FonctionP,POINTERp(Iaccumulation_tri_dimensionnelle_standard_texturee(imageR,albumA,albumT))))
                                        /* Fonction introduite le 20100123114826...                                                  */
DEFV(Argument,DEFV(image,imageR));
                                        /* Image Resultat, tel que : imageR[X][Y]=albumA[diX[X][Y],diY[X][Y],diZ[X][Y]].             */
DEFV(Argument,DEFV(album,albumA));
                                        /* Image Argument.                                                                           */
DEFV(Argument,DEFV(album,albumT));
                                        /* Album Argument definissant la texture.                                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

#ifdef    GENERER_____Iaccumulation_tri_dimensionnelle_standard_texturee
     ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(TEXTURAGE_D_UNE_ACCUMULATION);

#    undef     GENERER_____Iaccumulation_tri_dimensionnelle_standard_texturee
#Aifdef   GENERER_____Iaccumulation_tri_dimensionnelle_standard_texturee
     PRINT_ATTENTION("provisoirement, cette fonction n'a pas ete generee");
#Eifdef   GENERER_____Iaccumulation_tri_dimensionnelle_standard_texturee

     RETI(imageR);
     Eblock

#undef    ACCES_A_UN_POINT_DE_L_ALBUM

#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_X

#undef    DEMI_DIMENSION

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   S I M P L E   T R I D I M E N S I O N N E L L E                                                  */
/*        D ' U N   A L B U M   " N O N   S T A N D A R D "   A V E C   T E X T U R A G E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20100120,FAUX)));
                                        /* Option de compatibilite introduite le 20100120135533 et concernant l'optimisation liee    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20091211,FAUX)));
                                        /* Option de compatibilite introduite le 20091211113702 et concernant la renormalisation     */
                                        /* des differentes contributions :                                                           */
                                        /*                                                                                           */
                                        /*                  niveau_courant_effectif                                                  */
                                        /*                  niveau_lumineux_effectif                                                 */
                                        /*                  coordonnee_X                                                             */
                                        /*                  coordonnee_Y                                                             */
                                        /*                  coordonnee_Z                                                             */
                                        /*                                                                                           */
                                        /* au niveau de visualisation. Avant cette date, elles n'etaient pas renormalisees, alors    */
                                        /* qu'apres, elles le sont (et sont donc positives ou nulles...).                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20101008,FAUX)));
                                        /* Option de compatibilite introduite le 20101008114405 et concernant la detection du        */
                                        /* vide soit par un test 'IFNE(...)' (situation anterieure au 20101008114405), soit par      */
                                        /* test 'IFGT(...)' (situation nouvelle).                                                    */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20101121,FAUX)));
                                        /* Option de compatibilite introduite le 20101121111043 et concernant l'elimination (ou      */
                                        /* plutot la non elimination si la compatibilite anterieure est demandee) des valeurs        */
                                        /* d'initialisation du 'Z-Buffer' apres sa generation...                                     */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20101125,FAUX)));
                                        /* Option de compatibilite introduite le 20101125125328 et concernant le test des valeurs    */
                                        /* de l'album afin d'eliminer les valeurs faibles ou negatives...                            */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20101127,FAUX)));
                                        /* Option de compatibilite introduite le 20101127082640 et concernant la coordonnee 'Z'      */
                                        /* utilisee pour le 'Z-Buffer'.                                                              */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20101128,FAUX)));
                                        /* Option de compatibilite introduite le 20101128150104 et destine a pouvoir ne pas          */
                                        /* utiliser les fonction de type '..._etendu(...)' pour 'ACCES_A_UN_POINT_DE_L_ALBUM(...)'.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20141004,FAUX)));
                                        /* Option de compatibilite introduite le 20141004183844 et destine a supprimer une           */
                                        /* nouvelle optimisation de parcours des albums...                                           */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20141005,FAUX)));
                                        /* Option de compatibilite introduite le 20141005111632 et destine a retablir la             */
                                        /* visualisation des gradients nuls a priori...                                              */
                                        /*                                                                                           */
                                        /* On notera le 20210420150901 que le non respect de cette compatibilite cree des problemes  */
                                        /* lorsque des sections n'ont qu'un plan d'epaisseur. Cela s'est vu a cette date lors du     */
                                        /* calcul de 'v $xiirc/MANF.D8.5.21' dans laquelle apparaissaient des contours filiformes    */
                                        /* non remplis ('v $xiirc/MANF.D8.5.NonCompatible_20160125.21'...).                          */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20160125,FAUX)));
                                        /* Option de compatibilite introduite le 20160125104015 et destine a retablir les            */
                                        /* bornes de renormalisation des coordonnees {X,Y,Z} anterieures a cette date...             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____optimisation_1,FAUX)));
                                        /* Option d'activation de l'optimisation de l'accumulation (introduite le 20170829150744).   */
                                        /*                                                                                           */
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */
                                        /* utilisees, sauf pour des tests...                                                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____avertir_coordonnees_hors_espace,VRAI)));
                                        /* Indicateur introduit le 20101206152939...                                                 */
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____translation_OX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____translation_OY,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____translation_OZ,FZERO)));
                                        /* Translations de la transformation geometrique tridimensionnelle...                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____renvoyer_le_niveau_maximal_de_albumA
                             ,FAUX
                              )
                 )
     );
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____renvoyer_le_niveau_maximal_de_albumT
                             ,FAUX
                              )
                 )
     );
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____niveau_flottant_hors_image,FZERO)));
                                        /* Arguments implicites de 'FFAload_point_coordonnees_01(...)'.                              */
                                        /*                                                                                           */
                                        /* Les indicateurs du type '_____renvoyer_le_niveau_maximal_pour_album?' ont ete introduits  */
                                        /* le 20101129111412...                                                                      */
DEFV(Common,DEFV(genere_Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____niveau_du_vide_dans_l_album,FZERO)));
DEFV(Local,DEFV(genere_Float,INIT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____niveau_du_vide_dans_l_image
                                 ,F_MOINS_L_INFINI
                                  )
                )
     );
                                        /* Niveau correspondant au "vide" dans l'album Argument et dans l'image Resultat...          */
                                        /*                                                                                           */
                                        /* Le 20101008112709 la declaration 'Local' fut remplacee par 'Common'...                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____accepter_les_points_isoles,FAUX)));
                                        /* Introduit le 20190208151238...                                                            */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____minimum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____maximum_de_coordonnee_X
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____minimum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MINIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____maximum_de_coordonnee_Y
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____minimum_de_coordonnee_Z
                           ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE,FRA10(AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____maximum_de_coordonnee_Z
                           ,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                            )
                 )
     );
                                        /* Les bornes de renormalisation des coordonnees {X,Y,Z} ont ete introduites le              */
                                        /* 20160125104015...                                                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____exposant_du_niveau,FU)));
                                        /* Exposant du niveau...                                                                     */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____calculer_le_centre_de_gravite,VRAI)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____utiliser_le_maximum_des_differences,VRAI)));
                                        /* Indicateurs de controle de calcul du gradient.                                            */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____eclairer_par_une_source_lumineuse,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____source_lumineuse_X,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____source_lumineuse_Y,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____source_lumineuse_Z,FU)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____source_lumineuse_specularite,FU)));
                                        /* Eclairage.                                                                                */

#define   DEMI_DIMENSION(demi_dimension)                                                                                                \
                    COND(IL_FAUT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____eclairer_par_une_source_lumineuse)          \
                        ,demi_dimension                                                                                                 \
                        ,ZERO                                                                                                           \
                         )                                                                                                              \
                                        /* Optimisation destinee a ne calculer que ce qui est vraiment necessaire...                 */
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_X
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_Y
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_Z
                              ,DEMI_DIMENSION_XYZ_MATRIX_CALCUL_GRADIENT
                               )
                 )
     );
                                        /* Calcul du gradient.                                                                       */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ne_visualiser_que_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005082626 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls...             */
                                        /*                                                                                           */
                                        /* ATTENTION : en fait cette option est plus destinee a faire des tests afin de voir         */
                                        /* s'il y a effectivement des zones a gradient nul...                                        */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____visualiser_les_gradients_nuls,FAUX)));
                                        /* Possibilite introduite le 20141005111632 lors du calcul de 'v $xiirf/FRB3.s7.1' ou        */
                                        /* apparaissaient des zones sur-lumineuses correspondant a des gradients nuls et la          */
                                        /* seule solution semble de ne pas les visualiser...                                         */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____seuil_du_niveau_courant,F_MOINS_L_INFINI)));
                                        /* Seuil.                                                                                    */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____cumuler_le_niveau_courant,VRAI)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____cumuler_le_niveau_lumineux,FAUX)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____cumuler_les_coordonnees_XYZ,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_Z,FZERO)));

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____cumuler_les_coordonnees_RPT,FAUX)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_R,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_P,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____ponderation_de_la_coordonnees_T,FZERO)));
                                        /* Ponderations du niveau de marquage de 'imageR'...                                         */
                                        /*                                                                                           */
                                        /* Les coordonnees 'RPT' (={Rho_3D,Phi_3D,Theta_3D}) ont ete introduites le 20200224131541.  */

DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____exposant_de_la_coordonnees_X,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____exposant_de_la_coordonnees_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____exposant_de_la_coordonnees_Z,FZERO)));
                                        /* Exposants des coordonnees {X,Y,Z} destines en particulier a faire du "depth-cueing" via   */
                                        /* la coordonnee 'Z'.                                                                        */
                                        /*                                                                                           */
                                        /* Parametrage du "depth-cueing" :                                                           */
                                        /*                                                                                           */
                                        /*                  exposant_de_la_coordonnees_Z=0          pas de "depth-cueing",           */
                                        /*                  exposant_de_la_coordonnees_Z=1          "depth-cueing" maximal...        */
                                        /*                                                                                           */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____compatibilite_20100625,FAUX)));
                                        /* Option de compatibilite introduite le 20100625090426 et concernant l'acces a la texture.  */
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_periodiser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_periodiser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_periodiser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_symetriser_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_symetriser_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_symetriser_Z,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_prolonger_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_prolonger_Y,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_prolonger_Z,FAUX)));
DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texture_niveau_hors_image,NOIR)));
                                        /* Arguments implicites de 'FAload_point_coordonnees_01(...)'.                               */

DEFV(Common,DEFV(genere_p,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____niveau_du_fond,NOIR)));
                                        /* Niveau du fond.                                                                           */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____editer_gradient,FAUX)));
                                        /* Cette possibilite d'edition a ete introduite le 20210424174413...                         */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____editer_extrema_niveau_resultant,FAUX)));
DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____renormaliser_niveau_resultant,VRAI)));
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____minimum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                            )
                 )
     );
DEFV(Common,DEFV(Float,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____maximum_force_du_niveau_resultant
                           ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                            )
                 )
     );
                                        /* Introduit le 20111119114928 afin de pouvoir bloquer la renormalisation du niveau          */
                                        /* resultant (pour 'v $xiirv/STRU.d3.4.2' a cette date...).                                  */
                                        /*                                                                                           */
                                        /* Ceci fut complete le 20111121114056 par la possibilite de modifier les extrema            */
                                        /* {minimum_force_du_niveau_resultant,maximum_force_du_niveau_resultant} losrqu'il n'y a     */
                                        /* pas renormalisation et le 20111121120141 pour ce qui est de l'edition des extrema         */
                                        /* du niveau resultant...                                                                    */

#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_X                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_X)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_Y)
#define   DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z                                                                                           \
                    DOUP(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____demi_dimension_de_calcul_du_gradient_Z)
                                        /* Dimension de la boite a utiliser.                                                         */

#define   ACCES_A_UN_POINT_DE_L_ALBUM(valeur,Xf,Yf,Zf)                                                                                  \
                    Test(IL_NE_FAUT_PAS(NomDeLaFonctionCourante QD@@__ _____optimisation_1))                                            \
                                        /* Test introduit le 20170829150744...                                                       */ \
                         Bblock                                                                                                         \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                         \
                                            ,NomDeLaFonctionCourante QD@@__ _____renvoyer_le_niveau_maximal_de_albumA                   \
                                             );                                                                                         \
                                        /* Evidemment, cela n'a de sens que si 'FFAload_point_coordonnees_01_etendu(...)' est        */ \
                                        /* utilisee ci-apres...                                                                      */ \
                         EGAL(valeur                                                                                                    \
                             ,OPC14(IL_FAUT(NomDeLaFonctionCourante QD@@__ _____compatibilite_20101128)                                 \
                                   ,FFAload_point_coordonnees_01                                                                        \
                                   ,FFAload_point_coordonnees_01_etendu                                                                 \
                                   ,albumA                                                                                              \
                                   ,Xf                                                                                                  \
                                   ,Yf                                                                                                  \
                                   ,Zf                                                                                                  \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_X                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_Y                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____periodiser_Z                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_X                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_Y                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____symetriser_Z                                                    \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_X                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_Y                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____prolonger_Z                                                     \
                                   ,NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image                                      \
                                    )                                                                                                   \
                              );                                                                                                        \
                                        /* Le 20101128092931 la fonction 'FFAload_point_coordonnees_01_etendu(...)' a remplace       */ \
                                        /* 'FFAload_point_coordonnees_01(...)'.                                                      */ \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal                         \
                                             );                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                                                                                                                        \
                         BSaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                            ,GENP(NomDeLaFonctionCourante QD@@__ _____niveau_flottant_hors_image)                       \
                                             );                                                                                         \
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */ \
                         EGAL(valeur                                                                                                    \
                             ,AloadF_point_valide(albumA                                                                                \
                                                 ,_cDENORMALISE_OX(Xf)                                                                  \
                                                 ,_cDENORMALISE_OY(Yf)                                                                  \
                                                 ,_cDENORMALISE_OZ(Zf)                                                                  \
                                                  )                                                                                     \
                              );                                                                                                        \
                                        /* On notera le 20170830091005 que cette optimisation (qui evite toutes les interpolations   */ \
                                        /* lors des acces a 'albumA') introduit evidemment des defauts et ne doit donc pas etre      */ \
                                        /* utilisees, sauf pour des tests...                                                         */ \
                         ESaveModifyVariable(genere_p                                                                                   \
                                            ,Niveau____hors_album                                                                       \
                                             );                                                                                         \
                                        /* ATTENTION : c'est bien 'genere_p' et non pas 'genere_Float', ce n'est pas une erreur...   */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                        /* Acces au point courant {Xc,Yc,Zc} de l'album.                                             */

DEFV(Common,DEFV(Logical,SINT(Iaccumulation_tri_dimensionnelle_non_standard_texturee_____texturer,VRAI)));
                                        /* Introduit le 20101125215151 pour faciliter les tests...                                   */

DEFV(Common,DEFV(FonctionP,POINTERp(Iaccumulation_tri_dimensionnelle_non_standard_texturee(imageR,albumA,albumT))))
                                        /* Fonction introduite le 20100123114826...                                                  */
DEFV(Argument,DEFV(image,imageR));
                                        /* Image Resultat, tel que : imageR[X][Y]=albumA[diX[X][Y],diY[X][Y],diZ[X][Y]].             */
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album Argument.                                                                           */
DEFV(Argument,DEFV(album,albumT));
                                        /* Album Argument definissant la texture.                                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

#ifdef    GENERER_____Iaccumulation_tri_dimensionnelle_non_standard_texturee
     ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM(TEXTURAGE_D_UNE_ACCUMULATION);

#    undef     GENERER_____Iaccumulation_tri_dimensionnelle_non_standard_texturee
#Aifdef   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard_texturee
     PRINT_ATTENTION("provisoirement, cette fonction n'a pas ete generee");
#Eifdef   GENERER_____Iaccumulation_tri_dimensionnelle_non_standard_texturee

     RETI(imageR);
     Eblock

#undef    ACCES_A_UN_POINT_DE_L_ALBUM

#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Z
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_Y
#undef    DIMENSION_DE_LA_BOITE_DU_GRADIENT_X

#undef    DEMI_DIMENSION

EFonctionP

#undef    Ztransforme
#undef    Ytransforme
#undef    Xtransforme

#undef    ZftAp
#undef    YftAp
#undef    XftAp

#undef    Zftc
#undef    Yftc
#undef    Xftc

#undef    ZftAv
#undef    YftAv
#undef    XftAv

#undef    TEXTURAGE_D_UNE_ACCUMULATION

#undef    ACCUMULATION_TRI_DIMENSIONNELLE_D_UN_ALBUM

#undef    CHECK_COORDONNEE

#undef    PAS_DE_TEXTURE
#undef    PAS_ENCORE_DE_TEXTURE

#undef    Zf_DU_POINT_COURANT_POUR_LE_Z_BUFFER
#undef    Zf_DU_POINT_COURANT
#undef    Yf_DU_POINT_COURANT
#undef    Xf_DU_POINT_COURANT

#undef    CALCUL_DU_NIVEAU

#undef    ACCES_MATRIX_CALCUL_GRADIENT

#undef    Zb
#undef    Yb
#undef    Xb

#undef    Zfc
#undef    Yfc
#undef    Xfc

#undef    ZC
#undef    YC
#undef    XC

_______________________________________________________________________________________________________________________________________



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.