/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E S   E X T R E M A   D ' U N E   I M A G E  :                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/extrema$K' :                                                                                               */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1990??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

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

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EDITER_LE_MINIMUM                                                                                                             \
                    VRAI
#define   EDITER_LE_MAXIMUM                                                                                                             \
                    VRAI
#define   EDITER_LE_NIVEAU_MOYEN                                                                                                        \
                    FAUX
#define   EDITER_LES_NIVEAUX_EN_VALEUR_ABSOLUE                                                                                          \
                    FAUX
                                        /* Faut-il editer le minimum et le maximum ('VRAI') ou pas ('FAUX') ? Meme question pour le  */
                                        /* niveau moyen ajoutee le 19980505162028. Le choix entre les niveaux et leur valeur         */
                                        /* absolue a ete introduit le 20030930122728...                                              */

#define   EDITER_LES_COORDONNEES                                                                                                        \
                    VRAI                                                                                                                \
                                        /* Faut-il editer les coordonnees ('VRAI') ou pas ('FAUX') ?                                 */

#define   EDITER_LE_NOM_DU_NIVEAU_ET_DES_COORDONNEES                                                                                    \
                    FAUX                                                                                                                \
                                        /* Faut-il editer le nom du niveau et des coordonnees ('VRAI') ou pas ('FAUX') ?             */

#define   NOMBRE_DE_CHIFFRES_CONSTANT                                                                                                   \
                    FAUX                                                                                                                \
                                        /* Faut-il editer les niveaux de type 'genere_p' avec un nombre de chiffres constant         */ \
                                        /* ('VRAI') ou bien avec juste le nombre de chiffres necessaires ('FAUX') ? Cette            */ \
                                        /* possibilite a ete introduite afin de permettre de faire des tris numeriques a l'aide      */ \
                                        /* de '$SOR' ; voir a ce propos la sequence :                                                */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 7 1 / 018780_018907                                               */ \
                                        /*                                                                                           */ \
                                        /* qui l'utilise...                                                                          */

#define   NOMBRE_DE_DECIMALES                                                                                                           \
                    SEIZE                                                                                                               \
                                        /* Pour garantir la compatibilite anterieure...                                              */
#include  xci/valeurs.01.I"
                                        /* Introduit le 20030507153405 pour parametrer les editions de type 'Float'...               */

#define   TERMINER_LES_SORTIES_PAR_UN_K_LF                                                                                              \
                    VRAI                                                                                                                \
                                        /* Faut-il editer un 'K_LF' en dernier ('VRAI') ou pas ('FAUX') ? Le 20141202162026, la      */ \
                                        /* valeur par defaut est passee de 'FAUX' a 'VRAI'...                                        */

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

#define   EDITER_UN_NIVEAU_genere_p(editer_le_niveau,niveau_a_editer,edition_des_coordonnees)                                           \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_le_niveau))                                                                                     \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer_le_nom_et_du_niveau_et_des_coordonnees))                                                   \
                              Bblock                                                                                                    \
                              CALS(FPrme0("n="));                                                                                       \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CAL3(Prme2("%0*d"                                                                                              \
                                   ,NOMBRE_DE_CHIFFRES_NECESSAIRES(niveau_a_editer)                                                     \
                                   ,niveau_a_editer                                                                                     \
                                    )                                                                                                   \
                              );                                                                                                        \
                         CALS(FPrme0(" "));                                                                                             \
                                                                                                                                        \
                         BLOC(edition_des_coordonnees);                                                                                 \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition d'un niveau de type 'Float'.                                                      */
#define   EDITER_LES_COORDONNEES_D_UN_POINT(point)                                                                                      \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_les_coordonnees))                                                                               \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer_le_nom_et_du_niveau_et_des_coordonnees))                                                   \
                              Bblock                                                                                                    \
                              CALS(FPrme0("x="));                                                                                       \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CAL3(Prme1("%.^^^",ASD1(point,x)));                                                                            \
                                        /* Le 20060105154935, le format "16g" est passe a "^^g" pour plus de souplesse...            */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123227, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                         CALS(FPrme0(" "));                                                                                             \
                                                                                                                                        \
                         Test(IL_FAUT(editer_le_nom_et_du_niveau_et_des_coordonnees))                                                   \
                              Bblock                                                                                                    \
                              CALS(FPrme0("y="));                                                                                       \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CAL3(Prme1("%.^^^",ASD1(point,y)));                                                                            \
                                        /* Le 20060105154935, le format "16g" est passe a "^^g" pour plus de souplesse...            */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123227, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                         CALS(FPrme0(" "));                                                                                             \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition des coordonnees d'un point...                                                     */

