/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R I M I T I V E S   D E   C O M B I N A I S O N   D E   P I X E L S                                                      */
/*        S O U S   F O R M E   D E   " F O N C T I O N S "  :                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Dans ce fichier se trouvent toutes les                                                                         */
/*                  primitives de combinaisons des pixels d'une                                                                      */
/*                  image raster ; elles sont exprimees                                                                              */
/*                  sous forme de fonctions ce qui fait                                                                              */
/*                  que la duree d'execution par rapport                                                                             */
/*                  aux "defines" est tres allongee...                                                                               */
/*                    Mais l'avantage, c'est qu'elle                                                                                 */
/*                  peuvent etre referencees comme argument                                                                          */
/*                  'Vf' des operations de 'store_point'                                                                             */
/*                  sous la forme :                                                                                                  */
/*                                                                                                                                   */
/*                                      Vf(ancien_niveau,nouveau_niveau);                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                  Ainsi, on pourra combiner la valeur                                                                              */
/*                  anterieure d'un point, avec la nouvelle                                                                          */
/*                  que l'on vient de calculer, pour les                                                                             */
/*                  fonctions 'Vf' autre que 'NEUTRE2'.                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        N O T A T I O N S  :                                                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    On notera 'imageA' les images Arguments,                                                                       */
/*                  et 'imageR' les images Resultats ; 'arg'                                                                         */
/*                  designera des arguments, et 'Vf' une                                                                             */
/*                  fonction "variable"...                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiipf/fonction.2$DEF' :                                                                                        */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E L A I   V E R S   L A   F O N C T I O N   D E   C O M B I N A I S O N   C O U R A N T E  :                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Les fonctions du type "VNEUTRE", qui                                                                           */
/*                  permettent de combiner les niveaux a                                                                             */
/*                  ecrire et ne niveau anterieur, peuvent                                                                           */
/*                  etre referencees indirectement, via                                                                              */
/*                  le relai que l'on definit ici.                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   FVARIABLE                                                                                                                     \
                    Fcombinaison_universelle_de_deux_niveaux                                                                            \
                                        /* Definition de la variable d'acces au pointeur des fonctions                               */ \
                                        /* variables de combinaison des points entre eux ; on passe par                              */ \
                                        /* define intermediaire, afin de permettre une definition du                                 */ \
                                        /* type :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  #define        FVARIABLE           FNEUTRE,                              */ \
                                        /*                                                                                           */ \
                                        /* nous ramenant ainsi a la version anterieure des fichiers.                                 */ \
                                        /*                                                                                           */ \
                                        /* Le 20170715081454, 'Fcombinaison_universelle_de_deux_niveaux' a remplace 'Fvariable'      */ \
                                        /* parce que 'v $xiipf/fonction.2$FON Fvariable' n'etait pas vraiment utilisable dans        */ \
                                        /* 'v $xiipf/fonction.2$DEF VALIDE_Fvariable'...                                             */
Denumer18(INIS(_code_ZERO,ZERO)
              ,_code_FNEUTRE1
              ,_code_FNEUTRE2
              ,_code_FNEUTRE
              ,_code_FADD
              ,_code_FBARY
              ,_code_FMOYENNE
              ,_code_FSUB
              ,_code_FMUL
              ,_code_FMULF
              ,_code_FDIV
              ,_code_FMAX
              ,_code_FMIN
              ,_code_FMINMAX
              ,_code_FOR
              ,_code_FAND
              ,_code_FEOR
              ,DERNIER_code_F
         ,code_FVARIABLE
          );
#define   code_ZERO                                                                                                                     \
                    ENUM(_code_ZERO)
#define   code_FNEUTRE1                                                                                                                 \
                    ENUM(_code_FNEUTRE1)
#define   code_FNEUTRE2                                                                                                                 \
                    ENUM(_code_FNEUTRE2)
#define   code_FNEUTRE                                                                                                                  \
                    ENUM(_code_FNEUTRE)
#define   code_FADD                                                                                                                     \
                    ENUM(_code_FADD)
#define   code_FBARY                                                                                                                    \
                    ENUM(_code_FBARY)
#define   code_FMOYENNE                                                                                                                 \
                    ENUM(_code_FMOYENNE)
#define   code_FSUB                                                                                                                     \
                    ENUM(_code_FSUB)
#define   code_FMUL                                                                                                                     \
                    ENUM(_code_FMUL)
#define   code_FMULF                                                                                                                    \
                    ENUM(_code_FMULF)
#define   code_FDIV                                                                                                                     \
                    ENUM(_code_FDIV)
#define   code_FMAX                                                                                                                     \
                    ENUM(_code_FMAX)
#define   code_FMIN                                                                                                                     \
                    ENUM(_code_FMIN)
#define   code_FMINMAX                                                                                                                  \
                    ENUM(_code_FMINMAX)
#define   code_FOR                                                                                                                      \
                    ENUM(_code_FOR)
