/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   D ' U N E   S E R I E   D ' I M A G E S                                                          */
/*        D U   T Y P E   " M A S Q U A G E "  :                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande "accumule" une serie d'images                                                                   */
/*                  en effectuant l'operation suivante ('i' designant                                                                */
/*                  un indice de parcours de la liste 'Image') :                                                                     */
/*                                                                                                                                   */
/*                                      Cumul <-- Cumul masquant Image(i) en depth-cueing (binarise ou pas)                          */
/*                                                                                                                                   */
/*                  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), cet ordre pouvant etre inverse, soit :                                                */
/*                                                                                                                                   */
/*                            inverser=FAUX (par defaut) :                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                           ---------------------------------------                                 */
/*                                                          |image 1                                |                                */
/*                                                        . |                                     . |                                */
/*                                                          |                                       |                                */
/*                                                      .   |                                   .   |                                */
/*                                                          |                                       |                                */
/*                                                    .     |                                 .     |                                */
/*                                                          |                                       |                                */
/*                                                  .       |                               .       |                                */
/*                                                          |                                       |                                */
/*                                                 ---------------------------------------          |                                */
/*                                                |image N-2                              |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                            ---------------------------------------     |         |                                */
/*                                           |image N-1                              |    |---------                                 */
/*                                           |                                       |    |                                          */
/*                                           |                                       |    |       .                                  */
/*                                           |                                       |    |                                          */
/*                                       ---------------------------------------     |    |     .                                    */
/*                                      |image N                                |    |    |                                          */
/*                                      |                                       |    |    |   .                                      */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |    | .                                        */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |----                                           */
/*                                      |                                       |    |                                               */
/*                                      |                                       |----                                                */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                       ---------------------------------------                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                            inverser=VRAI :                                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                           ---------------------------------------                                 */
/*                                                          |image N                                |                                */
/*                                                        . |                                     . |                                */
/*                                                          |                                       |                                */
/*                                                      .   |                                   .   |                                */
/*                                                          |                                       |                                */
/*                                                    .     |                                 .     |                                */
/*                                                          |                                       |                                */
/*                                                  .       |                               .       |                                */
/*                                                          |                                       |                                */
/*                                                 ---------------------------------------          |                                */
/*                                                |image 3                                |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                                |                                       |         |                                */
/*                                            ---------------------------------------     |         |                                */
/*                                           |image 2                                |    |---------                                 */
/*                                           |                                       |    |                                          */
/*                                           |                                       |    |       .                                  */
/*                                           |                                       |    |                                          */
/*                                       ---------------------------------------     |    |     .                                    */
/*                                      |image 1                                |    |    |                                          */
/*                                      |                                       |    |    |   .                                      */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |    | .                                        */
/*                                      |                                       |    |    |                                          */
/*                                      |                                       |    |----                                           */
/*                                      |                                       |    |                                               */
/*                                      |                                       |----                                                */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                      |                                       |                                                    */
/*                                       ---------------------------------------                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Note sur l'eclairage :                                                                                                     */
/*                                                                                                                                   */
/*                    Pour generer un objet eclaire (ou du moins pour                                                                */
/*                  simuler l'eclairage), il suffira de transformer au                                                               */
/*                  prealable toutes les images a accumuler par l'une                                                                */
/*                  des deux commandes suivantes :                                                                                   */
/*                                                                                                                                   */
/*                                      $xci/solarise.11$Z                                                                           */
/*                                      $xci/solarise.12$Z                                                                           */
/*                                                                                                                                   */
/*                  sachant que la seconde est plus "souple" car elle                                                                */
/*                  permet de reorienter la source lumineuse grace a ces                                                             */
/*                  deux parametres 'horizontal' et 'vertical' utilises                                                              */
/*                  pour le calcul de la derivee du champ...                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Note sur la generation de couples stereoscopiques :                                                                        */
/*                                                                                                                                   */
/*                    Pour generer un couple stereoscopique, il                                                                      */
/*                  suffit de faire deux fois l'accumulation,                                                                        */
/*                  c'est-a-dire une fois pour chaque oeil, avec                                                                     */
/*                  les parametres suivants (pour 128 images) :                                                                      */
/*                                                                                                                                   */
/*                                      $DROITE : translation_quelconque=VRAI try=0 trx=+5.0e-4                                      */
/*                                      $GAUCHE : translation_quelconque=VRAI try=0 trx=-5.0e-4                                      */
/*                                                                                                                                   */
/*                  ou plus simple :                                                                                                 */
/*                                                                                                                                   */
/*                                      $DROITE : translation_quelconque=VRAI stereo=+0.5                                            */
/*                                      $GAUCHE : translation_quelconque=VRAI stereo=-0.5                                            */
/*                                                                                                                                   */
/*                  lorsque l'on empile d'arriere en avant. Il faut noter que pour                                                   */
/*                  generer la vue de l'oeil '$DROITE' il faut decaler a gauche, alors                                               */
/*                  que pour generer celle de l'oeil '$GAUCHE', il faut decaler a droite.                                            */
/*                  Les signes de "trx=" sont inverses, car en effet, la variable                                                    */
/*                  'RRtranslation' evolue a coup de 'DECR(...)', d'ou l'inversion des                                               */
/*                  signes de "trx=". De plus, et dans ces conditions, il faudra faire                                               */
/*                  tres ATTENTION au parametre "inverser=" (c'est-a-dire a la variable                                              */
/*                  'inverser_l_ordre_de_recuperation_des_images') qui alors a pour effet                                            */
/*                  de permuter les vues des deux yeux. On notera enfin que la translation                                           */
/*                  implicite 'trx' vaut :                                                                                           */
/*                                                                                                                                   */
/*                                        1                  -4          -4                                                          */
/*                                      ----- = 9.765625 x 10   ~ 10 x 10                                                            */
/*                                       512                                                                                         */
/*                                                                                                                                   */
/*                  la translation 'trx' utilisee est donc choisie egale a la moitie de                                              */
/*                  cette valeur (d'ou le "5.0e-4"). Pour plus de 128 images, il faudra                                              */
/*                  reduire 'trx', et pour moins de 128 images, il faudra l'augmenter.                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/accumule.02$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1990??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE
#include  image_image_QUAD_IMAGE_EXT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/sequence.01.I"

#define   INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES                                                                                   \
                    FAUX                                                                                                                \
                                        /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a :           */ \
                                        /*                                                                                           */ \
                                        /*                  FAUX    : l'image d'arriere-plan est la premiere de la liste,            */ \
                                        /*                  VRAI    : l'image d'arriere-plan est la derniere de la liste.            */ \
                                        /*                                                                                           */

