/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   C A D R E   A   L ' I N T E R I E U R   D ' U N E   I M A G E  :                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/cadre_zoom$K' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20210409113936).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   BAS_GAUCHE                                                                                                                    \
                    vecteurs_____Gcon_00                                                                                                \
                                        /* Definition du coin en bas a gauche du cadre,                                              */
#define   BAS_DROITE                                                                                                                    \
                    vecteurs_____Gcon_01                                                                                                \
                                        /* Definition du coin en bas a droite du cadre,                                              */
#define   HAUT_DROITE                                                                                                                   \
                    vecteurs_____Gcon_02                                                                                                \
                                        /* Definition du coin en haut a droite du cadre,                                             */
#define   HAUT_GAUCHE                                                                                                                   \
                    vecteurs_____Gcon_03                                                                                                \
                                        /* Definition du coin en haut a gauche du cadre.                                             */

#define   X_BAS__GAUCHE_IMAGE                                                                                                           \
                    FZERO
#define   Y_BAS__GAUCHE_IMAGE                                                                                                           \
                    FZERO
                                        /* Definition du coin en bas a gauche de l'image.                                            */
#define   X_HAUT_DROITE_IMAGE                                                                                                           \
                    FU
#define   Y_HAUT_DROITE_IMAGE                                                                                                           \
                    FU
                                        /* Definition du coin en haut a droite de l'image.                                           */

#define   X_BAS__GAUCHE_CADRE                                                                                                           \
                    FZERO
#define   Y_BAS__GAUCHE_CADRE                                                                                                           \
                    FZERO
                                        /* Definition du coin en bas a gauche du cadre dit "de zoom".                                */
#define   X_HAUT_DROITE_CADRE                                                                                                           \
                    FU
#define   Y_HAUT_DROITE_CADRE                                                                                                           \
                    FU
                                        /* Definition du coin en haut a droite du cadre dit "de zoom".                               */

#define   UTILISER_LE_MODE_ZOOM                                                                                                         \
                    FAUX
#define   FACTEUR_DU_ZOOM                                                                                                               \
                    FDEUX
#define   TRANSLATION_X_DU_ZOOM                                                                                                         \
                    FZERO
#define   TRANSLATION_Y_DU_ZOOM                                                                                                         \
                    FZERO
#define   EDITER_LES_COORDONNEES_DU_CADRE                                                                                               \
                    FAUX
                                        /* Introduits le 20210413100408 les valeurs par defaut garantissant la compatibilite         */
                                        /* anterieure...                                                                             */
                                        /*                                                                                           */
                                        /* On notera que, pour faciliter l'usage, les translations 'X' et 'Y' sont en coordonees     */
                                        /* "image" dans [0,1], c'est-a-dire avec les memes unites que {{xbgi,ybgi},{xhdi,yhdi}}.     */
                                        /*                                                                                           */
                                        /* Le 20210414123924, pour 'v $xiirc/.MANF.B1.1.$U $xci/cadre_zoom$X', la valeur par defaut  */
                                        /* de 'EDITER_LES_COORDONNEES_DU_CADRE' est passee de 'VRAI' a 'FAUX'...                     */

#define   MULTIPLICATEUR_D_EDITION_DE_LA_TRANSLATION_X_DU_ZOOM                                                                          \
                    FU
#define   DIVISEUR_D_EDITION_______DE_LA_TRANSLATION_X_DU_ZOOM                                                                          \
                    FU
#define   MULTIPLICATEUR_D_EDITION_DE_LA_TRANSLATION_Y_DU_ZOOM                                                                          \
                    FU
#define   DIVISEUR_D_EDITION_______DE_LA_TRANSLATION_Y_DU_ZOOM                                                                          \
                    FU
                                        /* Introduits le 20210423121808 pour faciliter les choses...                                 */

#define   EPAISSEUR_DU_CADRE                                                                                                            \
                    DEUX
#define   OPTIMISER_L_EPAISSEUR_DU_CADRE                                                                                                \
                    FAUX
#define   EPAISSEUR_MINIMALE_DU_CADRE                                                                                                   \
                    EPAISSEUR_DU_CADRE
#define   EPAISSEUR_MAXIMALE_DU_CADRE                                                                                                   \
                    EPAISSEUR_DU_CADRE