#define   code_FAND                                                                                                                     \
                    ENUM(_code_FAND)
#define   code_FEOR                                                                                                                     \
                    ENUM(_code_FEOR)
#define   VALIDE_Fvariable(code_fonction,fonction)                                                                                      \
                    Ca1e(code_fonction)                                                                                                 \
                         Bblock                                                                                                         \
                         EGAL(Fvariable,aFONCTION(fonction));                                                                           \
                         Eblock                                                                                                         \
                    ECa1
#define   CHANGE_Fvariable(code_fonction)                                                                                               \
                    Bblock                                                                                                              \
                    Choi(code_fonction)                                                                                                 \
                         Bblock                                                                                                         \
                         VALIDE_Fvariable(code_FNEUTRE1,FNEUTRE1)                                                                       \
                         VALIDE_Fvariable(code_FNEUTRE2,FNEUTRE2)                                                                       \
                         VALIDE_Fvariable(code_FNEUTRE,FNEUTRE)                                                                         \
                         VALIDE_Fvariable(code_FADD,FADD)                                                                               \
                         VALIDE_Fvariable(code_FBARY,FBARY)                                                                             \
                         VALIDE_Fvariable(code_FMOYENNE,FMOYENNE)                                                                       \
                         VALIDE_Fvariable(code_FSUB,FSUB)                                                                               \
                         VALIDE_Fvariable(code_FMUL,FMUL)                                                                               \
                         VALIDE_Fvariable(code_FMULF,FMULF)                                                                             \
                         VALIDE_Fvariable(code_FDIV,FDIV)                                                                               \
                         VALIDE_Fvariable(code_FMAX,FMAX)                                                                               \
                         VALIDE_Fvariable(code_FMIN,FMIN)                                                                               \
                         VALIDE_Fvariable(code_FMINMAX,FMINMAX)                                                                         \
                         VALIDE_Fvariable(code_FOR,FOR)                                                                                 \
                         VALIDE_Fvariable(code_FAND,FAND)                                                                               \
                         VALIDE_Fvariable(code_FEOR,FEOR)                                                                               \
                         Defo                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("la fonction de combinaison des points n'existe pas");                                       \
                              Eblock                                                                                                    \
                         EDef                                                                                                           \
                         Eblock                                                                                                         \
                    ECho                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Cette macro permet de changer la fonction courante de combinaison des points,             */ \
                                        /* tout en validant la fonction demandee.                                                    */

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

#define   PARAMETRISATION_DE_LA_FONCTION_FBARY(lambda)                                                                                  \
                    Bblock                                                                                                              \
                    Test(IFINff(lambda                                                                                                  \
                               ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                                       \
                               ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                       \
                                )                                                                                                       \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(FBARY_____ponderation_de_la_fonction,lambda);                                                             \
                                        /* Lorsque l'argument est valide (dans [0,1]), il devient le nouveau parametre de controle   */ \
                                        /* de la fonction 'FBARY'.                                                                   */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("le parametre d'interpolation de la fonction 'FBARY' n'est pas dans [0,1]");                      \
                         CAL1(Prer1("il vaut %g\n",lambda));                                                                            \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Cette macro permet de changer le parametrage de la fonction 'FBARY', rappelant que son    */ \
                                        /* resultat est :                                                                            */ \
                                        /*                                                                                           */ \
                                        /*                  FBARY(arg1,arg2) = (1-lambda).arg1+lambda.arg2                           */ \
                                        /*                                                                                           */ \
                                        /* ou 'arg1' designe le niveau anterieur, et 'arg2' le nouveau niveau...                     */

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

#define   CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01                                                                             \
                    VRAI
#define   CONSERVER_LA_MATRICE_DE_FFload_point_coordonnees_01                                                                           \
                    NOTL(CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01)
                                        /* Definitions introduites le 20081030091912...                                              */

#define   FFload_point_coordonnees_01_matrice(valeur,imageA,Xf,Yf,perX,perY,symX,symY,proX,proY,nHors,ChangerMatrice,appliquer,matrice) \
                                        /* Le parametre 'ChangerMatrice' fut introduit le 20081030091912...                          */ \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(ChangerMatrice))                                                                                       \
                         Bblock                                                                                                         \
                                        /* Cas ou la matrice de 'FFload_point_coordonnees_01(...)' doit etre changee :               */ \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation                    \
                                            ,appliquer                                                                                  \
                                             );                                                                                         \
                                                                                                                                        \
                         begin_nouveau_block                                                                                            \
                              Bblock                                                                                                    \
                              DEFV(matrixF_3D,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation);       \
                                                                                                                                        \
                              TRANSFERT_MATRICE_3D(EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation    \
                                                  ,FFload_point_coordonnees_01_____matrice_de_transformation                            \
                                                   );                                                                                   \
                                        /* Sauvegarde de la transformation courante...                                               */ \
                              TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation                            \
                                                  ,matrice                                                                              \
                                                   );                                                                                   \
                                        /* Changement de la transformation courante...                                               */ \
                                                                                                                                        \
                              EGAL(valeur                                                                                               \
                                  ,FFload_point_coordonnees_01(imageA                                                                   \
                                                              ,Xf,Yf                                                                    \
                                                              ,perX,perY                                                                \
                                                              ,symX,symY                                                                \
                                                              ,proX,proY                                                                \
                                                              ,nHors                                                                    \
                                                               )                                                                        \
                                   );                                                                                                   \
                                        /* Recuperation de la valeur via la transformation courante {appliquer,matrice}.             */ \
                                                                                                                                        \
                              TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation                            \
                                                  ,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation    \
                                                   );                                                                                   \
                              Eblock                                                                                                    \
                         end_nouveau_block                                                                                              \
                                                                                                                                        \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation                    \
                                             );                                                                                         \
                                        /* Restauration de la transformation courante...                                             */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Cas ou la matrice de 'FFload_point_coordonnees_01(...)' doit etre conservee :             */ \
                         EGAL(valeur                                                                                                    \
                             ,FFload_point_coordonnees_01(imageA                                                                        \
                                                         ,Xf,Yf                                                                         \
                                                         ,perX,perY                                                                     \
                                                         ,symX,symY                                                                     \
                                                         ,proX,proY                                                                     \
                                                         ,nHors                                                                         \
                                                          )                                                                             \
                              );                                                                                                        \
                                        /* Recuperation de la valeur via la transformation anterieure...                             */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20081029112229 pour faciliter le changement de la matrice         */ \
                                        /* 'FFload_point_coordonnees_01_____matrice_de_transformation' et appeler ensuite la         */ \
                                        /* fonction 'FFload_point_coordonnees_01(...)'.                                              */

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