#include  xci/valeurs.02.I"
                                        /* Introduit le 20030507153405 pour parametrer les editions de type 'Float'...               */

#define   EDITER_UN_NIVEAU_Float(il_faut_mettre_un_espace,editer_le_niveau,niveau_a_editer)                                             \
                    Bblock                                                                                                              \
                    Test(il_faut_mettre_un_espace)                                                                                      \
                         Bblock                                                                                                         \
                         CALS(FPrme0(" "));                                                                                             \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(editer_le_niveau))                                                                                     \
                         Bblock                                                                                                         \
                         CAL3(Prme2(Cara(chain_Aconcaten4(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition))                   \
                                   ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales)                                                   \
                                   ,niveau_a_editer                                                                                     \
                                    )                                                                                                   \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition d'un niveau de type 'Float'.                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E S   E X T R E M A   D ' U N E   I M A G E  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
     DEFV(Logical,INIT(editer_le_minimum,EDITER_LE_MINIMUM));
     DEFV(Logical,INIT(editer_le_maximum,EDITER_LE_MAXIMUM));
     DEFV(Logical,INIT(editer_le_niveau_moyen,EDITER_LE_NIVEAU_MOYEN));
     DEFV(Logical,INIT(editer_les_niveaux_en_valeur_absolue,EDITER_LES_NIVEAUX_EN_VALEUR_ABSOLUE));
                                        /* Faut-il editer le minimum et le maximum ('VRAI') ou pas ('FAUX') ? Meme question pour le  */
                                        /* niveau moyen ajoutee le 19980505162028. Le choix entre les niveaux et leur valeur         */
                                        /* absolue a ete introduit le 20030930122728...                                              */
     DEFV(Logical,INIT(editer_les_coordonnees,EDITER_LES_COORDONNEES));
                                        /* Faut-il editer les coordonnees ('VRAI') ou pas ('FAUX') ?                                 */
     DEFV(Logical,INIT(editer_le_nom_et_du_niveau_et_des_coordonnees,EDITER_LE_NOM_DU_NIVEAU_ET_DES_COORDONNEES));
                                        /* Faut-il editer le nom du niveau et des coordonnees ('VRAI') ou pas ('FAUX') ?             */
     DEFV(Logical,INIT(nombre_de_chiffres_constant,NOMBRE_DE_CHIFFRES_CONSTANT));
                                        /* Faut-il editer les niveaux de type 'genere_p' avec un nombre de chiffres constant         */
                                        /* ('VRAI') ou bien avec juste le nombre de chiffres necessaires ('FAUX') ? Cette            */
                                        /* possibilite a ete introduite afin de permettre de faire des tris numeriques a l'aide      */
                                        /* de '$SOR' ; voir a ce propos la sequence :                                                */
                                        /*                                                                                           */
                                        /*                  xivPdf 7 1 / 018780_018907                                               */
                                        /*                                                                                           */
                                        /* qui l'utilise...                                                                          */