#define   RACINE_CARREE_DE_LA_SURFACE_MINIMALE_DU_CADRE                                                                                 \
                    RACX(FRA4(FRA10(FRA10(FU))))
#define   RACINE_CARREE_DE_LA_SURFACE_MAXIMALE_DU_CADRE                                                                                 \
                    RACX(FRA6(FRA10(FU)))
#define   EDITER_LES_INFORMATIONS_UTILES_A_L_OPTIMISATION_DE_L_EPAISSEUR_DU_CADRE                                                       \
                    FAUX
#define   NIVEAU_DU_CADRE                                                                                                               \
                    BLANC
#define   METTRE_UN_LISERE_AUTOUR_DU_CADRE                                                                                              \
                    FAUX
#define   NIVEAU_DU_LISERE_DU_CADRE                                                                                                     \
                    BLANC
                                        /* Definition de l'apparence du cadre. Le lisere a ete introduit le 20210917073348. Quant    */
                                        /* a l'optimisation de l'epaisseur, elle a ete introduite le 20210919083331...               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CHAINE_XBGI                                                                                                                   \
                    "xbgi="
#define   CHAINE_YBGI                                                                                                                   \
                    "ybgi="
#define   CHAINE_XHDI                                                                                                                   \
                    "xhdi="
#define   CHAINE_YHDI                                                                                                                   \
                    "yhdi="

#define   CHAINE_XBG                                                                                                                    \
                    "xbg="
#define   CHAINE_YBG                                                                                                                    \
                    "ybg="
#define   CHAINE_XHD                                                                                                                    \
                    "xhd="
#define   CHAINE_YHD                                                                                                                    \
                    "yhd="
                                        /* Ces quatre synonymes ont ete introduits le 20210505101250...                              */

#define   CHAINE_TRX                                                                                                                    \
                    "trx="
#define   CHAINE_TRY                                                                                                                    \
                    "try="

