_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D E   C A L C U L   D ' U N   S C A L A I R E   T Y P I Q U E  :                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base de calcul d'un scalaire typique d'une                                                                    */
/*                  images raster, quelle que soit la definition.                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/scalaires$FON' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

BFonctionI

DEFV(Common,DEFV(Logical,SINT(Inivo_extrema_____inverser_l_ordre_de_parcours_des_points,FAUX)));
                                        /* Permet d'utiliser l'ordre {Xmax,Ymax} -- > {Xmin,Ymin} a la place de l'ordre standard     */
                                        /* {Xmin,Ymin}  -- > {Xmax,Ymax}. Introduit le 20000331103651. On notera au passage que      */
                                        /* l'ordre standard permet, par exemple, de recuperer le dernier poinr 'BLANC' d'une         */
                                        /* image, alors que l'ordre inverse donnera le premier...                                    */

DEFV(Common,DEFV(genere_p,INIT(Inivo_extrema_____niveau_minimum,NIVEAU_UNDEF)));
DEFV(Common,DEFV(Float,INIT(Inivo_extrema_____cumul_des_niveaux,FLOT__UNDEF)));
DEFV(Common,DEFV(genere_p,INIT(Inivo_extrema_____niveau_moyen,NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_p,INIT(Inivo_extrema_____niveau_maximum,NIVEAU_UNDEF)));
                                        /* Niveau moyen mesure lors de chaque passage dans 'Inivo_extrema(...)'.                     */

DEFV(Common,DEFV(FonctionI,Inivo_extrema(imageA
                                        ,ARGUMENT_POINTEUR(nivo_minimum)
                                        ,ARGUMENT_POINTERs(point_minimum)
                                        ,ARGUMENT_POINTEUR(nivo_maximum)
                                        ,ARGUMENT_POINTERs(point_maximum)
                                         )
                 )
     )
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument.                                                                           */
DEFV(Argument,DEFV(genere_p,POINTEUR(nivo_minimum)));
                                        /* Pointeur (&) sur la valeur du minimum rencontre dans l'image argument.                    */
DEFV(Argument,DEFV(pointF_2D,POINTERs(point_minimum)));
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier minima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
DEFV(Argument,DEFV(genere_p,POINTEUR(nivo_maximum)));
                                        /* Pointeur (&) sur la valeur du maximum rencontre dans l'image argument.                    */
DEFV(Argument,DEFV(pointF_2D,POINTERs(point_maximum)));
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier maxima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     BDEFV(image,imageM1);
                                        /* Image de Manoeuvre 1,                                                                     */
     BDEFV(image,imageM2);
                                        /* Image de Manoeuvre 2.                                                                     */

     DEFV(genere_p,INIT(niveau_courant,NIVEAU_UNDEF));
                                        /* Variable de manoeuvre (valeur du point courant).                                          */
     DEFV(Float,INIT(cumul_des_niveaux,FZERO));
                                        /* Cumul des niveaux rencontres...                                                           */
     /*..............................................................................................................................*/
     Test(IL_FAUT(Inivo_extrema_____inverser_l_ordre_de_parcours_des_points))
          Bblock
          CALS(Ix_symetrie(imageM1,imageA));
          CALS(Iy_symetrie(imageM2,imageM1));
                                        /* Cas ou l'ordre inverse ({Xmax,Ymax} -- > {Xmin,Ymin}) doit etre utilise.                  */
          Eblock
     ATes
          Bblock
          CALS(Imove(imageM2,imageA));
                                        /* Cas ou l'ordre standard ({Xmin,Ymin} -- > {Xmax,Ymax}) doit etre utilise.                 */
          Eblock
     ETes

     EGAL(INDIRECT(nivo_minimum),BLANC);
                                        /* Initialisation du minimum sur la plus grande valeur possible pour un niveau standard.     */
                                        /* On notera que l'on ne peut, bien entendu, utiliser 'INFINI' etant donne le type           */
                                        /* 'genere_p' de 'nivo_minimum'...                                                           */
     EGAL(INDIRECT(nivo_maximum),NOIR);
                                        /* Initialisation du maximum sur la plus petite valeur possible pour un niveau standard.     */
                                        /* On notera que l'on ne peut, bien entendu, utiliser 'MOINS_L_INFINI' etant donne le type   */
                                        /* 'genere_p' de 'nivo_maximum'...                                                           */

     begin_image
          Bblock
          EGAL(niveau_courant,load_point(imageM2,X,Y));
                                        /* Recuperation du niveau courant en {X,Y}.                                                  */
          INCR(cumul_des_niveaux,FLOT(niveau_courant));
                                        /* Cumul des niveaux...                                                                      */

          Test(IFGE(INDIRECT(nivo_minimum),niveau_courant))
                                        /* On notera l'utilisation de 'IFGE(...)' et non pas de 'IFGT(...)' a cause du fait que      */
                                        /* 'nivo_minimum' est initialise avec 'BLANC', c'est-a-dire un niveau possible pour le       */
                                        /* 'niveau_courant'...                                                                       */
               Bblock
               EGAL(INDIRECT(nivo_minimum),niveau_courant);
               EGAL(ASI1(point_minimum,x),_____cNORMALISE_OX(X));
               EGAL(ASI1(point_minimum,y),_____cNORMALISE_OY(Y));
                                        /* Memorisation du dernier minimum rencontre.                                                */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFLE(INDIRECT(nivo_maximum),niveau_courant))
                                        /* On notera l'utilisation de 'IFLE(...)' et non pas de 'IFLT(...)' a cause du fait que      */
                                        /* 'nivo_minimum' est initialise avec 'BLANC', c'est-a-dire un niveau possible pour le       */
                                        /* 'niveau_courant'...                                                                       */
               Bblock
               EGAL(INDIRECT(nivo_maximum),niveau_courant);
               EGAL(ASI1(point_maximum,x),_____cNORMALISE_OX(X));
               EGAL(ASI1(point_maximum,y),_____cNORMALISE_OY(Y));
                                        /* Memorisation du dernier maximum rencontre.                                                */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_image

     EGAL(Inivo_extrema_____niveau_minimum,INDIRECT(nivo_minimum));
     EGAL(Inivo_extrema_____cumul_des_niveaux,cumul_des_niveaux);
     EGAL(Inivo_extrema_____niveau_moyen,GENP(DIVI(cumul_des_niveaux,FLOT(dimXY))));
     EGAL(Inivo_extrema_____niveau_maximum,INDIRECT(nivo_maximum));
                                        /* Calcul du niveau moyen rencontre...                                                       */

     EDEFV(image,imageM2);
                                        /* Image de Manoeuvre 2,                                                                     */
     EDEFV(image,imageM1);
                                        /* Image de Manoeuvre 1.                                                                     */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D U   M I N I M U M   D E S   N I V E A U X   D ' U N E   I M A G E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Inivo_minimum(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image argument.                                                                           */
                                        /* la valeur de la fonction est le minimum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_p,INIT(nivo_minimum,NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image.                                                          */
     DEFV(pointF_2D,point_minimum);
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier minima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
     DEFV(genere_p,INIT(nivo_maximum,NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image.                                                          */
     DEFV(pointF_2D,point_maximum);
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier maxima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
     /*..............................................................................................................................*/
     CALS(Inivo_extrema(imageA
                       ,ADRESSE(nivo_minimum),ADRESSE(point_minimum)
                       ,ADRESSE(nivo_maximum),ADRESSE(point_maximum)
                        )
          );
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_minimum);
                                        /* Renvoi du minimum uniquement.                                                             */
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D U   M A X I M U M   D E S   N I V E A U X   D ' U N E   I M A G E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Inivo_maximum(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image argument.                                                                           */
                                        /* la valeur de la fonction est le maximum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_p,INIT(nivo_minimum,NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image.                                                          */
     DEFV(pointF_2D,point_minimum);
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier minima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
     DEFV(genere_p,INIT(nivo_maximum,NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image.                                                          */
     DEFV(pointF_2D,point_maximum);
                                        /* Donne au retour les coordonnees {X,Y} dans [0,1[ du dernier maxima (au cas ou il y        */
                                        /* en aurait plusieurs...) rencontre.                                                        */
     /*..............................................................................................................................*/
     CALS(Inivo_extrema(imageA
                       ,ADRESSE(nivo_minimum),ADRESSE(point_minimum)
                       ,ADRESSE(nivo_maximum),ADRESSE(point_maximum)
                        )
          );
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_maximum);
                                        /* Renvoi du maximum uniquement.                                                             */
     Eblock

EFonctionP

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

BFonctionI

DEFV(Common,DEFV(FonctionI,IFnivo_extrema_avec_exclusion(imageA
                                                        ,ARGUMENT_POINTEUR(nivo_minimum)
                                                        ,ARGUMENT_POINTEUR(nivo_maximum)
                                                        ,borne_inferieure
                                                        ,borne_superieure
                                                         )
                 )
     )
                                        /* Fonction introduite le 20050418112622 pour etre utilisee dans la procedure                */
                                        /* 'v $xiii/Images$DEF TRAITEMENT_SPECIFIQUE_DES_IMAGES_DE_TYPE_Z_Buffer'...                 */
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image flottante Argument.                                                                 */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_minimum)));
                                        /* Pointeur sur la valeur du minimum rencontre dans l'image flottante argument.              */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_maximum)));
                                        /* Pointeur sur la valeur du maximum rencontre dans l'image flottante argument.              */
DEFV(Argument,DEFV(genere_Float,borne_inferieure));
DEFV(Argument,DEFV(genere_Float,borne_superieure));
                                        /* Les valeurs hors de [borne_inferieure,borne_superieure] seront exclues de cette           */
                                        /* recherche...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(genere_Float,INIT(niveau_minimum_courant,F_INFINI));
     DEFV(genere_Float,INIT(niveau_maximum_courant,F_MOINS_L_INFINI));
                                        /* Extrema courant...                                                                        */
     /*..............................................................................................................................*/
     begin_image
          Bblock
          DEFV(genere_Float,INIT(niveau_courant,loadF_point(imageA,X,Y)));
                                        /* Valeur du point courant...                                                                */

          Test(INCLff(niveau_courant,borne_inferieure,borne_superieure))
               Bblock
               EGAL(niveau_minimum_courant,MIN2(niveau_minimum_courant,niveau_courant));
               EGAL(niveau_maximum_courant,MAX2(niveau_maximum_courant,niveau_courant));
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_image

     EGAL(INDIRECT(nivo_minimum),niveau_minimum_courant);
     EGAL(INDIRECT(nivo_maximum),niveau_maximum_courant);
                                        /* Diverses mesures...                                                                       */

     RETU_ERROR;
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(Float,SINT(IFnivo_extrema_____translation_du_minimum,FZERO)));
DEFV(Common,DEFV(Float,SINT(IFnivo_extrema_____translation_du_maximum,FZERO)));
                                        /* Introduit le 20180513112804 pour 'v $xiirf/.FRC3.21.1.2.$U m..imum_translation'...        */

DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_minimum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_minimum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));

DEFV(Common,DEFV(Logical,SINT(IFnivo_extrema_____cumul_valide_des_niveaux,LUNDEF)));
DEFV(Common,DEFV(Float,INIT(IFnivo_extrema_____cumul_des_niveaux,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(IFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FLOT__UNDEF)));

DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_moyen,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_moyen_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));

DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_maximum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_maximum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));
                                        /* Diverses mesures lors de chaque passage dans 'IFnivo_extrema(...)'.                       */
                                        /*                                                                                           */
                                        /* Les '*imum_en_valeur_absolue_dans_IFnivo_extrema' ont ete introduits le 20030930114834    */
                                        /* pour etre utilise dans 'v $xiii/files$FON IFnivo_extrema'...                              */

DEFV(Common,DEFV(Logical,SINT(IFnivo_extrema_____calculer_le_minimum_secondaire,FAUX)));
DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_minimum_secondaire,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(Logical,SINT(IFnivo_extrema_____calculer_le_maximum_secondaire,FAUX)));
DEFV(Common,DEFV(genere_Float,INIT(IFnivo_extrema_____niveau_maximum_secondaire,FLOT__NIVEAU_UNDEF)));
                                        /* Recherche des extrema secondaires (introduites le 20091212204602), c'est-a-dire ceux      */
                                        /* qui sont les extrema en ayant supprime les extrema "reels" (dits "primaires")...          */
                                        /* Cela fut introduit principalement pour connaitre le minimum (donc "secondaire") du        */
                                        /* 'Z_Buffer' dont une partie contient 'Z_Buffer_____valeur_initiale' (qui est le minimum    */
                                        /* "primaire" mais qui n'est d'aucune utilite pour renormaliser 'Z_Buffer').                 */

DEFV(Common,DEFV(FonctionI,IFnivo_extrema(imageA,ARGUMENT_POINTEUR(nivo_minimum),ARGUMENT_POINTEUR(nivo_maximum))))
                                        /* Le 20030210173332, cette fonction a ete refencee dans 'IloadF_image(...)' (voir           */
                                        /* 'v $xiii/files$FON IloadF_image_____valider_les_genere_Float'). On n'oubliera pas a       */
                                        /* ce propos que les nombres flottants des 'SYSTEME_APC' ne sont pas compatibles, en         */
                                        /* general, avec les autres SYSTEMEs, d'ou cette possible verification...                    */
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image flottante Argument.                                                                 */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_minimum)));
                                        /* Pointeur sur la valeur du minimum rencontre dans l'image flottante argument.              */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_maximum)));
                                        /* Pointeur sur la valeur du maximum rencontre dans l'image flottante argument.              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     /*..............................................................................................................................*/
     EGAL(IFnivo_extrema_____niveau_minimum,F_INFINI);
     EGAL(IFnivo_extrema_____niveau_minimum_en_valeur_absolue,F_INFINI);
                                        /* Initialisation du minimum sur une forte valeur positive.                                  */
     EGAL(IFnivo_extrema_____niveau_maximum,F_MOINS_L_INFINI);
     EGAL(IFnivo_extrema_____niveau_maximum_en_valeur_absolue,F_MOINS_L_INFINI);
                                        /* Initialisation du maximum sur une forte valeur negative.                                  */
     EGAL(IFnivo_extrema_____cumul_valide_des_niveaux,VRAI);
     EGAL(IFnivo_extrema_____cumul_des_niveaux,FZERO);
     EGAL(IFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FZERO);
                                        /* Initialisation du cumul des niveaux rencontres...                                         */

     begin_image
          Bblock
          DEFV(genere_Float,INIT(niveau_courant,loadF_point(imageA,X,Y)));
          DEFV(genere_Float,INIT(niveau_courant_en_valeur_absolue,FLOT__NIVEAU_UNDEF));
                                        /* Valeur du point courant et sa valeur absolue...                                           */

          EGAL(niveau_courant_en_valeur_absolue,ABSO(niveau_courant));
                                        /* Valeur absolue du niveau courant en {X,Y}.                                                */

          Test(IFINoo(niveau_courant,F_MOINS_LE_PETIT_INFINI,F_PETIT_INFINI))
                                        /* Ce test a ete introduit le 20040408095536 a cause de 'SYSTEME_SG'...                      */
               Bblock
               INCR(IFnivo_extrema_____cumul_des_niveaux,niveau_courant);
               INCR(IFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,niveau_courant_en_valeur_absolue);
                                        /* Cumul des niveaux...                                                                      */
               Eblock
          ATes
               Bblock
               EGAL(IFnivo_extrema_____cumul_valide_des_niveaux,FAUX);
               Eblock
          ETes

          EGAL(IFnivo_extrema_____niveau_minimum
              ,MIN2(IFnivo_extrema_____niveau_minimum,niveau_courant)
               );
          EGAL(IFnivo_extrema_____niveau_minimum_en_valeur_absolue
              ,MIN2(IFnivo_extrema_____niveau_minimum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );

          EGAL(IFnivo_extrema_____niveau_maximum
              ,MAX2(IFnivo_extrema_____niveau_maximum,niveau_courant)
               );
          EGAL(IFnivo_extrema_____niveau_maximum_en_valeur_absolue
              ,MAX2(IFnivo_extrema_____niveau_maximum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );
          Eblock
     end_image

     EGAL(IFnivo_extrema_____niveau_moyen
         ,DIVI(IFnivo_extrema_____cumul_des_niveaux,FLOT(dimXY))
          );
     EGAL(IFnivo_extrema_____niveau_moyen_en_valeur_absolue
         ,DIVI(IFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FLOT(dimXY))
          );

     INCR(IFnivo_extrema_____niveau_minimum,IFnivo_extrema_____translation_du_minimum);
     INCR(IFnivo_extrema_____niveau_maximum,IFnivo_extrema_____translation_du_maximum);
                                        /* Introduite le 20180513112804 pour 'v $xiirf/.FRC3.21.1.2.$U m..imum_translation'...       */

     EGAL(INDIRECT(nivo_minimum),IFnivo_extrema_____niveau_minimum);
     EGAL(INDIRECT(nivo_maximum),IFnivo_extrema_____niveau_maximum);
                                        /* Diverses mesures...                                                                       */

     Test(IFOU(IL_FAUT(IFnivo_extrema_____calculer_le_minimum_secondaire)
              ,IL_FAUT(IFnivo_extrema_____calculer_le_maximum_secondaire)
               )
          )
                                        /* Ce test a ete introduit le 20091212204602...                                              */
          Bblock
          EGAL(IFnivo_extrema_____niveau_minimum_secondaire,F_INFINI);
          EGAL(IFnivo_extrema_____niveau_maximum_secondaire,F_MOINS_L_INFINI);

          begin_image
               Bblock
               DEFV(genere_Float,INIT(niveau_courant,loadF_point(imageA,X,Y)));
                                        /* Valeur du point courant...                                                                */

               Test(IFET(IFNE(niveau_courant,IFnivo_extrema_____niveau_minimum)
                        ,IFNE(niveau_courant,IFnivo_extrema_____niveau_maximum)
                         )
                    )
                    Bblock
                    EGAL(IFnivo_extrema_____niveau_minimum_secondaire
                        ,MIN2(IFnivo_extrema_____niveau_minimum_secondaire,niveau_courant)
                         );
                    EGAL(IFnivo_extrema_____niveau_maximum_secondaire
                        ,MAX2(IFnivo_extrema_____niveau_maximum_secondaire,niveau_courant)
                         );
                                        /* Recherche des extrema secondaires (introduites le 20091212204602), c'est-a-dire ceux      */
                                        /* qui sont les extrema en ayant supprime les extrema "reels" (dits "primaires"). Ceci fut   */
                                        /* introduit en particulier pour "etudier" les 'Z-Buffer's....                               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          end_image
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

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

BFonctionF

DEFV(Common,DEFV(FonctionF,IFnivo_minimum(imageA)))
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image flottante argument.                                                                 */
                                        /* la valeur de la fonction est le minimum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image flottante.                                                */
     DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image flottante.                                                */
     /*..............................................................................................................................*/
     CALS(IFnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_minimum);
                                        /* Renvoi du minimum.                                                                        */
     Eblock

EFonctionF

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

BFonctionF

DEFV(Common,DEFV(FonctionF,IFnivo_maximum(imageA)))
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image flottante argument.                                                                 */
                                        /* la valeur de la fonction est le maximum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image flottante.                                                */
     DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image flottante.                                                */
     /*..............................................................................................................................*/
     CALS(IFnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_maximum);
                                        /* Renvoi du maximum.                                                                        */
     Eblock

EFonctionF

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

BFonctionI

DEFV(Common,DEFV(genere_Float,INIT(IJnivo_extrema_____niveau_minimum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(IJnivo_extrema_____niveau_minimum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));

DEFV(Common,DEFV(genere_Float,INIT(IJnivo_extrema_____niveau_maximum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(IJnivo_extrema_____niveau_maximum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));
                                        /* Diverses mesures lors de chaque passage dans 'IFnivo_extrema(...)' introduites le         */
                                        /* 20030930135517.                                                                           */

DEFV(Common,DEFV(FonctionI,IJnivo_extrema(imageA,ARGUMENT_POINTEUR(nivo_minimum),ARGUMENT_POINTEUR(nivo_maximum))))
                                        /* Cette fonction a ete introduite le 20030210173332 en vue de faire ensuite des             */
                                        /* verifications des nombres flottants ainsi recuperes dans 'IloadJ_image(...)' (voir        */
                                        /* 'v $xiii/files$FON IloadJ_image_____valider_les_genere_Float'). On n'oubliera pas a       */
                                        /* ce propos que les nombres flottants des 'SYSTEME_APC' ne sont pas compatibles, en         */
                                        /* general, avec les autres SYSTEMEs, d'ou cette possible verification...                    */
                                        /*                                                                                           */
                                        /* On notera de plus, qu'en l'absence de relation d'ordre dans les nombres complexes, ces    */
                                        /* extremas sont calcules a partir des parties Reelle et Imaginaire de chaque nombre         */
                                        /* complexe manipule...                                                                      */
DEFV(Argument,DEFV(imageJ,imageA));
                                        /* Image flottante Argument.                                                                 */
DEFV(Argument,DEFV(Float,POINTEUR(nivo_minimum)));
                                        /* Pointeur sur la valeur du minimum rencontre dans l'image flottante argument.              */
DEFV(Argument,DEFV(Float,POINTEUR(nivo_maximum)));
                                        /* Pointeur sur la valeur du maximum rencontre dans l'image flottante argument.              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     BDEFV(imageF,partie_____reelle);
     BDEFV(imageF,partie_imaginaire);
     BDEFV(imageF,minimum_des_parties_reelle_et_imaginaire);
     BDEFV(imageF,maximum_des_parties_reelle_et_imaginaire);
                                        /* Parties Reelle et Imaginaire de 'imageA', ainsi leurs extrema "locaux"...                 */
                                        /*                                                                                           */
                                        /* Je note le 20061122165105 que 'partie_____reelle' s'appelle ainsi afin d'avoir la         */
                                        /* meme longueur que 'partie_imaginaire'...                                                  */

     DEFV(genere_Float,INIT(nivo_minimum_temporaire,FLOT__NIVEAU_UNDEF));
     DEFV(genere_Float,INIT(nivo_maximum_temporaire,FLOT__NIVEAU_UNDEF));
                                        /* Destines uniquement a faire les appels a 'IFnivo_extrema(...)'...                         */
     DEFV(Float,INIT(niveau_minimum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire,FLOT__NIVEAU_UNDEF));
     DEFV(Float,INIT(niveau_maximum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire,FLOT__NIVEAU_UNDEF));
     DEFV(Float,INIT(niveau_minimum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire,FLOT__NIVEAU_UNDEF));
     DEFV(Float,INIT(niveau_maximum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire,FLOT__NIVEAU_UNDEF));
                                        /* Extrema des extrema...                                                                    */
     /*..............................................................................................................................*/
     CALS(Icomplexe_reelle(partie_____reelle,imageA));
     CALS(Icomplexe_imaginaire(partie_imaginaire,imageA));
                                        /* Extraction des parties Reelle et Imaginaire...                                            */
     CALS(IFminimum(minimum_des_parties_reelle_et_imaginaire,partie_____reelle,partie_imaginaire));
     CALS(IFmaximum(maximum_des_parties_reelle_et_imaginaire,partie_____reelle,partie_imaginaire));
                                        /* Calcul de leurs extrema "locaux"...                                                       */
                                        /*                                                                                           */
                                        /* ATTENTION, l'utilisation de 'IFminimum(...)' et de 'IFmaximum(...)' a demande a ce que    */
                                        /* 'image_image_TRI_IMAGE_EXT' soit deplace de 'v $xi/INCLUDES_all$I 20031002121556' vers    */
                                        /* 'v $xi/INCLUDES_bas$I 20031002121832'...                                                  */

     CALS(IFnivo_extrema(minimum_des_parties_reelle_et_imaginaire
                        ,ADRESSE(nivo_minimum_temporaire)
                        ,ADRESSE(nivo_maximum_temporaire)
                         )
          );
     EGAL(IJnivo_extrema_____niveau_minimum
         ,IFnivo_extrema_____niveau_minimum
          );
     EGAL(niveau_minimum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire
         ,IFnivo_extrema_____niveau_minimum_en_valeur_absolue
          );
     EGAL(niveau_maximum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire
         ,IFnivo_extrema_____niveau_maximum_en_valeur_absolue
          );
                                        /* Recherche du minimum.                                                                     */
     CALS(IFnivo_extrema(maximum_des_parties_reelle_et_imaginaire
                        ,ADRESSE(nivo_minimum_temporaire)
                        ,ADRESSE(nivo_maximum_temporaire)
                         )
          );
     EGAL(IJnivo_extrema_____niveau_maximum
         ,IFnivo_extrema_____niveau_maximum
          );
     EGAL(niveau_minimum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire
         ,IFnivo_extrema_____niveau_minimum_en_valeur_absolue
          );
     EGAL(niveau_maximum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire
         ,IFnivo_extrema_____niveau_maximum_en_valeur_absolue
          );
                                        /* Recherche du maximum.                                                                     */

     EGAL(IJnivo_extrema_____niveau_minimum_en_valeur_absolue
         ,MIN2(niveau_minimum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire
              ,niveau_minimum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire
               )
          );
                                        /* Determination du minimum en valeur absolue.                                               */
     EGAL(IJnivo_extrema_____niveau_maximum_en_valeur_absolue
         ,MAX2(niveau_maximum_en_valeur_absolue_des_minima_des_parties_reelle_et_imaginaire
              ,niveau_maximum_en_valeur_absolue_des_maxima_des_parties_reelle_et_imaginaire
               )
          );
                                        /* Determination du maximum en valeur absolue.                                               */

     EGAL(INDIRECT(nivo_minimum),IJnivo_extrema_____niveau_minimum);
     EGAL(INDIRECT(nivo_maximum),IJnivo_extrema_____niveau_maximum);
                                        /* Renvoi des extrema principaux...                                                          */

     EDEFV(imageF,maximum_des_parties_reelle_et_imaginaire);
     EDEFV(imageF,minimum_des_parties_reelle_et_imaginaire);
     EDEFV(imageF,partie_imaginaire);
     EDEFV(imageF,partie_____reelle);
                                        /* Parties Reelle et Imaginaire de 'imageA', ainsi leurs extrema "locaux"...                 */

     RETU_ERROR;
     Eblock

EFonctionI

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

BFonctionF

DEFV(Common,DEFV(FonctionF,IJnivo_minimum(imageA)))
DEFV(Argument,DEFV(imageJ,imageA));
                                        /* Image flottante argument.                                                                 */
                                        /* la valeur de la fonction est le minimum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image flottante.                                                */
     DEFV(Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image flottante.                                                */
     /*..............................................................................................................................*/
     CALS(IJnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_minimum);
                                        /* Renvoi du minimum.                                                                        */
     Eblock

EFonctionF

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

BFonctionF

DEFV(Common,DEFV(FonctionF,IJnivo_maximum(imageA)))
DEFV(Argument,DEFV(imageJ,imageA));
                                        /* Image flottante argument.                                                                 */
                                        /* la valeur de la fonction est le maximum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une image flottante.                                                */
     DEFV(Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une image flottante.                                                */
     /*..............................................................................................................................*/
     CALS(IJnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_maximum);
                                        /* Renvoi du maximum.                                                                        */
     Eblock

EFonctionF

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

BFonctionI

DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_minimum,DPRE(NIVEAU_UNDEF))));
DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_minimum_en_valeur_absolue,DPRE(NIVEAU_UNDEF))));

DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____cumul_des_niveaux,DPRE(UNDEF))));
DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,DPRE(UNDEF))));

DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_moyen,DPRE(NIVEAU_UNDEF))));
DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_moyen_en_valeur_absolue,DPRE(NIVEAU_UNDEF))));

DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_maximum,DPRE(NIVEAU_UNDEF))));
DEFV(Common,DEFV(Double,INIT(IDnivo_extrema_____niveau_maximum_en_valeur_absolue,DPRE(NIVEAU_UNDEF))));
                                        /* Diverses mesures lors de chaque passage dans 'IDnivo_extrema(...)'.                       */
                                        /*                                                                                           */
                                        /* Les '*imum_en_valeur_absolue_dans_IDnivo_extrema' ont ete introduits le 20030930144143.   */

DEFV(Common,DEFV(FonctionI,IDnivo_extrema(imageA,ARGUMENT_POINTEUR(nivo_minimum),ARGUMENT_POINTEUR(nivo_maximum))))
DEFV(Argument,DEFV(imageD,imageA));
                                        /* Image double precision Argument.                                                          */
DEFV(Argument,DEFV(Double,POINTEUR(nivo_minimum)));
                                        /* Pointeur sur la valeur du minimum rencontre dans l'image double precision argument.       */
DEFV(Argument,DEFV(Double,POINTEUR(nivo_maximum)));
                                        /* Pointeur sur la valeur du maximum rencontre dans l'image double precision argument.       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     EGAL(IDnivo_extrema_____niveau_minimum,D_INFINI);
     EGAL(IDnivo_extrema_____niveau_minimum_en_valeur_absolue,D_INFINI);
                                        /* Initialisation du minimum sur une forte valeur positive.                                  */
     EGAL(IDnivo_extrema_____niveau_maximum,D_MOINS_L_INFINI);
     EGAL(IDnivo_extrema_____niveau_maximum_en_valeur_absolue,D_MOINS_L_INFINI);
                                        /* Initialisation du maximum sur une forte valeur negative.                                  */
     EGAL(IDnivo_extrema_____cumul_des_niveaux,FZERO);
     EGAL(IDnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FZERO);
                                        /* Initialisation du cumul des niveaux rencontres...                                         */

     begin_image
          Bblock
          DEFV(Double,INIT(niveau_courant,loadD_point(imageA,X,Y)));
          DEFV(Double,INIT(niveau_courant_en_valeur_absolue,DPRE(NIVEAU_UNDEF)));
                                        /* Valeur du point courant et sa valeur absolue...                                           */

          EGAL(niveau_courant_en_valeur_absolue,ABSO(niveau_courant));
                                        /* Valeur absolue du niveau courant en {X,Y}.                                                */

          INCR(IDnivo_extrema_____cumul_des_niveaux,niveau_courant);
          INCR(IDnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,niveau_courant_en_valeur_absolue);
                                        /* Cumul des niveaux...                                                                      */

          EGAL(IDnivo_extrema_____niveau_minimum
              ,MIN2(IDnivo_extrema_____niveau_minimum,niveau_courant)
               );
          EGAL(IDnivo_extrema_____niveau_minimum_en_valeur_absolue
              ,MIN2(IDnivo_extrema_____niveau_minimum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );

          EGAL(IDnivo_extrema_____niveau_maximum
              ,MAX2(IDnivo_extrema_____niveau_maximum,niveau_courant)
               );
          EGAL(IDnivo_extrema_____niveau_maximum_en_valeur_absolue
              ,MAX2(IDnivo_extrema_____niveau_maximum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );
          Eblock
     end_image

     EGAL(IDnivo_extrema_____niveau_moyen
         ,DIVI(IDnivo_extrema_____cumul_des_niveaux,DPRE(dimXY))
          );
     EGAL(IDnivo_extrema_____niveau_moyen_en_valeur_absolue
         ,DIVI(IDnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,DPRE(dimXY))
          );

     EGAL(INDIRECT(nivo_minimum),IDnivo_extrema_____niveau_minimum);
     EGAL(INDIRECT(nivo_maximum),IDnivo_extrema_____niveau_maximum);
                                        /* Diverses mesures...                                                                       */

     RETU_ERROR;
     Eblock

EFonctionI

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

BFonctionD

DEFV(Common,DEFV(FonctionD,IDnivo_minimum(imageA)))
DEFV(Argument,DEFV(imageD,imageA));
                                        /* Image double precision argument.                                                          */
                                        /* la valeur de la fonction est le minimum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Double,INIT(nivo_minimum,DPRE(UNDEF)));
                                        /* Minimum des niveaux d'une image double precision.                                         */
     DEFV(Double,INIT(nivo_maximum,DPRE(UNDEF)));
                                        /* Maximum des niveaux d'une image double precision.                                         */
     /*..............................................................................................................................*/
     CALS(IDnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_minimum);
                                        /* Renvoi du minimum.                                                                        */
     Eblock

EFonctionD

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

BFonctionD

DEFV(Common,DEFV(FonctionD,IDnivo_maximum(imageA)))
DEFV(Argument,DEFV(imageD,imageA));
                                        /* Image double precision argument.                                                          */
                                        /* la valeur de la fonction est le maximum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Double,INIT(nivo_minimum,DPRE(UNDEF)));
                                        /* Minimum des niveaux d'une image double precision.                                         */
     DEFV(Double,INIT(nivo_maximum,DPRE(UNDEF)));
                                        /* Maximum des niveaux d'une image double precision.                                         */
     /*..............................................................................................................................*/
     CALS(IDnivo_extrema(imageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_maximum);
                                        /* Renvoi du maximum.                                                                        */
     Eblock

EFonctionD

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

BFonctionI

DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_minimum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_minimum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));

DEFV(Common,DEFV(Float,INIT(AFnivo_extrema_____cumul_des_niveaux,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(AFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FLOT__UNDEF)));

DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_moyen,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_moyen_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));

DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_maximum,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,INIT(AFnivo_extrema_____niveau_maximum_en_valeur_absolue,FLOT__NIVEAU_UNDEF)));
                                        /* Diverses mesures lors de chaque passage dans 'AFnivo_extrema(...)'.                       */
                                        /*                                                                                           */
                                        /* Les '*imum_en_valeur_absolue_dans_AFnivo_extrema' ont ete introduits le 20030930144143.   */

DEFV(Common,DEFV(FonctionI,AFnivo_extrema(albumA,ARGUMENT_POINTEUR(nivo_minimum),ARGUMENT_POINTEUR(nivo_maximum))))
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album flottant Argument.                                                                  */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_minimum)));
                                        /* Pointeur sur la valeur du minimum rencontre dans l'album flottant argument.               */
DEFV(Argument,DEFV(genere_Float,POINTEUR(nivo_maximum)));
                                        /* Pointeur sur la valeur du maximum rencontre dans l'album flottant argument.               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     EGAL(AFnivo_extrema_____niveau_minimum,F_INFINI);
     EGAL(AFnivo_extrema_____niveau_minimum_en_valeur_absolue,F_INFINI);
                                        /* Initialisation du minimum sur une forte valeur positive.                                  */
     EGAL(AFnivo_extrema_____niveau_maximum,F_MOINS_L_INFINI);
     EGAL(AFnivo_extrema_____niveau_maximum_en_valeur_absolue,F_MOINS_L_INFINI);
                                        /* Initialisation du maximum sur une forte valeur negative.                                  */
     EGAL(AFnivo_extrema_____cumul_des_niveaux,FZERO);
     EGAL(AFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FZERO);
                                        /* Initialisation du cumul des niveaux rencontres...                                         */

     begin_album
          Bblock
          DEFV(genere_Float,INIT(niveau_courant,AloadF_point(albumA,X,Y,Z)));
          DEFV(genere_Float,INIT(niveau_courant_en_valeur_absolue,FLOT__NIVEAU_UNDEF));
                                        /* Valeur du point courant et sa valeur absolue...                                           */

          EGAL(niveau_courant_en_valeur_absolue,ABSO(niveau_courant));
                                        /* Valeur absolue du niveau courant en {X,Y}.                                                */

          INCR(AFnivo_extrema_____cumul_des_niveaux,niveau_courant);
          INCR(AFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,niveau_courant_en_valeur_absolue);
                                        /* Cumul des niveaux...                                                                      */

          EGAL(AFnivo_extrema_____niveau_minimum
              ,MIN2(AFnivo_extrema_____niveau_minimum,niveau_courant)
               );
          EGAL(AFnivo_extrema_____niveau_minimum_en_valeur_absolue
              ,MIN2(AFnivo_extrema_____niveau_minimum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );

          EGAL(AFnivo_extrema_____niveau_maximum
              ,MAX2(AFnivo_extrema_____niveau_maximum,niveau_courant)
               );
          EGAL(AFnivo_extrema_____niveau_maximum_en_valeur_absolue
              ,MAX2(AFnivo_extrema_____niveau_maximum_en_valeur_absolue,niveau_courant_en_valeur_absolue)
               );
          Eblock
     end_album

     EGAL(AFnivo_extrema_____niveau_moyen
         ,DIVI(AFnivo_extrema_____cumul_des_niveaux,FLOT(dimXYZ))
          );
     EGAL(AFnivo_extrema_____niveau_moyen_en_valeur_absolue
         ,DIVI(AFnivo_extrema_____cumul_des_niveaux_en_valeur_absolue,FLOT(dimXYZ))
          );

     EGAL(INDIRECT(nivo_minimum),AFnivo_extrema_____niveau_minimum);
     EGAL(INDIRECT(nivo_maximum),AFnivo_extrema_____niveau_maximum);
                                        /* Diverses mesures...                                                                       */

     RETU_ERROR;
     Eblock

EFonctionI

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

BFonctionF

DEFV(Common,DEFV(FonctionF,AFnivo_minimum(albumA)))
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album flottant argument.                                                                  */
                                        /* la valeur de la fonction est le minimum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une album flottant.                                                 */
     DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une album flottant.                                                 */
     /*..............................................................................................................................*/
     CALS(AFnivo_extrema(albumA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_minimum);
                                        /* Renvoi du minimum.                                                                        */
     Eblock

EFonctionF

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

BFonctionF

DEFV(Common,DEFV(FonctionF,AFnivo_maximum(albumA)))
DEFV(Argument,DEFV(albumF,albumA));
                                        /* Album flottant argument.                                                                  */
                                        /* la valeur de la fonction est le maximum recherche.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Minimum des niveaux d'une album flottant.                                                 */
     DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Maximum des niveaux d'une album flottant.                                                 */
     /*..............................................................................................................................*/
     CALS(AFnivo_extrema(albumA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum)));
                                        /* Recherche des extrema.                                                                    */

     RETU(nivo_maximum);
                                        /* Renvoi du maximum.                                                                        */
     Eblock

EFonctionF

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

BFonctionL

DEFV(Common,DEFV(FonctionL,IFau_moins_un_niveau_est_incorrect(imageA,editer_les_anomalies)))
                                        /* Le 20030213092031, cette fonction a ete refencee dans 'IloadF_image(...)' (voir           */
                                        /* 'v $xiii/files$FON IloadF_image_____valider_les_genere_Float'). On n'oubliera pas a       */
                                        /* ce propos que les nombres flottants des 'SYSTEME_APC' ne sont pas compatibles, en         */
                                        /* general, avec les autres SYSTEMEs, d'ou cette possible verification...                    */
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image flottante Argument.                                                                 */
DEFV(Argument,DEFV(Logical,editer_les_anomalies));
                                        /* Faut-il editer la localisation et le type d'anomalie (introduit le 20030301093054).       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(il_y_a_au_moins_un_niveau_incorrect,FAUX));
                                        /* Futur valeur de retour...                                                                 */
     /*..............................................................................................................................*/
     begin_image
          Bblock
          DEFV(genere_Float,INIT(niveau_courant,loadF_point(imageA,X,Y)));
                                        /* Recuperation du niveau courant en {X,Y}.                                                  */

          Test(EST_UN_BON_Float_FINI(niveau_courant))
               Bblock
               Eblock
          ATes
               Bblock
               Test(IL_FAUT(editer_les_anomalies))
                    Bblock
                    PRINT_ERREUR("une image contient au moins un point flottant incorrect");
                    CAL1(Prer3("ses coordonnees sont {%d,%d} et sa valeur est egale a {%g}\n",X,Y,niveau_courant));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(il_y_a_au_moins_un_niveau_incorrect,VRAI);
                                        /* Il y a au moins une valeur incorrecte...                                                  */
               Eblock
          ETes
          Eblock
     end_image

     RETU(il_y_a_au_moins_un_niveau_incorrect);
     Eblock

EFonctionL

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

BFonctionL

DEFV(Common,DEFV(FonctionL,IJau_moins_un_niveau_est_incorrect(imageA,editer_les_anomalies)))
                                        /* Cette fonction a ete introduite le 20030213092031 en vue de faire ensuite des             */
                                        /* verifications des nombres flottants ainsi recuperes dans 'IloadJ_image(...)' (voir        */
                                        /* 'v $xiii/files$FON IloadJ_image_____valider_les_genere_Float'). On n'oubliera pas a       */
                                        /* ce propos que les nombres flottants des 'SYSTEME_APC' ne sont pas compatibles, en         */
                                        /* general, avec les autres SYSTEMEs, d'ou cette possible verification...                    */
                                        /*                                                                                           */
                                        /* On notera de plus, qu'en l'absence de relation d'ordre dans les nombres complexes, ces    */
                                        /* extremas sont calcules a partir des parties Reelle et Imaginaire de chaque nombre         */
                                        /* complexe manipule...                                                                      */
DEFV(Argument,DEFV(imageJ,imageA));
                                        /* Image flottante Argument.                                                                 */
DEFV(Argument,DEFV(Logical,editer_les_anomalies));
                                        /* Faut-il editer la localisation et le type d'anomalie (introduit le 20030301093054).       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(il_y_a_au_moins_un_niveau_incorrect,FAUX));
                                        /* Futur valeur de retour...                                                                 */
     /*..............................................................................................................................*/
     begin_image
          Bblock
          DEFV(genere_complexe,niveau_courant);
          DEFV(Float,INIT(partie_____reelle,FLOT__NIVEAU_UNDEF));
          DEFV(Float,INIT(partie_imaginaire,FLOT__NIVEAU_UNDEF));
                                        /* Variables de manoeuvre (valeur du point courant).                                         */

          EGAL(niveau_courant,loadJ_point(imageA,X,Y));
          EGAL(partie_____reelle,Reelle(niveau_courant));
          EGAL(partie_imaginaire,Imaginaire(niveau_courant));
                                        /* Recuperation du niveau courant en {X,Y}.                                                  */

          Test(IFET(EST_UN_BON_Float_FINI(partie_____reelle),EST_UN_BON_Float_FINI(partie_imaginaire)))
               Bblock
               Eblock
          ATes
               Bblock
               Test(IL_FAUT(editer_les_anomalies))
                    Bblock
                    PRINT_ERREUR("une image contient au moins un point complexe incorrect");
                    CAL1(Prer4("ses coordonnees sont {%d,%d} et sa valeur est egale a {%g,%g}\n"
                              ,X,Y
                              ,partie_____reelle,partie_imaginaire
                               )
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(il_y_a_au_moins_un_niveau_incorrect,VRAI);
                                        /* Il y a au moins une valeur incorrecte...                                                  */
               Eblock
          ETes
          Eblock
     end_image

     RETU(il_y_a_au_moins_un_niveau_incorrect);
     Eblock

EFonctionL

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

BFonctionI

DEFV(Common,DEFV(Logical,SINT(Ihistogramme_____compatibilite_20081005,FAUX)));
                                        /* Permet de generer des histogrammes suivant la methode anterieure au 20081005122026...     */

DEFV(Common,DEFV(FonctionI,Ihistogramme(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(genere_p,INIT(niveau_courant,NIVEAU_UNDEF));
                                        /* Variable de manoeuvre (valeur du point courant).                                          */
     DEFV(Float,INIT(cumul_niveau,FLOT__UNDEF));
                                        /* Pour calculer le niveau moyen.                                                            */
     DEFV(Positive,INIT(cumul_points,UNDEF));
                                        /* Pour valider l'histogramme.                                                               */
     /*..............................................................................................................................*/
     CLIR(Ihistogramme______nombre_de_points);
                                        /* Initialisation du calcul du nombre de points dans l'image.                                */
     CLIR(cumul_niveau);
                                        /* Initialisation du calcul du niveau moyen.                                                 */

     EGAL(Ihistogramme______niveau_minimal,BLANC);
                                        /* Initialisation du minimum sur la plus forte valeur possible :                             */
                                        /*                                                                                           */
                                        /* ATTENTION, il y a eu pendant longtemps :                                                  */
                                        /*                                                                                           */
                                        /*                  EGAL(Ihistogramme______niveau_minimal,INFINI);                           */
                                        /*                                                                                           */
                                        /* mais cette valeur 'INFINI' n'est pas possible pour un 'genere_p'...                       */
     EGAL(Ihistogramme______niveau_maximal,NOIR);
                                        /* Initialisation du maximum sur la plus faible valeur possible :                            */
                                        /*                                                                                           */
                                        /* ATTENTION, il y a eu pendant longtemps :                                                  */
                                        /*                                                                                           */
                                        /*                  EGAL(Ihistogramme______niveau_maximal,MOINS_L_INFINI);                   */
                                        /*                                                                                           */
                                        /* mais cette valeur 'MOINS_L_INFINI' n'est pas possible pour un 'genere_p'...               */

     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          CLIR(ACCES_HISTOGRAMME(niveau));
                                        /* Initialisation du comptage dans l'histogramme.                                            */
          Eblock
     EBoI

     traite_image_BH_GD(BLOC(INCR(Ihistogramme______nombre_de_points,I);
                                        /* Et on compte le nombre de points traites.                                                 */

                             EGAL(niveau_courant,load_point(imageA,X,Y));

                             INCR(cumul_niveau,FLOT(niveau_courant));
                                        /* Pour calculer ulterieurement le niveau moyen.                                             */

                             EGAL(Ihistogramme______niveau_minimal,MIN2(Ihistogramme______niveau_minimal,niveau_courant));
                             EGAL(Ihistogramme______niveau_maximal,MAX2(Ihistogramme______niveau_maximal,niveau_courant));
                                        /* Recherche des extrema.                                                                    */

                             INCR(ACCES_HISTOGRAMME(niveau_courant),I);
                                        /* Mise a jour de l'histogramme par comptage du niveau courant 'niveau_courant'.             */
                             )
                        );

     Test(IZNE(Ihistogramme______nombre_de_points))
          Bblock
          EGAL(Ihistogramme______niveau_moyen,GENP(DIVI(cumul_niveau,FLOT(Ihistogramme______nombre_de_points))));
                                        /* Lorsqu'au moins un point a ete traite, on peut calculer le niveau moyen...                */
          Eblock
     ATes
          Bblock
          EGAL(Ihistogramme______niveau_moyen,NIVEAU_UNDEF);
                                        /* Sinon, le niveau moyen est considere comme indefini.                                      */
          Eblock
     ETes

     CLIR(cumul_points);
                                        /* Pour valider l'histogramme.                                                               */

     EGAL(Ihistogramme______nombre_de_points_minimal,INFINI);
                                        /* Initialisation du minimum sur une forte valeur positive.                                  */
     EGAL(Ihistogramme______nombre_de_points_maximal,MOINS_L_INFINI);
                                        /* Initialisation du maximum sur une forte valeur negative.                                  */

     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          INCR(cumul_points,ACCES_HISTOGRAMME(niveau));

          EGAL(Ihistogramme______nombre_de_points_minimal,MIN2(Ihistogramme______nombre_de_points_minimal,ACCES_HISTOGRAMME(niveau)));
          EGAL(Ihistogramme______nombre_de_points_maximal,MAX2(Ihistogramme______nombre_de_points_maximal,ACCES_HISTOGRAMME(niveau)));
                                        /* Et enfin, recherche du plus petit et du plus grand nombres de points                      */
                                        /* possedant un meme niveau.                                                                 */
          Eblock
     EBoI

     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          Test(IFEQ(niveau,NOIR))
               Bblock
               EGAL(ACCES_HISTOGRAMME_CUMULE(niveau)
                   ,ACCES_HISTOGRAMME(niveau)
                    );
                                        /* Pour le niveau 'NOIR' il y a identite entre l'histogramme et l'histogramme "cumule"...    */
               Eblock
          ATes
               Bblock
               EGAL(ACCES_HISTOGRAMME_CUMULE(niveau)
                   ,ADD2(ACCES_HISTOGRAMME_CUMULE(PREN(niveau)),ACCES_HISTOGRAMME(niveau))
                    );
                                        /* Au-dela, on cumule avec les niveaux anterieurs...                                         */
               Eblock
          ETes
          Eblock
     EBoI

     Test(IFEQ(cumul_points,Ihistogramme______nombre_de_points))
          Bblock
          DEFV(Int,INIT(borne_superieure_du_niveau,UNDEF));
                                        /* Index de determination du classement des niveaux (mis ici le 20081006135953...).          */
          DEFV(Int,DTb1(histogramme_de_manoeuvre,COULEURS));
                                        /* Copie de l'histogramme destinee a calculer le classement des niveaux (mis ici le          */
                                        /* 20081006135953...).                                                                       */

          BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
               Bblock
               EGAL(ITb1(histogramme_de_manoeuvre,INDX(niveau,NOIR)),ACCES_HISTOGRAMME(niveau));
                                        /* Initialisation de l'histogramme de manoeuvre destine a classer les niveaux.               */
               EGAL(ITb1(classement_des_niveaux,INDX(niveau,NOIR)),niveau);
                                        /* Initialisation a priori du classement des niveaux.                                        */
               Eblock
          EBoI

          BoDe(borne_superieure_du_niveau,NOIR,PREN(BLANC),PAS_COULEURS)
               Bblock
               BoIn(niveau,NOIR,borne_superieure_du_niveau,PAS_COULEURS)
                    Bblock
                    Test(IFOU(IFET(IL_NE_FAUT_PAS(Ihistogramme_____compatibilite_20081005)
                                  ,IFGT(ITb1(histogramme_de_manoeuvre,INDX(NEUT(niveau),NOIR))
                                       ,ITb1(histogramme_de_manoeuvre,INDX(SUCN(niveau),NOIR))
                                        )
                                   )
                             ,IFET(IL_FAUT(Ihistogramme_____compatibilite_20081005)
                                  ,IFLT(ITb1(histogramme_de_manoeuvre,INDX(NEUT(niveau),NOIR))
                                       ,ITb1(histogramme_de_manoeuvre,INDX(SUCN(niveau),NOIR))
                                        )
                                   )
                              )
                         )
                                        /* Le 20081005115416, j'ai remplace 'IFLT(...)' par 'IFGT(...)' puisqu'il va donner un       */
                                        /* classement croissant et non pas decroissant : les premiers niveaux seront les moins       */
                                        /* peuples, alors que les derniers niveaux seront les plus peuples, ce qui est beaucoup      */
                                        /* plus logique...                                                                           */
                         Bblock
                         SWAP(ITb1(histogramme_de_manoeuvre,INDX(NEUT(niveau),NOIR))
                             ,ITb1(histogramme_de_manoeuvre,INDX(SUCN(niveau),NOIR))
                              );
                         SWAP(ITb1(classement_des_niveaux,INDX(NEUT(niveau),NOIR))
                             ,ITb1(classement_des_niveaux,INDX(SUCN(niveau),NOIR))
                              );
                                        /* Le 20081004114822, je note que 'TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE(...)'       */
                                        /* pourrait etre utilise ici. En fait, je n'opere pas cette modification car, en effet,      */
                                        /* demanderait de parametrer {BoDe,BoIn,EBoI,EBoD}, ainsi que {PREN,SUCN} et 'SWAP'...       */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               EBoI
               Eblock
          EBoD

          BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
               Bblock
               MODIFICATION_LISTE_DE_SUBSTITUTION_HISTOGRAMME(niveau,ITb1(classement_des_niveaux,INDX(niveau,NOIR)));
                                        /* Mise en place de la liste de SUBSTITUTION "histogramme" (introduite le 20081004120006).   */
               Eblock
          EBoI

          EGAL(Ihistogramme_____etat,VALIDE);
                                        /* Et on memorise que les donnees sont valides. Ceci fut mis tout a la fin le 20081006135233 */
                                        /* alors qu'avant cette date c'etait juste apres le 'Test(...)' associe au 'ATes' qui suit.  */
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("l'histogramme est incoherent");

          EGAL(Ihistogramme_____etat,INVALIDE);
                                        /* Et on invalide l'histogramme...                                                           */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   D I M E N S I O N   F R A C T A L E                                                              */
/*        D E   " H A U S D O R F F "   G E N E R A L I S E E   D ' U N E   I M A G E  :                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    On va considerer le 'Masque' courant,                                                                          */
/*                  et pour toutes les valeurs du seuil de                                                                           */
/*                  masquage 'S' dans [NOIR,BLANC] on va calculer                                                                    */
/*                  l'histogramme de l'image Argument. On en                                                                         */
/*                  extrait le nombre 'N' de points possedant                                                                        */
/*                  un niveau argument 'C' donne. Ainsi, 'S'                                                                         */
/*                  definit en quelque sorte une "boite"                                                                             */
/*                  generalisee (dont la forme non necessairement                                                                    */
/*                  connexe est donnee par l'image Masque) et a                                                                      */
/*                  l'interieur de laquelle on calcule le nombre                                                                     */
/*                  'N' de points possedant le niveau Argument                                                                       */
/*                  'C' ; on dira par generalisation que 'S' est                                                                     */
/*                  la taille de la boite. Ainsi, on definira la                                                                     */
/*                  dimension generalisee de Hausdorff 'H' par                                                                       */
/*                  rapport au niveau Argument 'C' comme etant                                                                       */
/*                  le rapport :                                                                                                     */
/*                                                                                                                                   */
/*                           log(N)                                                                                                  */
/*                  H(C) = ----------, moyenne sur toutes les valeurs de 'S' dans [NOIR,BLANC],                                      */
/*                              1                                                                                                    */
/*                         log(e + S)                                                                                                */
/*                                                           1                                                                       */
/*                  'S' etant en fait translate a l'aide de e  afin                                                                  */
/*                  d'eviter des divisions par 0...                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    Je note le 20100525093939 (tres tardivement...)                                                                */
/*                  que pour un seuil donne 'S', on ne mesure le nombre                                                              */
/*                  'N' de points de numero 'C' que dans une seule boite                                                             */
/*                  (definie par le 'Masque' courant) et que cette boite,                                                            */
/*                  ne se deplace donc pas sur 'imageA' pour faire de                                                                */
/*                  nombreuses mesures (une seule est donc faite pour un                                                             */
/*                  seuil donne 'S' ! Cela signifie au passage que pour                                                              */
/*                  les plus petites boites il se peut qu'il n'y ait                                                                 */
/*                  aucun point dedans...).                                                                                          */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

#define   TAILLE_DES_BOITES(niveau)                                                                                                     \
                    LOGX(ADD2(EXPB(UNITE),FLOT(VCOMP(niveau))))                                                                         \
                                        /* Pour passer d'un niveau au logarithme de la taille d'une boite tel qu'il                  */ \
                                        /* ne puisse etre nul afin de figurer en denominateur de fractions ;                         */ \
                                        /* le 'VCOMP' est utilise ici, car en effet, plus 'niveau' est petit                         */ \
                                        /* (c'est-a-dire proche de 'NOIR'), plus la boite est physiquement grande                    */ \
                                        /* (plus elle a de points).                                                                  */ \
                                        /*                                                                                           */ \
                                        /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug              */ \
                                        /* 'BUG_SYSTEME_SG_C_exp'...                                                                 */
DEFV(Common,DEFV(FonctionF,IFdimension_fractale(imageA
                                               ,niveau_de_calcul_de_la_dimension
                                               ,niveau_de_depart,niveau_d_arrivee
                                               ,pas_des_niveaux
                                                )
                 )
     )
                                        /* ATTENTION : pour calculer la dimension fractale par rapport a un niveau                   */
                                        /* de gris argument on va utiliser une suite de "boites" de taille decroissante ;            */
                                        /* ces boites sont en fait donnees par l'image "Masque" (ce sera par exemple une             */
                                        /* 'spirale carree'), et la decroissance des tailles se fait en faisant varier               */
                                        /* le niveau de masquage de 'NOIR' a 'BLANC'...                                              */
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument (ne pas oublier donc que 'Masque' est aussi un Argument,                   */
                                        /* puisque c'est lui qui donne la forme des "boites"...).                                    */
DEFV(Argument,DEFV(genere_p,niveau_de_calcul_de_la_dimension));
                                        /* Niveau pour lequel on calcule la dimension fractale.                                      */
DEFV(Argument,DEFV(genere_p,niveau_de_depart));
                                        /* Niveau de la premiere boite du calcul (en general 'NOIR'),                                */
DEFV(Argument,DEFV(genere_p,niveau_d_arrivee));
                                        /* Niveau de la derniere boite du calcul (en general 'BLANC').                               */
DEFV(Argument,DEFV(Int,pas_des_niveaux));
                                        /* Pas de passage du niveau de depart au niveau d'arrivee (en general                        */
                                        /* 'PAS_COULEURS').                                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(taille_des_boites,UNDEF));
                                        /* Pour fixer, via le niveau de masquage, la taille decroissante des "boites".               */
     DEFV(Int,DTb1(population_des_boites,COULEURS));
                                        /* Pour chaque taille (ou niveau de masquage) on trouve la population (c'est-a-dire          */
                                        /* le nombre de points contenus) de la "boite" correspondante.                               */
     DEFV(Int,INIT(nombre_de_niveaux_cumules,ZERO));
                                        /* On ne comptera que les niveaux ou l'on a trouve des points...                             */
     DEFV(Float,INIT(cumul_de_la_dimension_fractale,FZERO));
                                        /* La dimension fractale Resultat va etre calculee par une moyenne sur l'ensemble            */
                                        /* des boites ; elle est initialisee a zero...                                               */
     /*..............................................................................................................................*/
     Test(IFOU(IZLE(TAILLE_DES_BOITES(NOIR))
              ,IZLE(TAILLE_DES_BOITES(BLANC))
               )
          )
          Bblock
          PRINT_ERREUR("lors du calcul de la dimension fractale, il va y avoir une division par 0");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFOU(IZLE(TAILLE_DES_BOITES(niveau_de_depart))
              ,IZLE(TAILLE_DES_BOITES(niveau_d_arrivee))
               )
          )
          Bblock
          PRINT_ERREUR("lors du calcul de la dimension fractale, il va y avoir une division par 0");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     PUSH_MASQUE;
                                        /* Sauvegarde de l'etat de masquage initial.                                                 */

     DoIn(taille_des_boites,niveau_de_depart,niveau_d_arrivee,pas_des_niveaux)
          Bblock
          MASQUE_IMAGES(taille_des_boites);
                                        /* Ainsi on va faire diminuer la taille des "boites" en masquant du 'NOIR' (ou               */
                                        /* finalement tous les points de l'image seront pris : la taille de la "boite"               */
                                        /* est alors celle d'une image entiere) a 'BLANC' (ou aucun ne sera pris : la                */
                                        /* taille de la "boite" est alors nulle).                                                    */
          CALS(Ihistogramme(imageA));
                                        /* Calcul de l'histogramme de l'image Argument suivant le 'Masque' courant.                  */
          EGAL(ITb1(population_des_boites,INDX(taille_des_boites,NOIR))
              ,ACCES_HISTOGRAMME(niveau_de_calcul_de_la_dimension)
               );
                                        /* La population de la "boite" courante (donnee par le 'Masque') est egale                   */
                                        /* a l'histogramme du niveau pour lequel on calcule la dimension fractale.                   */

          Test(IZLT(ITb1(population_des_boites,INDX(taille_des_boites,NOIR))))
               Bblock
               PRINT_ERREUR("une valeur negative est trouvee dans l'histogramme");
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     EDoI

     DoIn(taille_des_boites,niveau_de_depart,niveau_d_arrivee,pas_des_niveaux)
          Bblock
          Test(IZGT(ITb1(population_des_boites,INDX(taille_des_boites,NOIR))))
               Bblock
               INCR(nombre_de_niveaux_cumules,I);
                                        /* Comptage des niveaux pour lesquels on a trouve des points.                                */
               INCR(cumul_de_la_dimension_fractale
                   ,DIVI(LOGX(ITb1(population_des_boites,INDX(taille_des_boites,NOIR)))
                        ,TAILLE_DES_BOITES(taille_des_boites)
                         )
                    );
                                        /* Le 'VCOMP' est utilise ici (dans 'TAILLE_DES_BOITES'), car en effet, plus                 */
                                        /* 'taille_des_boites' est petit (c'est-a-dire proche de 'NOIR'), plus la                    */
                                        /* boite est physiquement grande (plus elle a de points) ; le 'TAILLE_DES_BOITES'            */
                                        /* est la pour eviter d'une part de prendre le logarithme de 0 et d'autre part               */
                                        /* pour ne pas tomber sur un logarithme qui soit nul, et donc ne pas diviser                 */
                                        /* par 0...                                                                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     EDoI

     PULL_MASQUE;
                                        /* Restauration de l'etat de masquage initial...                                             */

     RETU(COND(IZGT(nombre_de_niveaux_cumules)
              ,DIVI(cumul_de_la_dimension_fractale,FLOT(nombre_de_niveaux_cumules))
              ,DIMENSION_FRACTALE_NULLE
               )
          );
                                        /* Et renvoi de la dimension fractale moyenne...                                             */
     Eblock

#undef    TAILLE_DES_BOITES

EFonctionF

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

BFonctionI

DEFV(Common,DEFV(FonctionI,Icomptage_des_points_dans_un_intervalle(imageA1,niveau_origine,niveau_extremite)))
DEFV(Argument,DEFV(image,imageA1));
                                        /* Image Argument,                                                                           */
DEFV(Argument,DEFV(genere_p,niveau_origine));
DEFV(Argument,DEFV(genere_p,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     traite_image_BH_GD(BLOC(Test(IFINff(load_point(imageA1,X,Y),niveau_origine,niveau_extremite))
                                  Bblock
                                  INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
                                  Eblock
                             ATes
                                  Bblock
                                  Eblock
                             ETes
                             )
                        );

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'image Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,IFcomptage_des_points_dans_un_intervalle(imageA1,niveau_origine,niveau_extremite)))
DEFV(Argument,DEFV(imageF,imageA1));
                                        /* Image Argument,                                                                           */
DEFV(Argument,DEFV(genere_Float,niveau_origine));
DEFV(Argument,DEFV(genere_Float,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     traite_image_BH_GD(BLOC(Test(IFINff(loadF_point(imageA1,X,Y),niveau_origine,niveau_extremite))
                                  Bblock
                                  INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
                                  Eblock
                             ATes
                                  Bblock
                                  Eblock
                             ETes
                             )
                        );

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'image Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,IFdomaine_comptage_des_points_dans_un_intervalle(imageA1
                                                                           ,domaine_Xmin,domaine_Xmax
                                                                           ,domaine_Ymin,domaine_Ymax
                                                                           ,niveau_origine
                                                                           ,niveau_extremite
                                                                            )
                 )
     )
DEFV(Argument,DEFV(imageF,imageA1));
                                        /* Image Argument,                                                                           */
DEFV(Argument,DEFV(Int,domaine_Xmin));
DEFV(Argument,DEFV(Int,domaine_Xmax));
DEFV(Argument,DEFV(Int,domaine_Ymin));
DEFV(Argument,DEFV(Int,domaine_Ymax));
                                        /* Definition du domaine rectangulaire...                                                    */
DEFV(Argument,DEFV(genere_Float,niveau_origine));
DEFV(Argument,DEFV(genere_Float,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     begin_imageQ(DoIn,MAX2(Ymin,domaine_Ymin),MIN2(Ymax,domaine_Ymax),PasY
                 ,DoIn,MAX2(Xmin,domaine_Xmin),MIN2(Xmax,domaine_Xmax),PasX
                  )
          Bblock
          Test(IFINff(loadF_point(imageA1,X,Y),niveau_origine,niveau_extremite))
               Bblock
               INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_imageQ(EDoI,EDoI)

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'image Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,Icomptage_des_coincidences(imageA1,imageA2)))
DEFV(Argument,DEFV(image,imageA1));
                                        /* Premiere image Argument,                                                                  */
DEFV(Argument,DEFV(image,imageA2));
                                        /* Deuxieme image Argument.                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_coincidences,ZERO));
                                        /* Nombre de coincidences entre les deux images arguments (initialement, aucune).            */
     /*..............................................................................................................................*/
     traite_image_BH_GD(BLOC(Test(IFEQ(load_point(imageA1,X,Y),load_point(imageA2,X,Y)))
                                  Bblock
                                  INCR(nombre_de_coincidences,I);
                                        /* Comptage des coincidences entre les deux images arguments.                                */
                                  Eblock
                             ATes
                                  Bblock
                                  Eblock
                             ETes
                             )
                        );

     RETU(nombre_de_coincidences);
                                        /* Et renvoi du nombre de coincidences entre les deux images arguments.                      */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,IFcomptage_des_coincidences(imageA1,imageA2)))
DEFV(Argument,DEFV(imageF,imageA1));
                                        /* Premiere image Argument,                                                                  */
DEFV(Argument,DEFV(imageF,imageA2));
                                        /* Deuxieme image Argument.                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_coincidences,ZERO));
                                        /* Nombre de coincidences entre les deux images arguments (initialement, aucune).            */
     /*..............................................................................................................................*/
     traite_image_BH_GD(BLOC(Test(IFEQ(loadF_point(imageA1,X,Y),loadF_point(imageA2,X,Y)))
                                  Bblock
                                  INCR(nombre_de_coincidences,I);
                                        /* Comptage des coincidences entre les deux images arguments.                                */
                                  Eblock
                             ATes
                                  Bblock
                                  Eblock
                             ETes
                             )
                        );

     RETU(nombre_de_coincidences);
                                        /* Et renvoi du nombre de coincidences entre les deux images arguments.                      */
     Eblock

EFonctionI

_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   G E N E R A L   D U   C E N T R E   D E   G R A V I T E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   CALCUL_D_UN_CENTRE_DE_GRAVITE(image,acces_image,type_image,seuil,centre_de_gravite_X,centre_de_gravite_Y)                     \
                    Bblock                                                                                                              \
                    DEFV(Positive,INIT(nombre_de_points,ZERO));                                                                         \
                    DEFV(Float,INIT(cumul_des_niveaux,FZERO));                                                                          \
                    DEFV(Float,INIT(cumul_coordonnees_X_ponderees,FZERO));                                                              \
                    DEFV(Float,INIT(cumul_coordonnees_Y_ponderees,FZERO));                                                              \
                                                                                                                                        \
                    traite_image_BH_GD(BLOC(DEFV(type_image,INIT(niveau_courant,acces_image(image,X,Y)));                               \
                                                                                                                                        \
                                            Test(IFGE(niveau_courant,seuil))                                                            \
                                                 Bblock                                                                                 \
                                                 INCR(nombre_de_points,I);                                                              \
                                        /* Ne sert a rien, mais on ne sait jamais...                                                 */ \
                                                 INCR(cumul_des_niveaux,niveau_courant);                                                \
                                                                                                                                        \
                                                 INCR(cumul_coordonnees_X_ponderees,MUL2(niveau_courant,_____cNORMALISE_OX(X)));        \
                                                 INCR(cumul_coordonnees_Y_ponderees,MUL2(niveau_courant,_____cNORMALISE_OY(Y)));        \
                                        /* Seuls les points de niveau superieur [ou egal] au seuil sont pris en compte...            */ \
                                                 Eblock                                                                                 \
                                            ATes                                                                                        \
                                                 Bblock                                                                                 \
                                                 Eblock                                                                                 \
                                            ETes                                                                                        \
                                            )                                                                                           \
                                       );                                                                                               \
                                                                                                                                        \
                    Test(IZNE(cumul_des_niveaux))                                                                                       \
                                        /* Test manquant introduit le 20220205080727...                                              */ \
                         Bblock                                                                                                         \
                         EGAL(centre_de_gravite_X,DIVI(cumul_coordonnees_X_ponderees,cumul_des_niveaux));                               \
                         EGAL(centre_de_gravite_Y,DIVI(cumul_coordonnees_Y_ponderees,cumul_des_niveaux));                               \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         PRINT_ATTENTION("lors du calcul du centre de gravite, le cumul des niveaux est nul.");                         \
                                                                                                                                        \
                         EGAL(centre_de_gravite_X,_____cNORMALISE_OX(Xcentre));                                                         \
                         EGAL(centre_de_gravite_Y,_____cNORMALISE_OY(Ycentre));                                                         \
                                        /* Dans ces conditions, arbitrairement, on place le centre de gravite au centre...           */ \
                                        /*                                                                                           */ \
                                        /* Cela peut se produire pour une image ne contenant que des zeros, mais aussi pour une      */ \
                                        /* image 'Float' ou les niveaux negatifs compensent les niveaux positifs...                  */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

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

BFonctionF

DEFV(Common,DEFV(genere_p,SINT(Icentre_de_gravite_____seuil,NOIR)));
DEFV(Common,DEFV(Float,SINT(Icentre_de_gravite_____ponderation_GX,FZERO)));
DEFV(Common,DEFV(Float,SINT(Icentre_de_gravite_____ponderation_GY,FZERO)));

DEFV(Common,DEFV(Float,INIT(Icentre_de_gravite_____coordonnee_X,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(Icentre_de_gravite_____coordonnee_Y,FLOT__UNDEF)));

DEFV(Common,DEFV(FonctionF,Icentre_de_gravite(imageA)))
                                        /* Fonction introduite le 20220204173407...                                                  */
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CALCUL_D_UN_CENTRE_DE_GRAVITE(imageA
                                  ,load_point
                                  ,genere_p
                                  ,Icentre_de_gravite_____seuil
                                  ,Icentre_de_gravite_____coordonnee_X
                                  ,Icentre_de_gravite_____coordonnee_Y
                                   );

     RETU(LIZ2(Icentre_de_gravite_____ponderation_GX,Icentre_de_gravite_____coordonnee_X
              ,Icentre_de_gravite_____ponderation_GY,Icentre_de_gravite_____coordonnee_Y
               )
          );
     Eblock

EFonctionF

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

BFonctionF

DEFV(Common,DEFV(genere_Float,SINT(IFcentre_de_gravite_____seuil,FLOT__NOIR)));
DEFV(Common,DEFV(Float,SINT(IFcentre_de_gravite_____ponderation_GX,FZERO)));
DEFV(Common,DEFV(Float,SINT(IFcentre_de_gravite_____ponderation_GY,FZERO)));

DEFV(Common,DEFV(Float,INIT(IFcentre_de_gravite_____coordonnee_X,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(IFcentre_de_gravite_____coordonnee_Y,FLOT__UNDEF)));

DEFV(Common,DEFV(FonctionF,IFcentre_de_gravite(imageA)))
                                        /* Fonction introduite le 20220204173407...                                                  */
DEFV(Argument,DEFV(imageF,imageA));
                                        /* Image Argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CALCUL_D_UN_CENTRE_DE_GRAVITE(imageA
                                  ,loadF_point
                                  ,genere_Float
                                  ,IFcentre_de_gravite_____seuil
                                  ,IFcentre_de_gravite_____coordonnee_X
                                  ,IFcentre_de_gravite_____coordonnee_Y
                                   );

     RETU(LIZ2(IFcentre_de_gravite_____ponderation_GX,IFcentre_de_gravite_____coordonnee_X
              ,IFcentre_de_gravite_____ponderation_GY,IFcentre_de_gravite_____coordonnee_Y
               )
          );
     Eblock

EFonctionF

#undef    CALCUL_D_UN_CENTRE_DE_GRAVITE
_______________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D U   N O M B R E   D E   P O I N T S                                                                        */
/*        A P P A R T E N A N T   A   U N   C E R T A I N   I N T E R V A L L E                                                      */
/*        D A N S   U N   A L B U M   S T A N D A R D  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Acomptage_des_points_dans_un_intervalle(albumA1,niveau_origine,niveau_extremite)))
DEFV(Argument,DEFV(album,albumA1));
                                        /* Album Argument,                                                                           */
DEFV(Argument,DEFV(genere_p,niveau_origine));
DEFV(Argument,DEFV(genere_p,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     begin_album
          Bblock
          Test(IFINff(Aload_point(albumA1,X,Y,Z),niveau_origine,niveau_extremite))
               Bblock
               INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_album

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'album Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,AFcomptage_des_points_dans_un_intervalle(albumA1,niveau_origine,niveau_extremite)))
DEFV(Argument,DEFV(albumF,albumA1));
                                        /* Album Argument,                                                                           */
DEFV(Argument,DEFV(genere_Float,niveau_origine));
DEFV(Argument,DEFV(genere_Float,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     begin_album
          Bblock
          Test(IFINff(AloadF_point(albumA1,X,Y,Z),niveau_origine,niveau_extremite))
               Bblock
               INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_album

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'album Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,AFdomaine_comptage_des_points_dans_un_intervalle(albumA1
                                                                           ,domaine_Xmin,domaine_Xmax
                                                                           ,domaine_Ymin,domaine_Ymax
                                                                           ,domaine_Zmin,domaine_Zmax
                                                                           ,niveau_origine
                                                                           ,niveau_extremite
                                                                            )
                 )
     )
DEFV(Argument,DEFV(albumF,albumA1));
                                        /* Album Argument,                                                                           */
DEFV(Argument,DEFV(Int,domaine_Xmin));
DEFV(Argument,DEFV(Int,domaine_Xmax));
DEFV(Argument,DEFV(Int,domaine_Ymin));
DEFV(Argument,DEFV(Int,domaine_Ymax));
DEFV(Argument,DEFV(Int,domaine_Zmin));
DEFV(Argument,DEFV(Int,domaine_Zmax));
                                        /* Definition du domaine parallepipedique...                                                 */
DEFV(Argument,DEFV(genere_Float,niveau_origine));
DEFV(Argument,DEFV(genere_Float,niveau_extremite));
                                        /* Definition de l'intervalle de comptage (bornes incluses, voir le 'IFINff(...)' utilise,   */
                                        /* ce qui permet de reduire l'intervalle a un point par : niveau_origine=niveau_extremite).  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_points,ZERO));
                                        /* Nombre de points dans l'intervalle (initialement, aucun).                                 */
     /*..............................................................................................................................*/
     begin_albumQ(DoIn,MAX2(Zmin,domaine_Zmin),MIN2(Zmax,domaine_Zmax),PasZ
                 ,DoIn,MAX2(Ymin,domaine_Ymin),MIN2(Ymax,domaine_Ymax),PasY
                 ,DoIn,MAX2(Xmin,domaine_Xmin),MIN2(Xmax,domaine_Xmax),PasX
                  )
          Bblock
          Test(IFINff(AloadF_point(albumA1,X,Y,Z),niveau_origine,niveau_extremite))
               Bblock
               INCR(nombre_de_points,I);
                                        /* Comptage des points appartenant a l'intervalle Argument.                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_albumQ(EDoD,EDoD,EDoD)

     RETU(nombre_de_points);
                                        /* Et renvoi du nombre de points dans l'intervalle dans l'album Argument.                    */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,Acomptage_des_coincidences(albumA1,albumA2)))
DEFV(Argument,DEFV(album,albumA1));
                                        /* Premier album Argument,                                                                   */
DEFV(Argument,DEFV(album,albumA2));
                                        /* Deuxieme album Argument.                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_coincidences,ZERO));
                                        /* Nombre de coincidences entre les deux albums arguments (initialement, aucune).            */
     /*..............................................................................................................................*/
     begin_album
          Bblock
          Test(IFEQ(Aload_point(albumA1,X,Y,Z),Aload_point(albumA2,X,Y,Z)))
               Bblock
               INCR(nombre_de_coincidences,I);
                                        /* Comptage des coincidences entre les deux albums arguments.                                */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_album

     RETU(nombre_de_coincidences);
                                        /* Et renvoi du nombre de coincidences entre les deux albums arguments.                      */
     Eblock

EFonctionI

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

BFonctionI

DEFV(Common,DEFV(FonctionI,AFcomptage_des_coincidences(albumA1,albumA2)))
DEFV(Argument,DEFV(albumF,albumA1));
                                        /* Premier album Argument,                                                                   */
DEFV(Argument,DEFV(albumF,albumA2));
                                        /* Deuxieme album Argument.                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_coincidences,ZERO));
                                        /* Nombre de coincidences entre les deux albums arguments (initialement, aucune).            */
     /*..............................................................................................................................*/
     begin_album
          Bblock
          Test(IFEQ(AloadF_point(albumA1,X,Y,Z),AloadF_point(albumA2,X,Y,Z)))
               Bblock
               INCR(nombre_de_coincidences,I);
                                        /* Comptage des coincidences entre les deux albums arguments.                                */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_album

     RETU(nombre_de_coincidences);
                                        /* Et renvoi du nombre de coincidences entre les deux albums arguments.                      */
     Eblock

EFonctionI

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

BFonctionL

#define   RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y(begin_1,begin_2,on_a_trouve__un_extremum,extremum,coordonnee,end_2,end_1)                  \
                    Bblock                                                                                                              \
                    begin_1                                                                                                             \
                         Bblock                                                                                                         \
                         begin_2                                                                                                        \
                              Bblock                                                                                                    \
                              Test(EST_FAUX(on_a_trouve__un_extremum))                                                                  \
                                   Bblock                                                                                               \
                                   DEFV(genere_p,INIT(niveau_courant,load_point(imageA,X,Y)));                                          \
                                        /* Recuperation du niveau courant en {X,Y}.                                                  */ \
                                   Test(IFNE(niveau_courant,Icoordonnees_extremales_____niveau_du_fond))                                \
                                        Bblock                                                                                          \
                                        EGAL(extremum,coordonnee);                                                                      \
                                        EGAL(on_a_trouve__un_extremum,VRAI);                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         end_2                                                                                                          \
                         Eblock                                                                                                         \
                    end_1                                                                                                               \
                    Eblock

DEFV(Common,DEFV(genere_p,SINT(Icoordonnees_extremales_____niveau_du_fond,NOIR)));
                                        /* Definition du fond...                                                                     */

DEFV(Common,DEFV(Logical,SINT(Icoordonnees_extremales_____on_a_trouve__Xminimum,FAUX)));
DEFV(Common,DEFV(Int,SINT(Icoordonnees_extremales_____Xminimum,NIVEAU_UNDEF)));
DEFV(Common,DEFV(Logical,SINT(Icoordonnees_extremales_____on_a_trouve__Xmaximum,FAUX)));
DEFV(Common,DEFV(Int,SINT(Icoordonnees_extremales_____Xmaximum,NIVEAU_UNDEF)));
DEFV(Common,DEFV(Logical,SINT(Icoordonnees_extremales_____on_a_trouve__Yminimum,FAUX)));
DEFV(Common,DEFV(Int,SINT(Icoordonnees_extremales_____Yminimum,NIVEAU_UNDEF)));
DEFV(Common,DEFV(Logical,SINT(Icoordonnees_extremales_____on_a_trouve__Ymaximum,FAUX)));
DEFV(Common,DEFV(Int,SINT(Icoordonnees_extremales_____Ymaximum,NIVEAU_UNDEF)));

DEFV(Common,DEFV(FonctionL,Icoordonnees_extremales(imageA)))
                                        /* Fonction introduite le 20190112121122...                                                  */
DEFV(Argument,DEFV(image,imageA));
                                        /* Image argument.                                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y(begin_ligne,begin_colonne
                                       ,Icoordonnees_extremales_____on_a_trouve__Xminimum,Icoordonnees_extremales_____Xminimum,X
                                       ,end_colonne,end_ligne
                                        );

     RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y(begin_ligne_back,begin_colonne
                                       ,Icoordonnees_extremales_____on_a_trouve__Xmaximum,Icoordonnees_extremales_____Xmaximum,X
                                       ,end_colonne,end_ligne_back
                                        );

     RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y(begin_colonne,begin_ligne
                                       ,Icoordonnees_extremales_____on_a_trouve__Yminimum,Icoordonnees_extremales_____Yminimum,Y
                                       ,end_ligne,end_colonne
                                        );

     RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y(begin_colonne_back,begin_ligne
                                       ,Icoordonnees_extremales_____on_a_trouve__Ymaximum,Icoordonnees_extremales_____Ymaximum,Y
                                       ,end_ligne,end_colonne_back
                                        );

     RETU(IFOU(IFOU(EST_FAUX(Icoordonnees_extremales_____on_a_trouve__Xminimum)
                   ,EST_FAUX(Icoordonnees_extremales_____on_a_trouve__Xmaximum)
                    )
              ,IFOU(EST_FAUX(Icoordonnees_extremales_____on_a_trouve__Yminimum)
                   ,EST_FAUX(Icoordonnees_extremales_____on_a_trouve__Ymaximum)
                    )
               )
          );
     Eblock

EFonctionL

#undef    RECHERCHE_DES_EXTREMA_DE_X_ET_DE_Y

_______________________________________________________________________________________________________________________________________



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.