#define   GERER_LA_TRANSPARENCE                                                                                                         \
                    FAUX                                                                                                                \
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') faire de la transparence au       */ \
                                        /* prealable ; celle-ci est faite dans les parties exterieures a 'MASQUE_IMAGES(...)'        */ \
                                        /* (c'est-a-dire dans les parties "masquees") de la meme facon que cela est fait dans        */ \
                                        /* 'v $xci/accumule.01$K').                                                                  */

#include  xci/accumule.03.I"

#define   FAIRE_UN_FILTRAGE_PASSE_BANDE                                                                                                 \
                    FAUX                                                                                                                \
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') faire un filtrage "passe-bande"   */ \
                                        /* de l'image ce qui permet alors d'extraire des "iso-surfaces"...                           */
#define   FORCER_LE_NOIR                                                                                                                \
                    VRAI                                                                                                                \
                                        /* Cet indicateur precise la methode de visualisation de ce qui est exclu :                  */ \
                                        /*                                                                                           */ \
                                        /*                  VRAI    : on utilise respectivement 'NIVEAU_PASSE_BANDE_INFERIEUR' et    */ \
                                        /*                           'NIVEAU_PASSE_BANDE_SUPERIEUR',                                 */ \
                                        /*                  FAUX    : on utilise respectivement 'PRED(seuil_inferieur)' et           */ \
                                        /*                           'SUCC(seuil_superieur)'.                                        */ \
                                        /*                                                                                           */ \
                                        /* dans le cas d'un filtrage "passe-bande".                                                  */
#define   SEUIL_INFERIEUR                                                                                                               \
                    SUCC(SUCC(NOIR))                                                                                                    \
                                        /* Seuil inferieur du filtre "passe-bande",                                                  */
#define   SEUIL_SUPERIEUR                                                                                                               \
                    PRED(PRED(BLANC))                                                                                                   \
                                        /* Seuil superieur du filtre "passe-bande",                                                  */

#define   COMPLEMENTER_LE_MASQUE                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') complementer le masque.           */

#define   INTERPOLER_LE_SEUIL_DE_MASQUAGE                                                                                               \
                    FAUX
#define   SEUIL_DE_MASQUAGE_DE_DEPART                                                                                                   \
                    NOIR
#define   SEUIL_DE_MASQUAGE_D_ARRIVEE                                                                                                   \
                    BLANC
                                        /* Faut-il interpoler le seuil de masquage ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit   */
                                        /* le 20020308145352.                                                                        */

#define   CALCULER_LE_SEUIL_DE_MASQUAGE                                                                                                 \
                    FAUX                                                                                                                \
                                        /* Faut-il calculer automatiquement ('VRAI') le seuil de masquage a l'aide de l'histogramme  */ \
                                        /* "cumule" ou bien le fixer a priori ('FAUX'). Ceci n'a de sens que dans le cas ou          */ \
                                        /* 'IL_NE_FAUT_PAS(interpoler_le_seuil_de_masquage)'...                                      */
#define   FRACTION_DE_POINTS_POUR_CALCULER_LE_SEUIL_DE_MASQUAGE                                                                         \
                    FRA10(FU)                                                                                                           \
                                        /* Lorsqu'il faut calculer le seuil de masquage ce parametre donne le pourcentage des        */ \
                                        /* points a prendre en compte pour le masque.                                                */

#define   SEUIL_DE_MASQUAGE                                                                                                             \
                    GRIS                                                                                                                \
                                        /* Seuil de masquage.                                                                        */

#define   COMPATIBILITE_20091128                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet d'assurer la compatibilite anterieure au 20091128095646 si besoin est...           */
#define   BINARISER_LES_IMAGES                                                                                                          \
                    VRAI                                                                                                                \
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') binariser les images.             */

#define   PREMIERE_TRANCHE_VERTICALE                                                                                                    \
                    Zmin                                                                                                                \
                                        /* Premiere tranche verticale,                                                               */
#define   DERNIERE_TRANCHE_VERTICALE                                                                                                    \
                    Zmax                                                                                                                \
                                        /* Derniere tranche verticale.                                                               */

#include  xci/accumule.01.I"

#define   PAS_HORIZONTAL                                                                                                                \
                    _____lNORMALISE_OX(I_lHOMOTHETIE_Std_OX(PasX))
#define   PAS_VERTICAL                                                                                                                  \
                    _____lNORMALISE_OY(I_lHOMOTHETIE_Std_OY(PasY))
                                        /* Pas de decalage des differentes images...                                                 */
                                        /*                                                                                           */
                                        /* Le 20120212093853, les 'I_lHOMOTHETIE_Std_O?(...)'s  furent introduits...                 */

#define   MEMORISER_LE_Z_BUFFER                                                                                                         \
                    FAUX                                                                                                                \
                                        /* Indique si le 'Z-Buffer' doit etre fourni comme resultat ('VRAI'), ou bien oublie         */ \
                                        /* apres le calcul ('FAUX'). On notera que la sortie du 'Z-Buffer' peut etre redondante      */ \
                                        /* d'avec celle de l'accumulation proprement dite, mais que cela n'est plus vrai des que     */ \
                                        /* 'IL_NE_FAUT_PAS(binariser_les_images)'.                                                   */
#define   MEMORISER_LE_Z_BUFFER_COMME_UNE_IMAGE_STANDARD                                                                                \
                    VRAI                                                                                                                \
                                        /* Indique si le 'Z-Buffer' est fourni comme resultat, si ce dernier doit etre fourni en     */ \
                                        /* tant qu'image standard ('VRAI') ou pas ('FAUX').                                          */

#define   PRENDRE_LA_PARTIE_ENTIERE_DES_COORDONNEES                                                                                     \
                    FAUX                                                                                                                \
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') prendre la partie entiere de la   */ \
                                        /* variable 'tranche_verticale_courante'. Cette option, lorsqu'elle est 'VRAI' assure la     */ \
                                        /* compatibilite avec les executions anterieures au 1996052200 ; le 1996052300 elle a ete    */ \
                                        /* mise a l'etat 'FAUX' par defaut, puisque c'est le mode qui donne les meilleurs resultats. */ \
                                        /* On verra a ce propos les sequences :                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 6 2 / 023628_023755                                               */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 6 2 / 023884_024011                                               */ \
                                        /*                                                                                           */ \
                                        /* qui illustrent parfaitement le probleme...                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/accumule.02.I"
#include  xci/accumule.04.I"

#define   NOM_DE_L_IMAGE_COURANTE(nom_de_la_racine,nombre_de_chiffres,nom_postfixe)                                                     \
                    Bblock                                                                                                              \
                    EGAL(nom_image                                                                                                      \
                        ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE)                                                                  \
                             ,chain_Aconcaten2_sauf_nom_pipe(nom_de_la_racine                                                           \
                                                            ,chain_numero_modulo(NUMERO_D_IMAGE,nombre_de_chiffres)                     \
                                                             )                                                                          \
                             ,chain_Aconcaten3_sauf_nom_pipe(nom_de_la_racine                                                           \
                                                            ,chain_numero_modulo(NUMERO_D_IMAGE,nombre_de_chiffres)                     \
                                                            ,nom_postfixe                                                               \
                                                             )                                                                          \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Le 20221212114236, 'chain_numero_modulo(...)' a remplace 'chain_numero(...)'...           */ \
                    Eblock                                                                                                              \
                                        /* Generation de 'nom_image'...                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   D ' U N E   S E R I E   D ' I M A G E S                                                          */