#define   RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(contexte)                                                                              \
                    Bblock                                                                                                              \
                    RCG(contexte);                                                                                                      \
                                        /* Mise en place du contexte avant changement eventuel de niveau...                          */ \
                                                                                                                                        \
                    Test(IL_FAUT(mettre_un_lisere_autour_du_cadre))                                                                     \
                                        /* Possibilite introduite le 20210917073348...                                               */ \
                         Bblock                                                                                                         \
                         Test(IFOU(IFEQ(compteur_des_repetitions_du_Repe,PREMIERE_ITERATION_D_UN_Repe)                                  \
                                  ,IFEQ(compteur_des_repetitions_du_Repe,epaisseur_effective_du_cadre)                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              SET_COULEURS(NOIR,niveau_du_lisere_du_cadre);                                                             \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              SET_COULEURS(NOIR,niveau_du_cadre);                                                                       \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure 'RCG(...)' avec changement eventuel de niveau. Ceci a ete introduit le          */ \
                                        /* 20210917113739 suite a l'introduction d'un possible lisere de niveau different de         */ \
                                        /* celui du cadre...                                                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   C A D R E   A   L ' I N T E R I E U R   D ' U N E   I M A G E  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));

     DEFV(Float,INIT(X_bas__gauche_image,X_BAS__GAUCHE_IMAGE));
     DEFV(Float,INIT(Y_bas__gauche_image,Y_BAS__GAUCHE_IMAGE));
                                        /* Definition du coin en bas a gauche de l'image.                                            */
     DEFV(Float,INIT(X_haut_droite_image,X_HAUT_DROITE_IMAGE));
     DEFV(Float,INIT(Y_haut_droite_image,Y_HAUT_DROITE_IMAGE));
                                        /* Definition du coin en haut a droite de l'image.                                           */
     DEFV(Float,INIT(X_bas__gauche_cadre,X_BAS__GAUCHE_CADRE));
     DEFV(Float,INIT(Y_bas__gauche_cadre,Y_BAS__GAUCHE_CADRE));
                                        /* Definition du coin en bas a gauche du cadre dit "de zoom".                                */
     DEFV(Float,INIT(X_haut_droite_cadre,X_HAUT_DROITE_CADRE));
     DEFV(Float,INIT(Y_haut_droite_cadre,Y_HAUT_DROITE_CADRE));
                                        /* Definition du coin en haut a droite du cadre dit "de zoom".                               */

     DEFV(Logical,INIT(utiliser_le_mode_zoom,UTILISER_LE_MODE_ZOOM));
     DEFV(Float,INIT(facteur_du_zoom,FACTEUR_DU_ZOOM));
     DEFV(Float,INIT(translation_X_du_zoom,TRANSLATION_X_DU_ZOOM));
     DEFV(Float,INIT(translation_Y_du_zoom,TRANSLATION_Y_DU_ZOOM));
     DEFV(Logical,INIT(editer_les_coordonnees_du_cadre,EDITER_LES_COORDONNEES_DU_CADRE));
                                        /* Introduits le 20210413100408 les valeurs par defaut garantissant la compatibilite         */
                                        /* anterieure...                                                                             */
                                        /*                                                                                           */
                                        /* On notera que, pour faciliter l'usage, les translations 'X' et 'Y' sont en coordonees     */
                                        /* "image" dans [0,1], c'est-a-dire avec les memes unites que {{xbgi,ybgi},{xhdi,yhdi}}.     */

     DEFV(Float,INIT(multiplicateur_d_edition_de_la_translation_X_du_zoom,MULTIPLICATEUR_D_EDITION_DE_LA_TRANSLATION_X_DU_ZOOM));
     DEFV(Float,INIT(diviseur_d_edition_______de_la_translation_X_du_zoom,DIVISEUR_D_EDITION_______DE_LA_TRANSLATION_X_DU_ZOOM));
     DEFV(Float,INIT(multiplicateur_d_edition_de_la_translation_Y_du_zoom,MULTIPLICATEUR_D_EDITION_DE_LA_TRANSLATION_Y_DU_ZOOM));
     DEFV(Float,INIT(diviseur_d_edition_______de_la_translation_Y_du_zoom,DIVISEUR_D_EDITION_______DE_LA_TRANSLATION_Y_DU_ZOOM));
                                        /* Introduits le 20210423121808 pour faciliter les choses...                                 */

     DEFV(Positive,INIT(epaisseur_du_cadre,EPAISSEUR_DU_CADRE));
     DEFV(Logical,INIT(optimiser_l_epaisseur_du_cadre,OPTIMISER_L_EPAISSEUR_DU_CADRE));
     DEFV(Positive,INIT(epaisseur_minimale_du_cadre,EPAISSEUR_MINIMALE_DU_CADRE));
     DEFV(Positive,INIT(epaisseur_maximale_du_cadre,EPAISSEUR_MAXIMALE_DU_CADRE));
     DEFV(Float,INIT(racine_carree_de_la_surface_minimale_du_cadre,RACINE_CARREE_DE_LA_SURFACE_MINIMALE_DU_CADRE));
     DEFV(Float,INIT(racine_carree_de_la_surface_maximale_du_cadre,RACINE_CARREE_DE_LA_SURFACE_MAXIMALE_DU_CADRE));
     DEFV(Logical,INIT(editer_les_informations_utiles_a_l_optimisation_de_l_epaisseur_du_cadre
                      ,EDITER_LES_INFORMATIONS_UTILES_A_L_OPTIMISATION_DE_L_EPAISSEUR_DU_CADRE
                       )
          );
     DEFV(genere_p,INIT(niveau_du_cadre,NIVEAU_DU_CADRE));
     DEFV(Logical,INIT(mettre_un_lisere_autour_du_cadre,METTRE_UN_LISERE_AUTOUR_DU_CADRE));
     DEFV(genere_p,INIT(niveau_du_lisere_du_cadre,NIVEAU_DU_LISERE_DU_CADRE));
                                        /* Definition de l'apparence du cadre. Le lisere a ete introduit le 20210917073348. Quant    */
                                        /* a l'optimisation de l'epaisseur, elle a ete introduite le 20210919083331...               */

     /*..............................................................................................................................*/
     GET_ARGUMENTSg(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416="
                                       ,SX_SY_SZ_____compatibilite_20070416
                                        );

                         GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);

                         GET_ARGUMENT_F("X_bas_gauche_image=""Xbgi="CHAINE_XBGI ## CHAINE_XBG,X_bas__gauche_image);
                         GET_ARGUMENT_F("Y_bas_gauche_image=""Ybgi="CHAINE_YBGI ## CHAINE_YBG,Y_bas__gauche_image);
                         GET_ARGUMENT_F("X_haut_droite_image=""Xhdi="CHAINE_XHDI ## CHAINE_XHD,X_haut_droite_image);
                         GET_ARGUMENT_F("Y_haut_droite_image=""Yhdi="CHAINE_YHDI ## CHAINE_YHD,Y_haut_droite_image);

                         GET_ARGUMENT_F("X_bas_gauche_cadre=""Xbgc=""xbgc=",X_bas__gauche_cadre);
                         GET_ARGUMENT_F("Y_bas_gauche_cadre=""Ybgc=""ybgc=",Y_bas__gauche_cadre);
                         GET_ARGUMENT_F("X_haut_droite_cadre=""Xhdc=""xhdc=",X_haut_droite_cadre);
                         GET_ARGUMENT_F("Y_haut_droite_cadre=""Yhdc=""yhdc=",Y_haut_droite_cadre);

                         GET_ARGUMENT_L("mode_zoom=""mz=",utiliser_le_mode_zoom);
                         GET_ARGUMENT_F("facteur_zoom=""fz=",facteur_du_zoom);
                         GET_ARGUMENT_F("translation_X=""trX="CHAINE_TRX,translation_X_du_zoom);
                         GET_ARGUMENT_F("translation_Y=""trY="CHAINE_TRY,translation_Y_du_zoom);
                         GET_ARGUMENT_L("editer_coordonnees_du_cadre=""eec=",editer_les_coordonnees_du_cadre);
                                        /* Arguments introduits le 20210413100408 et completes le 20210413103757...                  */

                         GET_ARGUMENT_F("multiplicateur_edition_translation_X=""mtrX=""mtrx="
                                       ,multiplicateur_d_edition_de_la_translation_X_du_zoom
                                        );
                         GET_ARGUMENT_F("diviseur_edition_translation_X=""dtrX=""dtrx="
                                       ,diviseur_d_edition_______de_la_translation_X_du_zoom
                                        );
                         GET_ARGUMENT_F("multiplicateur_edition_translation_Y=""mtrY=""mtry="
                                       ,multiplicateur_d_edition_de_la_translation_Y_du_zoom
                                        );
                         GET_ARGUMENT_F("diviseur_edition_translation_Y=""dtrY=""dtry="
                                       ,diviseur_d_edition_______de_la_translation_Y_du_zoom
                                        );
                                        /* Introduits le 20210423121808 pour faciliter les choses...                                 */
                                        /*                                                                                           */
                                        /* Pour aider a la determination des bonnes translations en 'X' et en 'Y' lors de            */
                                        /* l'utilisation suivante de 'v $xci/cadre_zoom$K'. On notera qu'un facteur unique pourrait  */
                                        /* suffire mais l'avantage d'utiliser un multiplicateur et un diviseur est que cela facilite */
                                        /* l'utilisation de pourcentage, par exemple :                                               */
                                        /*                                                                                           */
                                        /*                  mtrX=65                                                                  */
                                        /*                  dtrx=100                                                                 */
                                        /*                                                                                           */
                                        /* definira un facteur egal a 65%...                                                         */
                                        /*                                                                                           */
                                        /* Le 20210504094842, je rappelle que la procedure est la suivante :                         */
                                        /*                                                                                           */
                                        /*                                      xhdi                                                 */
                                        /*                                      |                                                    */
                                        /*                   ------------------- -yhdi                                               */
                                        /*                  |                   |                                                    */
                                        /*                  | IMAGE             |                                                    */
                                        /*                  |                   |                                                    */
                                        /*                  |     ---------     |                                                    */
                                        /*                  |    |         |    |                                                    */
                                        /*                  |    |         |    |                                                    */
                                        /*                  |    |  CADRE  |    |                                                    */
                                        /*                  |    |         |    |                                                    */
                                        /*                  |    |         |    |                                                    */
                                        /*                  |     ---------     |                                                    */
                                        /*                  |trY/               |                                                    */
                                        /*                  |  /                |                                                    */
                                        /*                  | /                 |                                                    */
                                        /*                  |/trX               |                                                    */
                                        /*             ybgi- -------------------                                                     */
                                        /*                  |                                                                        */
                                        /*                  xbgi                                                                     */
                                        /*                                                                                           */
                                        /* et on passe de IMAGE a CADRE a l'aide d'un zoom translate defini par les arguments :      */
                                        /*                                                                                           */
                                        /*                  facteur_zoom=...                        (definit le rapport IMAGE/CADRE) */
                                        /*                                                                                           */
                                        /*                  multiplicateur_edition_translation_X=...(definit 'mtrX')                 */
                                        /*                  diviseur_edition_translation_X=...      (definit 'dtrX')                 */
                                        /*                                                                                           */
                                        /*                  multiplicateur_edition_translation_Y=...(definit 'mtrY')                 */
                                        /*                  diviseur_edition_translation_Y=...      (definit 'dtrY')                 */
                                        /*                                                                                           */
                                        /* donnant ensuite les editions des translations en 'X' et en 'Y' :                          */
                                        /*                                                                                           */
                                        /*                                               mtrX                                        */
                                        /*                  translation_X = (xhdi-xbgi).------                                       */
                                        /*                                               dtrX                                        */
                                        /*                                                                                           */
                                        /*                                               mtrY                                        */
                                        /*                  translation_Y = (yhdi-ybgi).------                                       */
                                        /*                                               dtrY                                        */
                                        /*                                                                                           */
                                        /* exploitables ensuite pour positionner au mieux le CADRE.                                  */

                         GET_ARGUMENT_I("epaisseur=""e=",epaisseur_du_cadre);
                         GET_ARGUMENT_L("optimiser_epaisseur=""oe=",optimiser_l_epaisseur_du_cadre);
                         GET_ARGUMENT_I("epaisseur_minimale=""em=",epaisseur_minimale_du_cadre);
                         GET_ARGUMENT_I("epaisseur_maximale=""eM=",epaisseur_maximale_du_cadre);
                         GET_ARGUMENT_F("racine_carree_surface_minimale=""rcsm=",racine_carree_de_la_surface_minimale_du_cadre);
                         GET_ARGUMENT_F("racine_carree_surface_maximale=""rcsM=",racine_carree_de_la_surface_maximale_du_cadre);
                         GET_ARGUMENT_L("editer_informations_epaisseur=""eie="
                                       ,editer_les_informations_utiles_a_l_optimisation_de_l_epaisseur_du_cadre
                                        );
                         GET_ARGUMENT_P("cadre=""c=""niveau=""n=",niveau_du_cadre);
                         GET_ARGUMENT_L("lisere_cadre=""lc=",mettre_un_lisere_autour_du_cadre);
                         GET_ARGUMENT_P("lisere=""l=",niveau_du_lisere_du_cadre);
                                        /* Definition de l'apparence du cadre. Le lisere a ete introduit le 20210917073348. Quant    */
                                        /* a l'optimisation de l'epaisseur, elle a ete introduite le 20210919083331...               */
                         )
                    );

     Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageG,nom_imageA))))
          Bblock
          DEFV(Float,INIT(X_bas__gauche_cadre_renormalise,FLOT__UNDEF));
          DEFV(Float,INIT(Y_bas__gauche_cadre_renormalise,FLOT__UNDEF));

          DEFV(Float,INIT(X_haut_droite_cadre_renormalise,FLOT__UNDEF));
          DEFV(Float,INIT(Y_haut_droite_cadre_renormalise,FLOT__UNDEF));
                                        /* Ainsi, on fait comme si les coordonnees dites "images" definies par :                     */
                                        /*                                                                                           */
                                        /*                  [X_bas__gauche_image,X_haut_droite_image]                                */
                                        /*                  [Y_bas__gauche_image,Y_haut_droite_image]                                */
                                        /*                                                                                           */
                                        /* correspondait a [0,1]x[0,1] ce qui permet de renormaliser les coordonnees dites "cadre" : */
                                        /*                                                                                           */
                                        /*                  [X_bas__gauche_cadre,X_haut_droite_cadre]                                */
                                        /*                  [Y_bas__gauche_cadre,Y_haut_droite_cadre]                                */
                                        /*                                                                                           */
                                        /* et donc de pouvoir tracer le nouveau cadre...                                             */

          Test(IL_FAUT(utiliser_le_mode_zoom))
                                        /* Test introduit le 20210413100408...                                                       */
               Bblock
               DEFV(Float,INIT(largeur_de_l_image,SOUS(X_haut_droite_image,X_bas__gauche_image)));
               DEFV(Float,INIT(hauteur_de_l_image,SOUS(Y_haut_droite_image,Y_bas__gauche_image)));

               EGAL(X_bas__gauche_cadre
                   ,AXPB(INVZ(facteur_du_zoom)
                        ,SOUS(X_bas__gauche_image,X_bas__gauche_image)
                        ,ADD2(X_bas__gauche_image,translation_X_du_zoom)
                         )
                    );
               EGAL(Y_bas__gauche_cadre
                   ,AXPB(INVZ(facteur_du_zoom)
                        ,SOUS(Y_bas__gauche_image,Y_bas__gauche_image)
                        ,ADD2(Y_bas__gauche_image,translation_Y_du_zoom)
                         )
                    );
               EGAL(X_haut_droite_cadre
                   ,AXPB(INVZ(facteur_du_zoom)
                        ,largeur_de_l_image
                        ,ADD2(X_bas__gauche_image,translation_X_du_zoom)
                         )
                    );
               EGAL(Y_haut_droite_cadre
                   ,AXPB(INVZ(facteur_du_zoom)
                        ,hauteur_de_l_image
                        ,ADD2(Y_bas__gauche_image,translation_Y_du_zoom)
                         )
                    );
                                        /* Ainsi, le cadre est une version "zoomee" de l'image (de son cadre...).                    */

               Test(IL_FAUT(editer_les_coordonnees_du_cadre))
                                        /* Test introduit le 20210413103757...                                                       */
                    Bblock
                    Test(EST_VRAI(UNE_EDITION_PARALLELE_EST_POSSIBLE))
                                        /* Test introduit le 20210414102644 car, en effet, ce programme sera en general utilise      */
                                        /* via 'execRVB' ('v $xiirc/.MANF.B1.1.$U execRVB....xci.cadre_zoom.X') et il est n'est      */
                                        /* pas utile que cette edition ait lieu trois fois...                                        */
                         Bblock
                         CALS(Fsauts_de_lignes(UN));

                         CAL3(Prme1("LargeurImage=%+.^^^     [translation_X=fraction(LargeurImage)]\n",largeur_de_l_image));
                         CAL3(Prme1("HauteurImage=%+.^^^     [translation_Y=fraction(HauteurImage)]\n",hauteur_de_l_image));
                                        /* Ces deux informations sont editees afin d'aider a determiner les translations en          */
                                        /* 'X' et 'Y' du zoom...                                                                     */

                         CALS(Fsauts_de_lignes(UN));

                         CAL3(Prme2("%s%+.^^^\n",CHAINE_XBG,X_bas__gauche_cadre));
                         CAL3(Prme2("%s%+.^^^\n",CHAINE_XHD,X_haut_droite_cadre));
                         CAL3(Prme2("%s%+.^^^\n",CHAINE_YBG,Y_bas__gauche_cadre));
                         CAL3(Prme2("%s%+.^^^\n",CHAINE_YHD,Y_haut_droite_cadre));

                         CALS(Fsauts_de_lignes(UN));

                         CAL3(Prme2("%s%+.^^^\n"
                                   ,CHAINE_TRX
                                   ,SCAL(largeur_de_l_image
                                        ,diviseur_d_edition_______de_la_translation_X_du_zoom
                                        ,multiplicateur_d_edition_de_la_translation_X_du_zoom
                                         )
                                    )
                              );
                         CAL3(Prme2("%s%+.^^^\n"
                                   ,CHAINE_TRY
                                   ,SCAL(hauteur_de_l_image
                                        ,diviseur_d_edition_______de_la_translation_Y_du_zoom
                                        ,multiplicateur_d_edition_de_la_translation_Y_du_zoom
                                         )
                                    )
                              );
                                        /* Pour aider a la determination des bonnes translations en 'X' et en 'Y' lors de            */
                                        /* l'utilisation suivante de 'v $xci/cadre_zoom$K'.                                          */

                         CALS(Fsauts_de_lignes(UN));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test(IL_FAUT(editer_les_coordonnees_du_cadre))
                    Bblock
                    PRINT_ATTENTION("l'edition des coordonnees du cadre n'a de sens qu'en mode 'zoom'.");
                                        /* Edition introduite le 20210414102644...                                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          EGAL(X_bas__gauche_cadre_renormalise
              ,HOMZ(X_bas__gauche_cadre
                   ,X_bas__gauche_image,X_haut_droite_image
                   ,_____cNORMALISE_OX(Xmin),_____cNORMALISE_OX(Xmax)
                   ,_____cNORMALISE_OX(Xmin)
                    )
               );
          EGAL(Y_bas__gauche_cadre_renormalise
              ,HOMZ(Y_bas__gauche_cadre
                   ,Y_bas__gauche_image,Y_haut_droite_image
                   ,_____cNORMALISE_OY(Ymin),_____cNORMALISE_OY(Ymax)
                   ,_____cNORMALISE_OY(Ymin)
                    )
               );

          EGAL(X_haut_droite_cadre_renormalise
              ,HOMZ(X_haut_droite_cadre
                   ,X_bas__gauche_image,X_haut_droite_image
                   ,_____cNORMALISE_OX(Xmin),_____cNORMALISE_OX(Xmax)
                   ,_____cNORMALISE_OX(Xmin)
                    )
               );
          EGAL(Y_haut_droite_cadre_renormalise
              ,HOMZ(Y_haut_droite_cadre
                   ,Y_bas__gauche_image,Y_haut_droite_image
                   ,_____cNORMALISE_OY(Ymin),_____cNORMALISE_OY(Ymax)
                   ,_____cNORMALISE_OY(Ymin)
                    )
               );
                                        /* Ainsi, on fait comme si les coordonnees dites "images" definies par :                     */
                                        /*                                                                                           */
                                        /*                  [X_bas__gauche_image,X_haut_droite_image]                                */
                                        /*                  [Y_bas__gauche_image,Y_haut_droite_image]                                */
                                        /*                                                                                           */
                                        /* correspondait a [0,1]x[0,1] ce qui permet de renormaliser les coordonnees dites "cadre" : */
                                        /*                                                                                           */
                                        /*                  [X_bas__gauche_cadre,X_haut_droite_cadre]                                */
                                        /*                  [Y_bas__gauche_cadre,Y_haut_droite_cadre]                                */
                                        /*                                                                                           */
                                        /* et donc de pouvoir tracer le nouveau cadre...                                             */

          SET_COULEURS(NOIR,niveau_du_cadre);
                                        /* Par defaut...                                                                             */

          SET_CURSOR(X_bas__gauche_cadre_renormalise
                    ,Y_bas__gauche_cadre_renormalise
                    ,_____cNORMALISE_OZ(Zmin)
                     );
          WCG(BAS_GAUCHE);
                                        /* Definition du coin en bas a gauche du cadre nouveau,                                      */
          SET_CURSOR(X_haut_droite_cadre_renormalise
                    ,Y_bas__gauche_cadre_renormalise
                    ,_____cNORMALISE_OZ(Zmin)
                     );
          WCG(BAS_DROITE);
                                        /* Definition du coin en bas a droite du cadre nouveau,                                      */
          SET_CURSOR(X_haut_droite_cadre_renormalise
                    ,Y_haut_droite_cadre_renormalise
                    ,_____cNORMALISE_OZ(Zmin)
                     );
          WCG(HAUT_DROITE);
                                        /* Definition du coin en haut a droite du cadre nouveau,                                     */
          SET_CURSOR(X_bas__gauche_cadre_renormalise
                    ,Y_haut_droite_cadre_renormalise
                    ,_____cNORMALISE_OZ(Zmin)
                     );
          WCG(HAUT_GAUCHE);
                                        /* Definition du coin en haut a gauche du cadre nouveau.                                     */

          begin_nouveau_block
               Bblock
               DEFV(Positive,INIT(epaisseur_effective_du_cadre,epaisseur_du_cadre));
                                        /* Introduit le 20210919083331...                                                            */

               Test(IL_FAUT(optimiser_l_epaisseur_du_cadre))
                                        /* Test introduit le 20210919083331...                                                       */
                    Bblock
                    DEFV(Float,INIT(largeur_du_cadre
                                   ,SOUS(X_haut_droite_cadre_renormalise,X_bas__gauche_cadre_renormalise)
                                    )
                         );
                    DEFV(Float,INIT(hauteur_du_cadre
                                   ,SOUS(Y_haut_droite_cadre_renormalise,Y_bas__gauche_cadre_renormalise)
                                    )
                         );
                    DEFV(Float,INIT(racine_carree_de_la_surface_du_cadre,FLOT__UNDEF));
                    DEFV(Float,INIT(racine_carree_de_la_surface_seuillee_du_cadre,FLOT__UNDEF));

                    EGAL(racine_carree_de_la_surface_du_cadre,RACX(MUL2(largeur_du_cadre,hauteur_du_cadre)));
                    EGAL(racine_carree_de_la_surface_seuillee_du_cadre
                        ,TRON(racine_carree_de_la_surface_du_cadre
                             ,racine_carree_de_la_surface_minimale_du_cadre
                             ,racine_carree_de_la_surface_maximale_du_cadre
                              )
                         );
                                        /* C'est evidemment la racinee carree de la surface qu'il faut utiliser afin d'obtenir       */
                                        /* une valeur homogene a une longueur qui sera donc "compatible" avec l'epaisseur qui        */
                                        /* elle-aussi est une longueur...                                                            */

                    EGAL(epaisseur_effective_du_cadre
                        ,INTE(HOMO(racine_carree_de_la_surface_seuillee_du_cadre
                                  ,racine_carree_de_la_surface_minimale_du_cadre,racine_carree_de_la_surface_maximale_du_cadre
                                  ,epaisseur_minimale_du_cadre,epaisseur_maximale_du_cadre
                                   )
                              )
                         );

                    Test(IL_FAUT(editer_les_informations_utiles_a_l_optimisation_de_l_epaisseur_du_cadre))
                                        /* Test introduit le 20210919174003...                                                       */
                         Bblock
                         CAL3(Prme1("LargeurCadre....................=%.^^^\n",largeur_du_cadre));
                         CAL3(Prme1("HauteurCadre....................=%.^^^\n",hauteur_du_cadre));
                         CALS(Fsauts_de_lignes(UN));
                         CAL3(Prme1("RacineCarreeSurfaceMinimaleCadre=%.^^^\n",racine_carree_de_la_surface_minimale_du_cadre));
                         CAL3(Prme1("RacineCarreeSurfaceCadre........=%.^^^\n",racine_carree_de_la_surface_du_cadre));
                         CAL3(Prme1("SurfaceMaximaleCadre............=%.^^^\n",racine_carree_de_la_surface_maximale_du_cadre));
                         CALS(Fsauts_de_lignes(UN));
                         CAL3(Prme1("RacineCarreeSurfaceSeuilleeCadre=%.^^^\n",racine_carree_de_la_surface_seuillee_du_cadre));
                         CALS(Fsauts_de_lignes(UN));
                         CAL3(Prme1("EpaisseurMinimaleCadre..........=%d\n",epaisseur_minimale_du_cadre));
                         CAL3(Prme1("EpaisseurCadre..................=%d\n",epaisseur_effective_du_cadre));
                         CAL3(Prme1("EpaisseurMaximaleCadre..........=%d\n",epaisseur_maximale_du_cadre));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Repe(epaisseur_effective_du_cadre)
                    Bblock
                    RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(BAS_GAUCHE);gA;
                    RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(BAS_DROITE);gB;
                    RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(HAUT_DROITE);gB;
                    RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(HAUT_GAUCHE);gB;
                    RCG_AVEC_CHANGEMENT_EVENTUEL_DE_NIVEAU(BAS_GAUCHE);gB;
                                        /* Trace du cadre courant d'epaisseur unite.                                                 */
                    RCG(BAS_GAUCHE);
                    g1;g2;
                    WCG(BAS_GAUCHE);
                                        /* Modification du coin en bas a gauche du cadre courant,                                    */
                    RCG(BAS_DROITE);
                    g3;g2;
                    WCG(BAS_DROITE);
                                        /* Modification du coin en bas a droite du cadre courant,                                    */
                    RCG(HAUT_DROITE);
                    g3;g4;
                    WCG(HAUT_DROITE);
                                        /* Modification du coin en haut a droite du cadre courant,                                   */
                    RCG(HAUT_GAUCHE);
                    g1;g4;
                    WCG(HAUT_GAUCHE);
                                        /* Modification du coin en haut a gauche du cadre courant.                                   */
                    Eblock
               ERep
               Eblock
          end_nouveau_block

          CALi(Iupdate_image(nom_imageR,ImageG));
          Eblock
     ATes
          Bblock
          Test__CODE_ERREUR__ERREUR07;
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



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