#define   CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes                                                                  \
                    VRAI
#define   CONSERVER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes                                                                \
                    NOTL(CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes)
                                        /* Definitions introduites le 20081030091912...                                              */

#define   FFload_point_coordonnees_01_indirectes_matrice(valeur,iA,Xf,Yf,iAX,iAY,perX,perY,symX,symY,proX,proY,nHors,ChMa,appl,matrice) \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(ChMa))                                                                                                 \
                         Bblock                                                                                                         \
                                        /* Cas ou la matrice de 'FFload_point_coordonnees_01_indirectes(...)' doit etre changee :    */ \
                         BSaveModifyVariable(Logical                                                                                    \
                                            ,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_        \
                                            ,appl                                                                                       \
                                             );                                                                                         \
                                                                                                                                        \
                         begin_nouveau_block                                                                                            \
                              Bblock                                                                                                    \
                              DEFV(matrixF_3D                                                                                           \
                                  ,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_        \
                                   );                                                                                                   \
                                                                                                                                        \
                              TRANSFERT_MATRICE_3D                                                                                      \
                                  (EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_        \
                                  ,FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_                                \
                                   );                                                                                                   \
                                        /* Sauvegarde de la transformation courante...                                               */ \
                              TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_                \
                                                  ,matrice                                                                              \
                                                   );                                                                                   \
                                        /* Changement de la transformation courante...                                               */ \
                                                                                                                                        \
                              EGAL(valeur                                                                                               \
                                  ,FFload_point_coordonnees_01_indirectes(iA                                                            \
                                                                         ,Xf,Yf                                                         \
                                                                         ,iAX,iAY                                                       \
                                                                         ,perX,perY                                                     \
                                                                         ,symX,symY                                                     \
                                                                         ,proX,proY                                                     \
                                                                         ,nHors                                                         \
                                                                          )                                                             \
                                   );                                                                                                   \
                                        /* Recuperation de la valeur via la transformation courante {appl,matrice}.                  */ \
                                                                                                                                        \
                              TRANSFERT_MATRICE_3D                                                                                      \
                                  (FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_                                \
                                  ,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_        \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         end_nouveau_block                                                                                              \
                                                                                                                                        \
                         ESaveModifyVariable(Logical                                                                                    \
                                            ,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_        \
                                             );                                                                                         \
                                        /* Restauration de la transformation courante...                                             */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Cas ou la matrice de 'FFload_point_coordonnees_01_indirectes(...)' doit etre conservee :  */ \
                         EGAL(valeur                                                                                                    \
                             ,FFload_point_coordonnees_01_indirectes(iA                                                                 \
                                                                    ,Xf,Yf                                                              \
                                                                    ,iAX,iAY                                                            \
                                                                    ,perX,perY                                                          \
                                                                    ,symX,symY                                                          \
                                                                    ,proX,proY                                                          \
                                                                    ,nHors                                                              \
                                                                     )                                                                  \
                              );                                                                                                        \
                                        /* Recuperation de la valeur via la transformation anterieure...                             */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20090507102158 pour faciliter le changement de la matrice         */ \
                                        /* 'FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_' et appeler        */ \
                                        /* ensuite la fonction 'FFload_point_coordonnees_01_indirectes(...)'.                        */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.