/*        D U   T Y P E   " M A S Q U A G E "  :                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
                                        /* Nom de la sequence a integrer.                                                            */
     DEFV(CHAR,INIC(POINTERc(nom_postfixe_pour_nom_imageA),NOM_UNDEF_VIDE));
                                        /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */
     DEFV(Int,INIT(nombre_de_chiffres_pour_nom_imageA,NOMBRE_DE_CHIFFRES));
                                        /* Nombre de chiffres codant le numero des images de la serie...                             */

     DEFV(CHAR,INIC(POINTERc(nom_imageC),NOM_PIPE));
                                        /* Nom de l'eventuel cache de chaque image (introduit le 20030515142626).                    */
     DEFV(CHAR,INIC(POINTERc(nom_postfixe_pour_nom_imageC),NOM_UNDEF_VIDE));
                                        /* Nom d'un eventuel postfixe a placer derriere <nom_imageC><numero> (par exemple '$ROUGE'). */
                                        /* Ceci a ete introduit le 20030526104937...                                                 */
     DEFV(Int,INIT(nombre_de_chiffres_pour_nom_imageC,NOMBRE_DE_CHIFFRES));
                                        /* Nombre de chiffres codant le numero des images de la serie (introduit le 20030526104937). */

     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
                                        /* Nom du Resultat de l'integration.                                                         */
     DEFV(CHAR,INIC(POINTERc(nom_imageZ),NOM_PIPE));
                                        /* Nom de l'eventuel 'Z-Buffer'.                                                             */

     DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
                                        /* Numero de la premiere image,                                                              */
     DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE));
                                        /* Numero de la derniere image.                                                              */
     DEFV(Int,INIT(translation_des_numeros_des_images,TRANSLATION_DES_NUMEROS_DES_IMAGES));
                                        /* Les numeros d'images peuvent etre translates. Lorsque tel est le cas, le numero           */
                                        /* d'image utilise est le numero translate modulo {premiere,derniere}.                       */
     DEFV(Logical,INIT(inverser_l_ordre_de_recuperation_des_images,INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES));
                                        /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a :           */
                                        /*                                                                                           */
                                        /*                  FAUX    : l'image d'arriere-plan est la premiere de la liste,            */
                                        /*                  VRAI    : l'image d'arriere-plan est la derniere de la liste.            */
                                        /*                                                                                           */
     DEFV(Int,INIT(numero_d_image,UNDEF));
                                        /* Numero de l'image courante.                                                               */
     DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
                                        /* Pas de passage d'un numero d'image a une autre.                                           */

     DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF));
                                        /* Nom courant des images.                                                                   */

     DEFV(Logical,INIT(gerer_la_transparence,GERER_LA_TRANSPARENCE));
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') faire de la transparence au       */
                                        /* prealable ; celle-ci est faite dans les parties exterieures a 'MASQUE_IMAGES(...)'        */
                                        /* (c'est-a-dire dans les parties "masquees") de la meme facon que cela est fait dans        */
                                        /* 'v $xci/accumule.01$K').                                                                  */
     DEFV(Float,INIT(facteur_d_attenuation,FACTEUR_D_ATTENUATION));
                                        /* Facteur destine a attenuer (eventuellement) les images, la premiere etant en general      */
                                        /* plus attenuee que la derniere, car elle correspond dans une sequence temporelle a un      */
                                        /* instant plus ancien (la valeur 'FU' correspond a l'absence...). On notera que si ce       */
                                        /* facteur est nul, il est alors calcule automatiquement de facon que :                      */
                                        /*                                                                                           */
                                        /*                                               (derniere_image - premiere_image + 1)       */
                                        /*                  BLANC*(facteur_d_attenuation)                                      = 1   */
                                        /*                                                                                           */
                                        /* ce qui permet d'exploiter au mieux la dynamique des niveaux de gris, la derniere image    */
                                        /* se trouvant tres pres du NOIR. A titre d'exemple, lors d'un calcul portant sur 128        */
                                        /* images, on a :                                                                            */
                                        /*                                                                                           */
                                        /*                  facteur_d_attenuation = 0.957633                                         */
                                        /*                                                                                           */
     DEFV(Logical,INIT(editer_le_facteur_d_attenuation,EDITER_LE_FACTEUR_D_ATTENUATION));
                                        /* Indique s'il faut editer ('VRAI') ou pas ('FAUX') le facteur d'attenuation ; cela n'a     */
                                        /* evidemment de sens que lorsque celui est nul, et donc calcule automatiquement...          */

     DEFV(Logical,INIT(rechercher_le_maximum,RECHERCHE_DU_MAXIMUM));
                                        /* Faut-il rechercher le maximum ('VRAI') ou proceder par cumul arithmetique ('FAUX') ?      */
     DEFV(Logical,INIT(en_fait_rechercher_le_minimum,EN_FAIT_RECHERCHE_DU_MINIMUM));
                                        /* Lorsque 'IL_FAUT(rechercher_le_maximum)', doit-on en fait chercher le minimum ('VRAI')    */
                                        /* ou bien (comme avant le 19990323143608) veritablement le maximum ('FAUX') ? On notera     */
                                        /* l'interet de cette option avec les images qui sont sur un fond BLANC (apres, par exemple, */
                                        /* l'intervention de '$xci/complement$X'). On verra avec interet 'v $xiirv/PART.41.1.0'.     */
     DEFV(Float,INIT(facteur_d_attenuation_courant,FLOT__UNDEF));
                                        /* Facteur d'attenuation de la couche courante qui vaut 'facteur_d_attenuation' eleve a      */
                                        /* une puissance qui est le rang de cette couche...                                          */

     DEFV(Logical,INIT(faire_un_filtrage_passe_bande,FAIRE_UN_FILTRAGE_PASSE_BANDE));
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') faire un filtrage "passe-bande"   */
                                        /* de l'image ce qui permet alors d'extraire des "iso-surfaces"...                           */
     DEFV(Logical,INIT(forcer_le_NOIR,FORCER_LE_NOIR));
                                        /* Cet indicateur precise la methode de visualisation de ce qui est exclu :                  */
                                        /*                                                                                           */
                                        /*                  VRAI    : on utilise respectivement 'NIVEAU_PASSE_BANDE_INFERIEUR' et    */
                                        /*                           'NIVEAU_PASSE_BANDE_SUPERIEUR',                                 */
                                        /*                  FAUX    : on utilise respectivement 'PRED(seuil_inferieur)' et           */
                                        /*                           'SUCC(seuil_superieur)'.                                        */
                                        /*                                                                                           */
                                        /* dans le cas d'un filtrage "passe-bande".                                                  */
     DEFV(genere_p,INIT(seuil_inferieur,SEUIL_INFERIEUR));
                                        /* Seuil inferieur du filtre "passe-bande",                                                  */
     DEFV(genere_p,INIT(seuil_superieur,SEUIL_SUPERIEUR));
                                        /* Seuil superieur du filtre "passe-bande",                                                  */

     DEFV(Logical,INIT(complementer_le_masque,COMPLEMENTER_LE_MASQUE));
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') complementer le masque.           */

     DEFV(Logical,INIT(interpoler_le_seuil_de_masquage,INTERPOLER_LE_SEUIL_DE_MASQUAGE));
     DEFV(genere_p,INIT(seuil_de_masquage_de_depart,SEUIL_DE_MASQUAGE_DE_DEPART));
     DEFV(genere_p,INIT(seuil_de_masquage_d_arrivee,SEUIL_DE_MASQUAGE_D_ARRIVEE));
                                        /* Faut-il interpoler le seuil de masquage ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit   */
                                        /* le 20020308145352.                                                                        */

     DEFV(Logical,INIT(calculer_le_seuil_de_masquage,CALCULER_LE_SEUIL_DE_MASQUAGE));
                                        /* Faut-il calculer automatiquement ('VRAI') le seuil de masquage a l'aide de l'histogramme  */
                                        /* "cumule" ou bien le fixer a priori ('FAUX'). Ceci n'a de sens que dans le cas ou          */
                                        /* 'IL_NE_FAUT_PAS(interpoler_le_seuil_de_masquage)'...                                      */
     DEFV(Float,INIT(fraction_de_points_pour_calculer_le_seuil_de_masquage
                    ,FRACTION_DE_POINTS_POUR_CALCULER_LE_SEUIL_DE_MASQUAGE
                     )
          );
                                        /* Lorsqu'il faut calculer le seuil de masquage ce parametre donne le pourcentage des        */
                                        /* points a prendre en compte pour le masque.                                                */

     DEFV(genere_p,INIT(seuil_de_masquage,SEUIL_DE_MASQUAGE));
                                        /* Seuil de masquage.                                                                        */
     DEFV(genere_p,INIT(seuil_de_masquage_utilise,NIVEAU_UNDEF));
                                        /* Seuil de masquage reellement utilise.                                                     */
     DEFV(Logical,INIT(compatibilite_20091128,COMPATIBILITE_20091128));
                                        /* Permet d'assurer la compatibilite anterieure au 20091128095646 si besoin est...           */
     DEFV(Logical,INIT(binariser_les_images,BINARISER_LES_IMAGES));
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') binariser les images.             */

     DEFV(Int,INIT(premiere_tranche_verticale,PREMIERE_TRANCHE_VERTICALE));
                                        /* Premiere tranche verticale,                                                               */
     DEFV(Int,INIT(derniere_tranche_verticale,DERNIERE_TRANCHE_VERTICALE));
                                        /* Derniere tranche verticale.                                                               */
     DEFV(Float,INIT(tranche_verticale_courante,FLOT__UNDEF));
                                        /* Tranche verticale courante,                                                               */
     DEFV(Float,INIT(pas_des_tranches_verticales,FLOT__UNDEF));
                                        /* Et le pas qui les separe...                                                               */

     DEFV(Logical,INIT(prendre_la_partie_entiere_des_coordonnees,PRENDRE_LA_PARTIE_ENTIERE_DES_COORDONNEES));
                                        /* Indicateur precisant s'il faut ('VRAI') ou pas ('FAUX') prendre la partie entiere de la   */
                                        /* variable 'tranche_verticale_courante'. Cette option, lorsqu'elle est 'VRAI' assure la     */
                                        /* compatibilite avec les executions anterieures au 1996052200 ; le 1996052300 elle a ete    */
                                        /* mise a l'etat 'FAUX' par defaut, puisque c'est le mode qui donne les meilleurs resultats. */
                                        /* On verra a ce propos les sequences :                                                      */
                                        /*                                                                                           */
                                        /*                  xivPdf 6 2 / 023628_023755                                               */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  xivPdf 6 2 / 023884_024011                                               */
                                        /*                                                                                           */
                                        /* qui illustrent parfaitement le probleme...                                                */
     DEFV(deltaF_2D,Atranslation);
     DEFV(deltaF_2D,RAtranslation);
     DEFV(deltaF_2D,RRtranslation);
                                        /* Translation verticale d'empilement des images...                                          */
     DEFV(Logical,INIT(translation_quelconque,TRANSLATION_QUELCONQUE));
                                        /* Choix de la methode de translation de passage d'une couche a l'autre :                    */
                                        /*                                                                                           */
                                        /* FAUX : on utilise 'Itranslation(...)' qui est plus rapide,                                */
                                        /* VRAI : on utilise 'Irotation_image(...)' qui est plus lent, mais presente l'avantage de   */
                                        /*        permettre de faire une translation quelconque, et en particulier d'une fraction    */
                                        /*        de point, ce qui autorise la production de couples stereoscopiques...              */
                                        /*                                                                                           */
                                        /* ATTENTION, ce parametre est ignore des que 'facteur_stereoscopique' est non nul...        */
     DEFV(Logical,INIT(faire_une_complementation,FAIRE_UNE_COMPLEMENTATION));
                                        /* Faut-il faire une complementation ('VRAI') ou pas ('FAUX') ? Ceci a ete introduit le      */
                                        /* 20030317143126.                                                                           */
     DEFV(Logical,INIT(faire_une_symetrie_OX,FAIRE_UNE_SYMETRIE_OX));
     DEFV(Logical,INIT(faire_une_symetrie_OY,FAIRE_UNE_SYMETRIE_OY));
                                        /* Faut-il faire des symetries ('VRAI') ou pas ('FAUX') ?                                    */
     DEFV(Float,INIT(pas_horizontal,FLOT__UNDEF));
     DEFV(Float,INIT(pas_vertical,FLOT__UNDEF));
                                        /* Pas de variation de la translation verticale d'empilement des images...                   */
     DEFV(Float,INIT(facteur_stereoscopique,FACTEUR_STEREOSCOPIQUE));
                                        /* Facteur destine a simplifier la production de couples stereoscopiques. En general, trois  */
                                        /* valeurs seront utiles :                                                                   */
                                        /*                                                                                           */
                                        /*                  FZERO                                                                    */
                                        /*                  NEUT(FU)                                                                 */
                                        /*                  NEGA(FU)                                                                 */
                                        /*                                                                                           */
     DEFV(Logical,INIT(memoriser_le_Z_Buffer,MEMORISER_LE_Z_BUFFER));
                                        /* Indique si le 'Z-Buffer' doit etre fourni comme resultat ('VRAI'), ou bien oublie         */
                                        /* apres le calcul ('FAUX'). On notera que la sortie du 'Z-Buffer' peut etre redondante      */
                                        /* d'avec celle de l'accumulation proprement dite, mais que cela n'est plus vrai des que     */
                                        /* 'IL_NE_FAUT_PAS(binariser_les_images)'.                                                   */
     DEFV(Logical,INIT(memoriser_le_Z_Buffer_comme_une_image_standard,MEMORISER_LE_Z_BUFFER_COMME_UNE_IMAGE_STANDARD));
                                        /* Indique si le 'Z-Buffer' est fourni comme resultat, si ce dernier doit etre fourni en     */
                                        /* tant qu'image standard ('VRAI') ou pas ('FAUX').                                          */
     DEFV(Int,INIT(coordonnee_z_de_depth_cueing,UNDEF));
                                        /* Coordonnee de "depth-cueing"...                                                           */
     /*..............................................................................................................................*/