#include  xci/valeurs.03.I"
                                        /* Introduit le 20030507153405 pour parametrer les editions de type 'Float'...               */

     DEFV(Logical,INIT(terminer_les_sorties_par_un_K_LF,TERMINER_LES_SORTIES_PAR_UN_K_LF));
                                        /* Faut-il editer un 'K_LF' en dernier ('VRAI') ou pas ('FAUX') ? Le 20141202162026, la      */
                                        /* valeur par defaut est passee de 'FAUX' a 'VRAI'...                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_L("standard=",les_images_sont_standards);
                         GET_ARGUMENT_L("inverser=",Inivo_extrema_____inverser_l_ordre_de_parcours_des_points);
                         GET_ARGUMENT_L("minimum=""min=",editer_le_minimum);
                         GET_ARGUMENT_L("maximum=""max=",editer_le_maximum);
                         GET_ARGUMENT_L("moyenne=""moyen=",editer_le_niveau_moyen);
                         GET_ARGUMENT_L("valeur_absolue=""absolue=""abs=",editer_les_niveaux_en_valeur_absolue);
                         GET_ARGUMENT_L("coordonnees=""coord=",editer_les_coordonnees);
                                        /* Introduit le 20060222105508 pour 'v $xE/.divers$Y coord='...                              */
                         GET_ARGUMENT_L("nom=",editer_le_nom_et_du_niveau_et_des_coordonnees);
                         GET_ARGUMENT_L("constant=",nombre_de_chiffres_constant);

                         GET_ARGUMENT_F("minimum_translation=""mt=",IFnivo_extrema_____translation_du_minimum);
                         GET_ARGUMENT_F("maximum_translation=""Mt=",IFnivo_extrema_____translation_du_maximum);
                                        /* Parametres introduits le 20180513113238 par "symetrie" avec 'v $xci/conversion_3D$K mt.'. */

                         GET_ARGUMENT_L("minimum_secondaire=""mins=",IFnivo_extrema_____calculer_le_minimum_secondaire);
                         GET_ARGUMENT_L("maximum_secondaire=""maxs=",IFnivo_extrema_____calculer_le_maximum_secondaire);
                                        /* Introduit le 20091212205839 principalement pour l'etude des 'Z-Buffer's dont une partie   */
                                        /* contient 'Z_Buffer_____valeur_initiale' (qui est le minimum "primaire" mais qui n'est     */
                                        /* d'aucune utilite pour renormaliser 'Z_Buffer').                                           */

                         GET_ARGUMENT_C("signe=",valeurs_signees);
                         GET_ARGUMENT_C("format=",format_d_edition);
                                        /* On notera le 20070302110513, que l'on peut ecrire :                                       */
                                        /*                                                                                           */
                                        /*                  format="f"                                                               */
                                        /*                                                                                           */
                                        /* ('v $Falias_change format=') comme argument explicite dans l'appel a une commande '$X'.   */
                                        /* Par contre, definir :                                                                     */
                                        /*                                                                                           */
                                        /*                  set       PaRaMeTrEs='... format="f" ...'                                */
                                        /*                                                                                           */
                                        /* puis appeler une commande '$X' avec comme argument explicite '$PaRaMeTrEs' ne marchera    */
                                        /* pas car, en effet, les '$K_QD' qui entourent le format 'f' seront integrees au format,    */
                                        /* ce qui est evidemment incorrect ('v $Falias_Udisk format='). Il a donc ete decide a cette */
                                        /* date de ne jamais encadrer des formats ("f", "g",...) par des '$K_QD', quel que soit      */
                                        /* l'utilisation. Au passage, si l'on souhaitait veritablement "double quoter" les formats   */
                                        /* ("f", "g",...), il suffirait d'ecrire :                                                   */
                                        /*                                                                                           */
                                        /*                  set       PaRaMeTrEs=`eval echo '... format="f" ...'`                    */
                                        /*                                                                                           */
                                        /* pour avoir les '$K_QD's et les "effacer" immediatement...                                 */
                         GET_ARGUMENT_I("decimales=",nombre_de_decimales);

                         GET_ARGUMENT_L("ligne=""NL=""LF=",terminer_les_sorties_par_un_K_LF);
                         )
                    );

     Test(EST_VRAI(les_images_sont_standards))
          Bblock
                                        /* Cas d'une image 'image' :                                                                 */
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA))))
               Bblock
               DEFV(genere_p,INIT(niveau_minimum,NIVEAU_UNDEF));
                                        /* Donne le dernier niveau minimal rencontre.                                                */
               DEFV(pointF_2D,point_minimum);
                                        /* Donne les coordonnees dans [0,1] du dernier niveau minimal rencontre.                     */
               DEFV(genere_p,INIT(niveau_maximum,NIVEAU_UNDEF));
                                        /* Donne le dernier niveau maximal rencontre.                                                */
               DEFV(pointF_2D,point_maximum);
                                        /* Donne les coordonnees dans [0,1] du dernier niveau maximal rencontre.                     */

               INITIALISATION_POINT_2D(point_minimum,_____cNORMALISE_OX(UNDEF),_____cNORMALISE_OY(UNDEF));
                                        /* Donne les coordonnees dans [0,1] du dernier niveau minimal rencontre.                     */
               INITIALISATION_POINT_2D(point_maximum,_____cNORMALISE_OX(UNDEF),_____cNORMALISE_OY(UNDEF));
                                        /* Donne les coordonnees dans [0,1] du dernier niveau maximal rencontre.                     */

               CALS(Inivo_extrema(ImageA
                                 ,ADRESSE(niveau_minimum),ADRESSE(point_minimum)
                                 ,ADRESSE(niveau_maximum),ADRESSE(point_maximum)
                                  )
                    );
                                        /* Recherche des extrema...                                                                  */

               EDITER_UN_NIVEAU_genere_p(editer_le_minimum
                                        ,niveau_minimum
                                        ,BLOC(
                                              Bblock
                                              EDITER_LES_COORDONNEES_D_UN_POINT(point_minimum);
                                              Eblock
                                              )
                                         );

               EDITER_UN_NIVEAU_genere_p(editer_le_maximum
                                        ,niveau_maximum
                                        ,BLOC(
                                              Bblock
                                              EDITER_LES_COORDONNEES_D_UN_POINT(point_maximum);
                                              Eblock
                                              )
                                         );

               EDITER_UN_NIVEAU_genere_p(editer_le_niveau_moyen
                                        ,Inivo_extrema_____niveau_moyen
                                        ,BLOC(VIDE;)
                                         );

                                        /* Edition des resultats sous la forme d'une liste d'au plus 7 elements :                    */
                                        /*                                                                                           */
                                        /*                  {minimum,X(minimum),Y(minimum),maximum,X(maximum),Y(maximum),moyen}      */
                                        /*                                                                                           */
                                        /* que l'on peut donc recuperer en tant que liste du Cshell...                               */
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ATes
          Bblock
                                        /* Cas d'une image 'imageF' :                                                                */
          Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA,nom_imageA))))
               Bblock
               DEFV(genere_Float,INIT(niveau_minimum,FLOT__NIVEAU_UNDEF));
                                        /* Donne le dernier niveau minimal rencontre.                                                */
                                        /*                                                                                           */
                                        /* A compter du 20030930122728, 'niveau_minimum' ne sert que pour l'appel de la fonction     */
                                        /* 'IFnivo_extrema(...)'.                                                                    */
               DEFV(genere_Float,INIT(niveau_maximum,FLOT__NIVEAU_UNDEF));
                                        /* Donne le dernier niveau maximal rencontre.                                                */
                                        /*                                                                                           */
                                        /* A compter du 20030930122728, 'niveau_maximum' ne sert que pour l'appel de la fonction     */
                                        /* 'IFnivo_extrema(...)'.                                                                    */

               Test(IL_FAUT(Inivo_extrema_____inverser_l_ordre_de_parcours_des_points))
                    Bblock
                    PRINT_ATTENTION("l'inversion de l'ordre de parcours n'est pas implemente pour les images non standards");
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               CALS(IFnivo_extrema(IFmageA
                                  ,ADRESSE(niveau_minimum)
                                  ,ADRESSE(niveau_maximum)
                                   )
                    );
                                        /* Recherche des extrema...                                                                  */

               EDITER_UN_NIVEAU_Float(TOUJOURS_FAUX
                                     ,editer_le_minimum
                                     ,COND(IL_NE_FAUT_PAS(editer_les_niveaux_en_valeur_absolue)
                                          ,COND(IL_NE_FAUT_PAS(IFnivo_extrema_____calculer_le_minimum_secondaire)
                                               ,IFnivo_extrema_____niveau_minimum
                                               ,IFnivo_extrema_____niveau_minimum_secondaire
                                                )
                                          ,IFnivo_extrema_____niveau_minimum_en_valeur_absolue
                                           )
                                      );
                                        /* L'edition du minimum secondaire a ete introduit le 20091212205839...                      */

               EDITER_UN_NIVEAU_Float(IFET(IL_FAUT(editer_le_minimum)
                                          ,IFOU(IL_FAUT(editer_le_maximum),IL_FAUT(editer_le_niveau_moyen))
                                           )
                                     ,editer_le_maximum
                                     ,COND(IL_NE_FAUT_PAS(editer_les_niveaux_en_valeur_absolue)
                                          ,COND(IL_NE_FAUT_PAS(IFnivo_extrema_____calculer_le_maximum_secondaire)
                                               ,IFnivo_extrema_____niveau_maximum
                                               ,IFnivo_extrema_____niveau_maximum_secondaire
                                                )
                                          ,IFnivo_extrema_____niveau_maximum_en_valeur_absolue
                                           )
                                      );
                                        /* L'edition du minimum secondaire a ete introduit le 20091212205839...                      */

               EDITER_UN_NIVEAU_Float(IFET(IFOU(IL_FAUT(editer_le_minimum),IL_FAUT(editer_le_maximum))
                                          ,IL_FAUT(editer_le_niveau_moyen)
                                           )
                                     ,editer_le_niveau_moyen
                                     ,COND(IL_NE_FAUT_PAS(editer_les_niveaux_en_valeur_absolue)
                                          ,IFnivo_extrema_____niveau_moyen
                                          ,IFnivo_extrema_____niveau_moyen_en_valeur_absolue
                                           )
                                      );

                                        /* Edition des resultats sous la forme d'une liste d'au plus 3 elements :                    */
                                        /*                                                                                           */
                                        /*                  {minimum,maximum,moyen}                                                  */
                                        /*                                                                                           */
                                        /* que l'on peut donc recuperer en tant que liste du Cshell...                               */
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ETes

     Test(PAS_D_ERREUR(CODE_ERREUR))
          Bblock
          Test(IL_FAUT(terminer_les_sorties_par_un_K_LF))
               Bblock
               CALS(Fsauts_de_lignes(UN));
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



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