#define   GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard                                                             \
                    "zbuffer_standard=""zBuffer_standard=""Zbuffer_standard=""ZBuffer_standard=""Z-Buffer_standard="                    \
                                        /* Afin de raccourcir une ligne suivante (introduit le 20070223105201)...                    */

     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20091128=",compatibilite_20091128);

                         GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("postfixeA=""postfixe=",nom_postfixe_pour_nom_imageA);
                         GET_ARGUMENT_C("imageC=""C=",nom_imageC);
                         GET_ARGUMENT_C("postfixeC=",nom_postfixe_pour_nom_imageC);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_C("imageZ=""Z=",nom_imageZ);
                         GET_ARGUMENT_I("premiere=",premiere_image);
                         GET_ARGUMENT_I("derniere=",derniere_image);
                         GET_ARGUMENT_I("pas=",pas_des_images);
                         GET_ARGUMENT_I("modulo=",translation_des_numeros_des_images);
                         GET_ARGUMENT_L("inverser=",inverser_l_ordre_de_recuperation_des_images);
                         GET_ARGUMENT_I("chiffresA=""chiffres=",nombre_de_chiffres_pour_nom_imageA);
                         GET_ARGUMENT_I("chiffresC=",nombre_de_chiffres_pour_nom_imageC);


                         GET_ARGUMENT_L("interpolation_cubique=""cubique=",Irotation_image_____interpolation_cubique);
                         GET_ARGUMENT_N("interpolation_lineaire=""lineaire=",Irotation_image_____interpolation_cubique);
                                        /* Arguments introduits le 20131230125403...                                                 */
                         GET_ARGUMENT_L("transparence=",gerer_la_transparence);
                         GET_ARGUMENT_F("fa=""attenuation=""a=",facteur_d_attenuation);
                         GET_ARGUMENT_L("editer=",editer_le_facteur_d_attenuation);
                         GET_ARGUMENT_L("maximum=""m=",rechercher_le_maximum);
                         GET_ARGUMENT_L("minimum=",en_fait_rechercher_le_minimum);
                         GET_ARGUMENT_L("passe_bande=""filtrage=",faire_un_filtrage_passe_bande);
                         GET_ARGUMENT_L("noir=""n=""NOIR=",forcer_le_NOIR);
                         GET_ARGUMENT_L("strict_gauche=",Ipasse_bande_____tests_stricts_a_gauche);
                         GET_ARGUMENT_L("strict_droite=",Ipasse_bande_____tests_stricts_a_droite);
                         GET_ARGUMENT_P("niveau_inferieur=",Ipasse_bande_____niveau_inferieur);
                         GET_ARGUMENT_P("niveau_superieur=",Ipasse_bande_____niveau_superieur);
                         GET_ARGUMENT_P("seuil_inferieur=""inf=",seuil_inferieur);
                         GET_ARGUMENT_P("sup=""seuil_superieur=",seuil_superieur);
                         GET_ARGUMENT_L("Mcomplementer=",complementer_le_masque);
                                        /* Le 20050623142816, "complementer=" a ete remplace par "Mcomplementer=" (double def...).   */
                         GET_ARGUMENT_L("interpoler_le_seuil=""interpoler=",interpoler_le_seuil_de_masquage);
                         GET_ARGUMENT_P("seuil_depart=""depart=",seuil_de_masquage_de_depart);
                         GET_ARGUMENT_P("seuil_arrivee=""arrivee=",seuil_de_masquage_d_arrivee);
                         GET_ARGUMENT_L("calculer_le_seuil=""calculer=",calculer_le_seuil_de_masquage);
                         GET_ARGUMENT_F("fraction=",fraction_de_points_pour_calculer_le_seuil_de_masquage);
                         GET_ARGUMENT_P("seuil=""masque=",seuil_de_masquage);
                         GET_ARGUMENT_L("binariser=",binariser_les_images);
                         GET_ARGUMENT_I("zmin=",premiere_tranche_verticale);
                         GET_ARGUMENT_I("zmax=",derniere_tranche_verticale);
                         GET_ARGUMENT_L("partie_entiere=",prendre_la_partie_entiere_des_coordonnees);
                         GET_ARGUMENT_L("translation_quelconque=""translation=""quelconque=",translation_quelconque);
                         GET_ARGUMENT_L("complementer=""complement=""comp=",faire_une_complementation);
                         GET_ARGUMENT_L("SX=",faire_une_symetrie_OX);
                         GET_ARGUMENT_L("SY=",faire_une_symetrie_OY);
                         GIT_ARGUMENT_F("trx=",pas_horizontal,PAS_HORIZONTAL);
                         GIT_ARGUMENT_F("try=",pas_vertical,PAS_VERTICAL);
                         GET_ARGUMENT_F("stereo=""Sfacteur=",facteur_stereoscopique);
                                        /* Le 20050623142816, "facteur=" a ete remplace par "Sfacteur=" (double definition...).      */
                         GET_ARGUMENT_F("Z0=",Z_Buffer_____valeur_initiale);
                         GET_ARGUMENT_L("zbuffer=""zBuffer=""Zbuffer=""ZBuffer=""Z-Buffer=",memoriser_le_Z_Buffer);
                         GET_ARGUMENT_L(GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard
                                       ,memoriser_le_Z_Buffer_comme_une_image_standard
                                        );
                         )
                    );
                                        /* ATTENTION, il y avait autrefois :                                                         */
                                        /*                                                                                           */
                                        /*                  GET_ARGUMENT_I("Zmin=",premiere_tranche_verticale);                      */
                                        /*                  GET_ARGUMENT_I("Zmax=",derniere_tranche_verticale);                      */
                                        /*                                                                                           */
                                        /* mais cela rentrait en conflit avec :                                                      */
                                        /*                                                                                           */
                                        /*                  GET_ARGUMENT_I("Zmin=",Zmin);                                         \  */
                                        /*                  GET_ARGUMENT_I("Zmax=",Zmax);                                         \  */
                                        /*                                                                                           */
                                        /* dans '$xig/fonct$vv$DEF' ; donc,                                                          */
                                        /*                                                                                           */
                                        /*                  "zmin="                                                                  */
                                        /*                  "zmax="                                                                  */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  "Zmin="                                                                  */
                                        /*                  "Zmax="                                                                  */
                                        /*                                                                                           */
                                        /* ne doivent pas etre confondus...                                                          */

#undef    GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard

     Test(IFEXff(fraction_de_points_pour_calculer_le_seuil_de_masquage
                ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                 )
          )
          Bblock
          PRINT_ATTENTION("la fraction de points pour calculer le seuil de masquage n'est pas dans [0,1]");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAL(seuil_de_masquage_utilise,seuil_de_masquage);
                                        /* A priori...                                                                               */

     Test(IFET(IL_NE_FAUT_PAS(translation_quelconque),IZEQ(facteur_stereoscopique)))
          Bblock
          Eblock
     ATes
          Bblock
          Test(IL_FAUT(memoriser_le_Z_Buffer))
               Bblock
               PRINT_ATTENTION("le 'Z-Buffer' ne va pas etre genere");
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     INITIALISATION_ACCROISSEMENT_2D(Atranslation
                                    ,FZERO
                                    ,FZERO
                                     );
     INITIALISATION_ACCROISSEMENT_2D(RAtranslation
                                    ,FZERO
                                    ,FZERO
                                     );
     INITIALISATION_ACCROISSEMENT_2D(RRtranslation
                                    ,NEUT(MUL2(VRAI_PAS_HORIZONTAL,MOIT(FLOT(LENG(premiere_image,derniere_image)))))
                                    ,NEUT(MUL2(VRAI_PAS_VERTICAL,MOIT(FLOT(LENG(premiere_image,derniere_image)))))
                                     );
                                        /* Definition de la translation d'empilement vertical des images. La valeur initiale de      */
                                        /* 'RRtranslation' est faite de facon a ce que le "centre" de l'objet tridimensionnel obtenu */
                                        /* par accumulation tombe au centre de l'image...                                            */

     Test(IFNE_chaine(nom_imageC,NOM_PIPE))
                                        /* La posssibilite de cacher une partie de chaque image a ete introduite le 20030515142626.  */
          Bblock
          CALi(Iblanc(ImageA7));
                                        /* Initialisation a priori du cache (au cas ou en particulier l'image 'nom_imageC'           */
                                        /* n'existerait pas...).                                                                     */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(gerer_la_transparence))
          Bblock
          Test(IZEQ(facteur_d_attenuation))
               Bblock
               EGAL(facteur_d_attenuation,PUIX(INVE(FLOT__BLANC),INVZ(FLOT(NBRE(premiere_image,derniere_image)))));
                                        /* Lorsque le facteur d'attenuation est nul, il est alors calcule automatiquement de         */
                                        /* facon que :                                                                               */
                                        /*                                                                                           */
                                        /*                                               (derniere_image - premiere_image + 1)       */
                                        /*                  BLANC.(facteur_d_attenuation)                                      = 1.  */
                                        /*                                                                                           */
                                        /* A titre d'exemple, lors d'un calcul portant sur 128 images, on a :                        */
                                        /*                                                                                           */
                                        /*                  facteur_d_attenuation = 0.957633                                         */
                                        /*                                                                                           */
               Test(IL_FAUT(editer_le_facteur_d_attenuation))
                    Bblock
                    CAL3(Prme1("facteur d'attenuation effectif : %.^^^\n",facteur_d_attenuation));
                                        /* Le 20060105154554, le format "16g" est passe a "^^g" pour plus de souplesse...            */
                                        /*                                                                                           */
                                        /* Le 20091123123155, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(rechercher_le_maximum),IL_FAUT(en_fait_rechercher_le_minimum)))
          Bblock
          CALi(Iblanc(ImageR));
                                        /* Initialisation de l'image Resultat.                                                       */
          Eblock
     ATes
          Bblock
          CALi(Inoir(ImageR));
                                        /* Initialisation de l'image Resultat.                                                       */
          Eblock
     ETes

     EGAL(tranche_verticale_courante
         ,FLOT(COND(IFGT(derniere_image,premiere_image)
                   ,premiere_tranche_verticale
                   ,derniere_tranche_verticale
                    )
               )
          );
                                        /* Initialisation de la tranche verticale courante,                                          */
     EGAL(pas_des_tranches_verticales
         ,DIVZ(FLOT(SOUS(derniere_tranche_verticale,premiere_tranche_verticale))
              ,FLOT(DIVZ(SOUS(derniere_image,premiere_image)
                        ,pas_des_images
                         )
                    )
               )
          );
     EGAL(pas_des_tranches_verticales
         ,COND(IL_FAUT(prendre_la_partie_entiere_des_coordonnees)
              ,INTE(pas_des_tranches_verticales)
              ,NEUT(pas_des_tranches_verticales)
               )
          );
                                        /* Et de son pas...                                                                          */

     DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
          Bblock
          NOM_DE_L_IMAGE_COURANTE(nom_imageA,nombre_de_chiffres_pour_nom_imageA,nom_postfixe_pour_nom_imageA);

          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA5,nom_image))))
               Bblock
                                        /* 'ImageA5' donne la couche a l'instant courant.                                            */
               Test(IFNE_chaine(nom_imageC,NOM_PIPE))
                                        /* La posssibilite de cacher une partie de chaque image a ete introduite le 20030515142626,  */
                                        /* avec une extension le 20030526104937 en faisant de 'nom_imageC' une eventuelle serie      */
                                        /* d'images (suivant la valeur de 'nombre_de_chiffres_pour_nom_imageC'...).                  */
                    Bblock
                    NOM_DE_L_IMAGE_COURANTE(nom_imageC,nombre_de_chiffres_pour_nom_imageC,nom_postfixe_pour_nom_imageC);

                    Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA7,nom_image))))
                                        /* ATTENTION : on notera que si 'nombre_de_chiffres_pour_nom_imageC' est nul, on charge      */
                                        /* ainsi de nombreuses fois la meme image, mais je ne veux pas optimiser...                  */
                         Bblock
                         Eblock
                    ATes
                         Bblock
                                        /* ATTENTION : on notera que si l'image courante 'nom_image' n'existe pas, alors 'ImageA7'   */
                                        /* garde la valeur anterieure (soit 'BLANC' la premiere fois et l'image precedente de la     */
                                        /* sequence les fois suivantes...).                                                          */
                         Test__CODE_ERREUR__ERREUR07;
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               CALi(Inoir(ImageA6));
                                        /* On ne sait jamais...                                                                      */

               Test(IL_FAUT(faire_une_complementation))
                    Bblock
                    CALS(Icomplementation(ImageA6,ImageA5));
                    CALS(Imove(ImageA5,ImageA6));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(faire_une_symetrie_OX))
                    Bblock
                    CALS(Ix_symetrie(ImageA6,ImageA5));
                    CALS(Imove(ImageA5,ImageA6));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(faire_une_symetrie_OY))
                    Bblock
                    CALS(Iy_symetrie(ImageA6,ImageA5));
                    CALS(Imove(ImageA5,ImageA6));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(faire_un_filtrage_passe_bande))
                    Bblock
                    CALS(Ipasse_bande(ImageA6,ImageA5,seuil_inferieur,seuil_superieur,forcer_le_NOIR));
                    CALS(Imove(ImageA5,ImageA6));
                                        /* Un filtrage passe-bande permet de generer des "iso-surfaces"...                           */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFNE_chaine(nom_imageC,NOM_PIPE))
                    Bblock
                    CALS(Iand(ImageA6,ImageA5,ImageA7));
                    CALS(Imove(ImageA5,ImageA6));
                                        /* La posssibilite de cacher une partie de chaque image a ete introduite le 20030515142626.  */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(complementer_le_masque))
                    Bblock
                    CALS(Icomplementation(Masque,ImageA5));
                                        /* Lorsque le masque est a complementer, il est identique a la couche courante inversee...   */
                    Eblock
               ATes
                    Bblock
                    CALS(Imove(Masque,ImageA5));
                                        /* Lorsque le masque n'est pas a complementer, il est identique a la couche courante...      */
                    Eblock
               ETes

               Test(IL_FAUT(gerer_la_transparence))
                    Bblock
                    EGAL(facteur_d_attenuation_courant,facteur_d_attenuation);
                                        /* Facteur d'attenuation de la couche courante qui vaut 'facteur_d_attenuation' eleve a      */
                                        /* une puissance qui est le rang de cette couche...                                          */
                                        /*                                                                                           */
                                        /* ATTENTION, sur 'v $xci/accumule.01$K', on trouve ici :                                    */
                                        /*                                                                                           */
                                        /*                  EGAL(facteur_d_attenuation_courant                                       */
                                        /*                      ,PUIX(facteur_d_attenuation                                          */
                                        /*                           ,ATTENUATION(facteur_A                                          */
                                        /*                                       ,SOUS(derniere_image,numero_d_image)                */
                                        /*                                       ,facteur_B                                          */
                                        /*                                        )                                                  */
                                        /*                            )                                                              */
                                        /*                       );                                                                  */
                                        /*                                                                                           */
                                        /* car en effet, le facteur 'facteur_d_attenuation' n'est pas applique de facon iterative    */
                                        /* alors qu'ici il l'est (il suffit de voir pour cela ce qui est fait de 'ImageR' ci-apres). */

                    CALi(Inoir(ImageA6));
                                        /* Nettoyage systematique de 'ImageA6' a cause du fait que la translation peut etre non      */
                                        /* nulle (on risque alors de recuperer des morceaux du contenu anterieur de 'ImageA6').      */

                    Test(IFET(IL_NE_FAUT_PAS(translation_quelconque),IZEQ(facteur_stereoscopique)))
                         Bblock
                         CALS(Itranslation(ImageA6
                                          ,Masque
                                          ,ADRESSE(RRtranslation)
                                          ,FAUX
                                          ,FAUX
                                           )
                              );
                                        /* Et on decale l'image courante...                                                          */
                         Eblock
                    ATes
                         Bblock
                         CALS(Irotation_image(ImageA6
                                             ,Masque
                                             ,VRAI
                                             ,ADRESSE(RRtranslation),ADRESSE(RAtranslation),ADRESSE(Atranslation)
                                             ,FZERO
                                             ,VRAI
                                              )
                              );
                                        /* Et on decale l'image courante. ATTENTION, rappelons que 'Irotation_image(...)' fait       */
                                        /* appel a 'Ifloat_std(...)' ce qui peut creer des messages d'erreur lorsqu'une image que    */
                                        /* l'on va accumuler est 'NOIR' ; en effet, on trouve alors :                                */
                                        /*                                                                                           */
                                        /*        ATTENTION : Ifloat_std : les niveaux 'minimal' et 'maximal' sont egaux...          */
                                        /*                                                                                           */
                                        /* qui n'a rien a voir avec les appels suivants a 'Ifloat_std(...)'...                       */
                         Eblock
                    ETes

                    Test(IL_FAUT(rechercher_le_maximum))
                         Bblock
                         CALS(Iscale(ImageA6
                                    ,facteur_d_attenuation_courant
                                    ,ImageA6
                                    ,FZERO
                                     )
                              );
                                        /* Attenuation eventuelle de la couche courante...                                           */

                         Test(IL_NE_FAUT_PAS(en_fait_rechercher_le_minimum))
                              Bblock
                              CALS(Imaximum(ImageR,ImageR,ImageA6));
                                        /* Et on cumule d'avant en arriere par recherche du maximum.                                 */
                              Eblock
                         ATes
                              Bblock
                              CALS(Iminimum(ImageR,ImageR,ImageA6));
                                        /* Et on cumule d'avant en arriere par recherche du minimum.                                 */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         CALS(Iinterpolation(ImageR
                                            ,COMP(facteur_d_attenuation_courant),ImageR
                                            ,NEUT(facteur_d_attenuation_courant),ImageA6
                                             )
                              );
                                        /* Et on cumule d'avant en arriere par addition arithmetique.                                */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(coordonnee_z_de_depth_cueing
                   ,NIVA(__DENORMALISE_NIVEAU(_____lNORMALISE_OZ(COZR(tranche_verticale_courante))))
                    );
                                        /* Afin de faire du "depth-cueing", la troisieme coordonnee 'z' suit les couleurs...         */

               Test(IL_FAUT(interpoler_le_seuil_de_masquage))
                    Bblock
                    EGAL(seuil_de_masquage_utilise
                        ,GENP(BARY(FLOT(seuil_de_masquage_de_depart)
                                  ,FLOT(seuil_de_masquage_d_arrivee)
                                  ,DIVI(FLOT(NBRE(premiere_image,NUMERO_D_IMAGE)),FLOT(NBRE(premiere_image,derniere_image)))
                                   )
                              )
                         );
                                        /* Seuil de masquage utilise qui est proportionnel au numero courant (introduit le           */
                                        /* 20020308145352).                                                                          */
                    Eblock
               ATes
                    Bblock
                    Test(IL_FAUT(calculer_le_seuil_de_masquage))
                         Bblock
                         CALS(Ihistogramme(ImageA5));
                                        /* Calcul de l'histogramme de l'image courante.                                              */
                         EGAL(seuil_de_masquage_utilise,NOIR);
                                        /* A priori...                                                                               */

                         BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
                              Bblock
                              Test(IFLT(ACCES_HISTOGRAMME_CUMULE___NORMALISE(niveau)
                                       ,COMP(fraction_de_points_pour_calculer_le_seuil_de_masquage)
                                        )
                                   )
                                   Bblock
                                   EGAL(seuil_de_masquage_utilise,niveau);
                                        /* On prend comme seuil le niveau qui correspond a peu pres au poucentage demande.           */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         EBoI

                         EGAL(seuil_de_masquage_utilise,MAX2(seuil_de_masquage_utilise,seuil_de_masquage));
                                        /* On prend comme le seuil le niveau qui correspond a peu pres au poucentage demande, mais   */
                                        /* en faisant qu'il ne soit pas trop petit...                                                */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes

               MASQUE_IMAGES(seuil_de_masquage_utilise);
                                        /* Activation du masquage des images.                                                        */

               BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
                    Bblock
                    Test(IL_FAUT(binariser_les_images))
                         Bblock
                         MODIFICATION_LISTE_DE_SUBSTITUTION(niveau
                                                           ,MAX2(GENP(coordonnee_z_de_depth_cueing)
                                                                ,COND(IL_FAUT(compatibilite_20091128)
                                                                     ,NOIR
                                                                     ,NOIR_PLANCHER
                                                                      )
                                                                 )
                                                            );
                                        /* La liste de substitution (associee au masque) est telle que tout ce qui                   */
                                        /* est inferieur au seuil disparait, et que les autres sont materialises                     */
                                        /* par le 'z' de depth-cueing...                                                             */
                                        /*                                                                                           */
                                        /* La modification du 20091128095646 permet de ne pas faire disparaitre la premiere image    */
                                        /* car, en effet, dans son cas la substitution avant cette date se faisait avec 'NOIR'.      */
                                        /* Cela s'est vu lors du calcul de 'v $xiirc/MAND.T8 p=$xiP/fractal.11'                      */
                         Eblock
                    ATes
                         Bblock
                         MODIFICATION_LISTE_DE_SUBSTITUTION(niveau
                                                           ,MAX2(GENP(NIVA(SCAL(NIVR(niveau)
                                                                               ,NIVR(BLANC)
                                                                               ,NIVR(coordonnee_z_de_depth_cueing)
                                                                                )
                                                                           )
                                                                      )
                                                                ,NOIR_PLANCHER
                                                                 )
                                                            );
                                        /* La liste de substitution (associee au masque) est telle que tout ce qui                   */
                                        /* est inferieur au seuil disparait, et que les autres sont materialises                     */
                                        /* par une echelle allant de 'NOIR_PLANCHER' au 'z' de depth-cueing...                       */
                         Eblock
                    ETes
                    Eblock
               EBoI

               Test(IFET(IL_NE_FAUT_PAS(translation_quelconque),IZEQ(facteur_stereoscopique)))
                    Bblock
                    SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
                    SET_FILTRAGE(ACTIF);
                                        /* Activation du filtrage de "depth-cueing".                                                 */

                    Test(IL_FAUT(memoriser_le_Z_Buffer))
                         Bblock
                         CALS(Itranslation_3D(ImageR
                                             ,ImageA5
                                             ,tranche_verticale_courante
                                             ,ADRESSE(RRtranslation)
                                             ,FAUX
                                             ,FAUX
                                              )
                              );
                                        /* Et on superpose les images avec gestion du 'Z-Buffer'...                                  */
                         Eblock
                    ATes
                         Bblock
                         CALS(Itranslation(ImageR
                                          ,ImageA5
                                          ,ADRESSE(RRtranslation)
                                          ,FAUX
                                          ,FAUX
                                           )
                              );
                                        /* Et on superpose les images...                                                             */
                         Eblock
                    ETes

                    SET_FILTRAGE(INACTIF);
                                        /* Inhibition du filtrage...                                                                 */
                    Eblock
               ATes
                    Bblock
                    SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
                    SET_FILTRAGE(ACTIF);
                                        /* Activation du filtrage de "depth-cueing".                                                 */
                    DEMASQUE_IMAGES;
                    CALS(Imove(ImageA4,ImageA5));
                    MASQUE_IMAGES(seuil_de_masquage_utilise);
                                        /* Filtrage de "depth-cueing" ; on notera qu'il est fait sur toute l'image afin d'eviter des */
                                        /* problemes d'interpolation dans 'Irotation_image(...)' (en effet, les points "frontiere"   */
                                        /* ont une partie de leur voisin hors du masque, et ils sont utilises malgre tout lors de    */
                                        /* l'interpolation...).                                                                      */
                    SET_FILTRAGE(INACTIF);
                                        /* Inhibition du filtrage...                                                                 */
                    CALS(Irotation_image(ImageR
                                        ,ImageA4
                                        ,FAUX
                                        ,ADRESSE(RRtranslation),ADRESSE(RAtranslation),ADRESSE(Atranslation)
                                        ,FZERO
                                        ,VRAI
                                         )
                         );
                                        /* Et on superpose les images (sans reinitialiser 'ImageR' a chaque iteration...).           */
                    Eblock
               ETes

               DEMASQUE_IMAGES;
                                        /* Inhibition du masquage...                                                                 */

               DECR(ASD1(RRtranslation,dx),MUL2(FLOT(pas_des_images),VRAI_PAS_HORIZONTAL));
               DECR(ASD1(RRtranslation,dy),MUL2(FLOT(pas_des_images),VRAI_PAS_VERTICAL));
                                        /* Et on decale d'un cran de plus...                                                         */

               INCR(tranche_verticale_courante,pas_des_tranches_verticales);
                                        /* Mise a jour de la tranche verticale courante.                                             */
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes

          CALZ_FreCC(nom_image);
          Eblock
     EDoI

     CALi(Iupdate_image(nom_imageR,ImageR));

     Test(IFET(IL_NE_FAUT_PAS(translation_quelconque),IZEQ(facteur_stereoscopique)))
          Bblock
          Test(IL_FAUT(memoriser_le_Z_Buffer))
               Bblock
               Test(IL_FAUT(memoriser_le_Z_Buffer_comme_une_image_standard))
                    Bblock
                    CALS(Ifloat_std_du_Z_Buffer(ImageA));
                                        /* Conversion du 'Z-Buffer' en une image "standard"...                                       */
                    CALi(Iupdate_image(nom_imageZ,ImageA));
                    Eblock
               ATes
                    Bblock
                    CALi(IupdateF_image(nom_imageZ,Z_Buffer));
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



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