/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   A   U N E   I M A G E  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les definitions                                                                     */
/*                  de base de gestion et de manipulation d'une                                                                      */
/*                  image raster, quelle que soit la definition.                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/mono_image$DEF' :                                                                                         */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19890000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L I D A T I O N   D E S   I M A G E S   S T A T I Q U E S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_01
#    define    INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_IMAGES_STATIQUES(image_a_initialiser,sequence_d_initialisation,edit_nivo)   \
                         Bblock                                                                                                         \
                         BLOC(sequence_d_initialisation);                                                                               \
                         Eblock                                                                                                         \
                                        /* Procedure verifiant les images lors de leur initialisation et les initialisant...         */
#Aifdef   GESTION_DES_IMAGES_STATIQUES_VERSION_01
#Eifdef   GESTION_DES_IMAGES_STATIQUES_VERSION_01

#ifdef    GESTION_DES_IMAGES_STATIQUES_VERSION_02
#    define    INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_IMAGES_STATIQUES(image_a_initialiser,sequence_d_initialisation,edit_nivo)   \
                                        /* Cette definition a ete transportee de 'v $xiii/mono_image$FON' a ici le 20090317090736    */ \
                                        /* afin de pouvoir etre utilisee dans 'v $xiii/files$FON'...                                 */ \
                         Bblock                                                                                                         \
                         Test(IFNE(image_a_initialiser,STATIQUE_UNDEF))                                                                 \
                              Bblock                                                                                                    \
                              BLOC(sequence_d_initialisation);                                                                          \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("une image a initialiser est 'Statique' et n'a pas de memoire allouee");                     \
                              PRINT_ERREUR("verifier alors que 'GET_ARGUMENTSv(...)' est utilisee dans cette commande");                \
                                        /* Ce phenomene peut se produire lorsque 'GET_ARGUMENTSv(...)' n'a pas ete utilisee alors    */ \
                                        /* qu'elle est necessaire (ce fut le cas le 19990603133319 avec 'v $xci/contours.12$K').     */ \
                                        /* Un cas plus rare consisterait a avoir oublie la declaration d'une image statique dans     */ \
                                        /* 'v $xig/fonct$vv$DEF ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSv'.            */ \
                              BLOC(edit_nivo);                                                                                          \
                                        /* On notera que l'on ne peut pas editer le niveau d'initialisation car on ne connait pas    */ \
                                        /* son type simplement...                                                                    */ \
                                                                                                                                        \
                              PRINT_ERREUR("les memoires physiques et virtuelles sont certainement insuffisantes");                     \
                              PRINT_ERREUR("il est preferable d'aborter ce programme");                                                 \
                                                                                                                                        \
                              Abort(ERREUR23);                                                                                          \
                                        /* Le 19991129083831, j'ai ajoute cette sortie "brutale" car, en effet, si ce message        */ \
                                        /* apparait c'est que l'on a, par exemple, fait un :                                         */ \
                                        /*                                                                                           */ \
                                        /*                  XYmax     20000 20000                                                    */ \
                                        /*                                                                                           */ \
                                        /* et que la memoire (physique et virtuelle) ne suffit pas. Ce message apparait donc apres   */ \
                                        /* une allocation memoire qui a echouee...                                                   */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Procedure verifiant les images lors de leur initialisation et les initialisant...         */
#Aifdef   GESTION_DES_IMAGES_STATIQUES_VERSION_02
#Eifdef   GESTION_DES_IMAGES_STATIQUES_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D ' U N E   I M A G E   Q U E L C O N Q U E  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIIinitialisation(les_images_sont_standards,imageR,FimageR,valeur,Fvaleur)                                                    \
                                        /* L'argument 'Fvaleur' en complement de 'valeur' a ete introduit le 20111020090634...       */ \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iinitialisation(imageR,valeur)                                                                                \
                         ,IFinitialisation(FimageR,Fvaleur)                                                                             \
                          )                                                                                                             \
                                        /* Initialisation d'une image quelconque ("standard" ou "flottante").                        */ \
                                        /*                                                                                           */ \
                                        /* Jusqu'au 20111027090451, il y a eu par erreur 'IIinitialisation(...)' ci-dessus a la      */ \
                                        /* place de 'Iinitialisation(...)'. Cela s'est vu lors de l'introduction de '$LACT19'...     */
#define   gInettoyage(les_images_sont_standards,imageR,FimageR)                                                                         \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iinitialisation(imageR,Iinitialisation_____valeur_pour_gInettoyage)                                           \
                         ,IFinitialisation(FimageR,IFinitialisation_____valeur_pour_gInettoyage)                                        \
                          )                                                                                                             \
                                        /* Nettoyage d'une image quelconque ("standard" ou "flottante").                             */ \
                                        /*                                                                                           */ \
                                        /* Le 20090527110837, la fonction 'Inoir(...)' a ete remplacee par 'Iinitialisation(...)' et */ \
                                        /* les '..._____valeur_pour_gInettoyage' ont ete introduites pour 'v $xci/scroll$K pour_gI'. */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D ' U N E   I M A G E   P A R   U N E   F O N C T I O N  :                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Le 20100209085255 la quatrieme coordonnee                                                                      */
/*                  't' a ete introduite afin que ces procedures                                                                     */
/*                  soient compatibles avec les quaternions. Malgre                                                                  */
/*                  ce passage a la quatrieme dimension, le nom '3D'                                                                 */
/*                  a ete conserve (et non pas remplace par '4D')                                                                    */
/*                  afin de n'avoir pas a recompiler tout ce qui                                                                     */
/*                  refere ces procedures et donnees (en particulier                                                                 */
/*                  les 'Common's...).                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ACCES_A_UN_CHAMP_3D_____OEX                                                                                                   \
                    MAX2(ABSO(ACCES_A_UN_CHAMP_3D_____OX),ABSO(ACCES_A_UN_CHAMP_3D_____EX))                                             \
                                        /* Pour simplifier ce qui suit...                                                            */
#define   ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale)                                                        \
                    OPC5(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20100210)                               \
                        ,HOMO                                                                                                           \
                        ,SE15                                                                                                           \
                        ,COND(IL_FAUT(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre)                              \
                             ,MUL2(ASID1(scale,cx)                                                                                      \
                                  ,CARRE_OX_PAR_RAPPORT_A_OY(_____cNORMALISE_OX(SOUS(x                                                  \
                                                                                    ,_lDENORMALISE_OX(ASID1(trans_champ,dx))            \
                                                                                     )                                                  \
                                                                                )                                                       \
                                                             )                                                                          \
                                   )                                                                                                    \
                             ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128)                     \
                                  ,MUL2(ASID1(scale,cx)                                                                                 \
                                       ,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees)                \
                                            ,SUPER_cNORMALISE_OX(SOUS(x,SUPER_lDENORMALISE_OX(ASID1(trans_champ,dx))))                  \
                                            ,SOUS(FLOT(x),ASID1(trans_champ,dx))                                                        \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,AXPB(ASID1(scale,cx)                                                                                 \
                                       ,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees)                \
                                            ,SUPER_cNORMALISE_OX(x)                                                                     \
                                            ,FLOT(x)                                                                                    \
                                             )                                                                                          \
                                       ,NEGA(ASID1(trans_champ,dx))                                                                     \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128)                          \
                             ,MUL2(ASID1(scale,cx),SOUS(COORDONNEE_BARYCENTRIQUE_MINIMALE,ASID1(trans_champ,dx)))                       \
                             ,AXPB(ASID1(scale,cx),COORDONNEE_BARYCENTRIQUE_MINIMALE,NEGA(ASID1(trans_champ,dx)))                       \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128)                          \
                             ,MUL2(ASID1(scale,cx),SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,ASID1(trans_champ,dx)))                       \
                             ,AXPB(ASID1(scale,cx),COORDONNEE_BARYCENTRIQUE_MAXIMALE,NEGA(ASID1(trans_champ,dx)))                       \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_X)                                                         \
                             ,ACCES_A_UN_CHAMP_3D_____OX                                                                                \
                             ,NEGA(ACCES_A_UN_CHAMP_3D_____OEX)                                                                         \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_X)                                                         \
                             ,ACCES_A_UN_CHAMP_3D_____EX                                                                                \
                             ,NEUT(ACCES_A_UN_CHAMP_3D_____OEX)                                                                         \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Acces a la coordonnee 'X' pour 'ACCES_A_UN_CHAMP_3D(...)'. La possibilite de ne pas       */ \
                                        /* utiliser 'CARRE_OX_PAR_RAPPORT_A_OY(...)' a ete introduite le 20041107133617 afin de      */ \
                                        /* pouvoir garantir, par exemple, de generer une periode d'un sinus le long de 'dimX' et     */ \
                                        /* de 'dimY' dans 'v $xci/sinus$K GENERATION_DU_CHAMP_DEMANDE'. On notera que suivant        */ \
                                        /* que l'on met les coordonnees dans un carre ou pas, la translation 'trans_champ' n'est     */ \
                                        /* pas utilisee de la meme facon (bien que ces deux facons soient equivalentes a epsilon     */ \
                                        /* pres...) ; cela est volontaire (pour alleger la formulation...).                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20060117150450, '_____cNORMALISE_OX(...)' est devenu 'SUPER_cDENORMALISE_OX(...)'      */ \
                                        /* pour etendre les possibilites...                                                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20060607181630, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees'    */ \
                                        /* fut introduit...                                                                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20061128141549, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128'     */ \
                                        /* fut introduit ; simultanement, pour 'ASID1(trans_champ,dx)' un 'NEGA(...)' qui, par       */ \
                                        /* erreur, manquait fut ajoute...                                                            */ \
                                        /*                                                                                           */ \
                                        /* Le 20061128160857 je note que la difference entre le mode normal et le mode "compatible"  */ \
                                        /* ne se manifeste que si l'echelle ('v $xiii/mono_image$FON coeffF_2D.POINTERs.echelle.')   */ \
                                        /* relative a 'X' ('ASID1(scale,cx)') differe de 1...                                        */ \
                                        /*                                                                                           */ \
                                        /* Le 20100210091932 la fenetre de renormalisation des coordonnees {{OX,OY},{EX,EY}} fut     */ \
                                        /* introduite...                                                                             */ \
                                        /*                                                                                           */ \
                                        /* Pour connaitre les effets de 'CARRE_OX_PAR_RAPPORT_A_OY(...)' voir les experiences        */ \
                                        /* 'v $xiii/mono_image$FON 20100210110346'...                                                */ \
                                        /*                                                                                           */ \
                                        /* Le 20100917095419 je note la difficulte (voire l'impossibilite...) d'utiliser             */ \
                                        /* 'trans_champ' s'il differe de la valeur par defaut {1/2,1/2} et ce a cause de la          */ \
                                        /* renormalisation {ACCES_A_UN_CHAMP_3D_____OX,ACCES_A_UN_CHAMP_3D_____EX}. Des valeurs      */ \
                                        /* anormales sont alors produites par la formule ci-dessus. Au passage, quelle est           */ \
                                        /* l'utilite de translater le champ et donc les coordonnees, si celles-ci sont ensuite       */ \
                                        /* renormalisees ?                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20170602125906 fut introduite la possibilite de centre {OX,EX}...                      */
#define   ACCES_A_UN_CHAMP_3D_____OEY                                                                                                   \
                    MAX2(ABSO(ACCES_A_UN_CHAMP_3D_____OY),ABSO(ACCES_A_UN_CHAMP_3D_____EY))                                             \
                                        /* Pour simplifier ce qui suit...                                                            */
#define   ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale)                                                        \
                    OPC5(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20100210)                               \
                        ,HOMO                                                                                                           \
                        ,SE15                                                                                                           \
                        ,COND(IL_FAUT(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre)                              \
                             ,MUL2(ASID1(scale,cy)                                                                                      \
                                  ,CARRE_OY_PAR_RAPPORT_A_OY(_____cNORMALISE_OY(SOUS(y                                                  \
                                                                                    ,_lDENORMALISE_OY(ASID1(trans_champ,dy))            \
                                                                                     )                                                  \
                                                                                )                                                       \
                                                             )                                                                          \
                                   )                                                                                                    \
                             ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128)                     \
                                  ,MUL2(ASID1(scale,cy)                                                                                 \
                                       ,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees)                \
                                            ,SUPER_cNORMALISE_OY(SOUS(y,SUPER_lDENORMALISE_OY(ASID1(trans_champ,dy))))                  \
                                            ,SOUS(FLOT(y),ASID1(trans_champ,dy))                                                        \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,AXPB(ASID1(scale,cy)                                                                                 \
                                       ,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees)                \
                                            ,SUPER_cNORMALISE_OY(y)                                                                     \
                                            ,FLOT(y)                                                                                    \
                                             )                                                                                          \
                                       ,NEGA(ASID1(trans_champ,dy))                                                                     \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128)                          \
                             ,MUL2(ASID1(scale,cy),SOUS(COORDONNEE_BARYCENTRIQUE_MINIMALE,ASID1(trans_champ,dy)))                       \
                             ,AXPB(ASID1(scale,cy),COORDONNEE_BARYCENTRIQUE_MINIMALE,NEGA(ASID1(trans_champ,dy)))                       \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128)                          \
                             ,MUL2(ASID1(scale,cy),SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,ASID1(trans_champ,dy)))                       \
                             ,AXPB(ASID1(scale,cy),COORDONNEE_BARYCENTRIQUE_MAXIMALE,NEGA(ASID1(trans_champ,dy)))                       \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_Y)                                                         \
                             ,ACCES_A_UN_CHAMP_3D_____OY                                                                                \
                             ,NEGA(ACCES_A_UN_CHAMP_3D_____OEY)                                                                         \
                              )                                                                                                         \
                        ,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_Y)                                                         \
                             ,ACCES_A_UN_CHAMP_3D_____EY                                                                                \
                             ,NEUT(ACCES_A_UN_CHAMP_3D_____OEY)                                                                         \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Acces a la coordonnee 'Y' pour 'ACCES_A_UN_CHAMP_3D(...)'. La possibilite de ne pas       */ \
                                        /* utiliser 'CARRE_OY_PAR_RAPPORT_A_OY(...)' a ete introduite le 20041107133617 afin de      */ \
                                        /* pouvoir garantir, par exemple, de generer une periode d'un sinus le long de 'dimY' et     */ \
                                        /* de 'dimY' dans 'v $xci/sinus$K GENERATION_DU_CHAMP_DEMANDE'. On notera que suivant        */ \
                                        /* que l'on met les coordonnees dans un carre ou pas, la translation 'trans_champ' n'est     */ \
                                        /* pas utilisee de la meme facon (bien que ces deux facons soient equivalentes a epsilon     */ \
                                        /* pres...) ; cela est volontaire (pour alleger la formulation et d'autre part, meme si      */ \
                                        /* 'CARRE_OY_PAR_RAPPORT_A_OY(...)' est neutre, cela donne des resultats legerements         */ \
                                        /* differents numeriquement...).                                                             */ \
                                        /*                                                                                           */ \
                                        /* Le 20060117150450, '_____cNORMALISE_OY(...)' est devenu 'SUPER_cDENORMALISE_OY(...)'      */ \
                                        /* pour etendre les possibilites...                                                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20060607181630, 'ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees'    */ \
                                        /* fut introduit...                                                                          */ \
                                        /*                                                                                           */ \
                                        /* Le 20061128141549, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128'     */ \
                                        /* fut introduit ; simultanement, pour 'ASID1(trans_champ,dy)' un 'NEGA(...)' qui, par       */ \
                                        /* erreur, manquait fut ajoute...                                                            */ \
                                        /*                                                                                           */ \
                                        /* Le 20061128160857 je note que la difference entre le mode normal et le mode "compatible"  */ \
                                        /* ne se manifeste que si l'echelle ('v $xiii/mono_image$FON coeffF_2D.POINTERs.echelle.')   */ \
                                        /* relative a 'Y' ('ASID1(scale,cy)') differe de 1...                                        */ \
                                        /*                                                                                           */ \
                                        /* Le 20100210091932 la fenetre de renormalisation des coordonnees {{OX,OY},{EX,EY}} fut     */ \
                                        /* introduite...                                                                             */ \
                                        /*                                                                                           */ \
                                        /* Pour connaitre les effets de 'CARRE_OY_PAR_RAPPORT_A_OY(...)' voir les experiences        */ \
                                        /* 'v $xiii/mono_image$FON 20100210110346'...                                                */ \
                                        /*                                                                                           */ \
                                        /* Le 20100917095419 je note la difficulte (voire l'impossibilite...) d'utiliser             */ \
                                        /* 'trans_champ' s'il differe de la valeur par defaut {1/2,1/2} et ce a cause de la          */ \
                                        /* renormalisation {ACCES_A_UN_CHAMP_3D_____OY,ACCES_A_UN_CHAMP_3D_____EY}. Des valeurs      */ \
                                        /* anormales sont alors produites par la formule ci-dessus. Au passage, quelle est           */ \
                                        /* l'utilite de translater le champ et donc les coordonnees, si celles-ci sont ensuite       */ \
                                        /* renormalisees ?                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20170602125906 fut introduite la possibilite de centre {OY,EY}...                      */

#define   ACCES_A_UN_CHAMP_3D(amplificateur_de_la_fonction,Acces,Fonction,translateur_de_la_fonction,x,y,z,t,ASID1,trans_champ,scale)   \
                    AXPB(amplificateur_de_la_fonction                                                                                   \
                        ,Acces(Fonction)(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale)                         \
                                        ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale)                         \
                                        ,z                                                                                              \
                                        ,t                                                                                              \
                                         )                                                                                              \
                        ,translateur_de_la_fonction                                                                                     \
                         )                                                                                                              \
                                        /* Macro d'acces a un point donne {x,y,z} d'un champ suivant une translation definie par     */ \
                                        /* 'trans_champ' accedee par 'ASID1' ('ASI1' ou 'ASD1'). La fonction definissant             */ \
                                        /* le champ est definie par 'Fonction' et accedee par 'Acces' ('RIEN' ou 'fPOINTEUR'). On    */ \
                                        /* notera le 'SCAL(...,dimY,dimX)' destine a faire que les axes soient orthonormes, meme si  */ \
                                        /* l'image generee n'est pas carree (voir par exemple 'Pal'). ATTENTION, pendant longtemps   */ \
                                        /* la denormalisation des coordonnees a ete entouree par un 'DPRE(...)' que j'ai supprime    */ \
                                        /* car je n'en voyais pas la justification...                                                */

#define   EXTERIEUR_D_UN_CHAMP_3D                                                                                                       \
                    FZERO                                                                                                               \
                                        /* Valeur a donner aux points exterieurs a un champ defini par 'ACCES_A_UN_CHAMP_3D(...)'.   */

#define   Zf_ARGUMENT_INUTILE                                                                                                           \
                    FZERO
#define   Tf_ARGUMENT_INUTILE                                                                                                           \
                    FZERO
                                        /* Valeur a donner a la coordonnee 'z' lorsqu'elle est inutile. Il est plus astucieux        */
                                        /* d'utiliser 'FZERO' que 'FLOT__ARGUMENT_INUTILE' au cas ou 'z' serait quand meme utilisee, */
                                        /* 'FZERO' etant plus "neutre" que 'FLOT__ARGUMENT_INUTILE'. La coordonnee 't' a ete         */
                                        /* introduite le 20100209085255...                                                           */

#define   ACCES_A_UN_CHAMP(amplificateur_de_la_fonction,Acces,Fonction,translateur_de_la_fonction,x,y,ASID1,trans_champ,scale)          \
                    ACCES_A_UN_CHAMP_3D(amplificateur_de_la_fonction                                                                    \
                                       ,Acces                                                                                           \
                                       ,Fonction                                                                                        \
                                       ,translateur_de_la_fonction                                                                      \
                                       ,x,y,Zf_ARGUMENT_INUTILE,Tf_ARGUMENT_INUTILE                                                     \
                                       ,ASID1                                                                                           \
                                       ,trans_champ                                                                                     \
                                       ,scale                                                                                           \
                                        )                                                                                               \
                                        /* Macro standard d'acces a un point donne {x,y} d'un champ. Ce niveau supplementaire a ete  */ \
                                        /* introduit le 19961030073736 afin de ne pas avoir a modifier de nombreux fichiers lors de  */ \
                                        /* l'introduction de l'argument 'Zf' dans les fonctions du type 'Igenere_champ(...)' dans    */ \
                                        /* 'v $xiii/mono_image$FON Igenere_champ'.                                                   */

#define   ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale)                                             \
                    Xf_transformee
#define   ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale)                                             \
                    Yf_transformee
#define   ACCES_A_LA_COORDONNEE_Z_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale)                                             \
                    Zf_transformee
#define   ACCES_A_LA_COORDONNEE_T_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale)                                             \
                    Tf_transformee
                                        /* Acces aux coordonnees {x,y,z} transformees geometriquement (introduit le 20060516094343). */
#define   ACCES_A_UN_CHAMP_3D_TRANSFORME(amplificateur_fonction,Acces,Fonction,translateur_fonction,x,y,z,ASID1,trans_champ,scale)      \
                    Ftraitement_des_points_d_un_champ(amplificateur_fonction                                                            \
                                                     ,Acces(Fonction)(Xf_transformee                                                    \
                                                                     ,Yf_transformee                                                    \
                                                                     ,Zf_transformee                                                    \
                                                                     ,Tf_transformee                                                    \
                                                                      )                                                                 \
                                                     ,translateur_fonction                                                              \
                                                      )                                                                                 \
                                        /* Macro d'acces a un point donne {x,y,z} d'un champ, apres transformation geometrique des   */ \
                                        /* coordonnees {x,y,z}. Ceci fut introduit le 20060516094343...                              */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : on notera que le triplet argument {x,y,z} ne sert a rien et n'est la que par  */ \
                                        /* symetrie avec la procedure 'ACCES_A_UN_CHAMP_3D(...). En fait, au triplet {x,y,z} est     */ \
                                        /* substitue le triplet {Xf_transformee,Yf_transformee,Zf_transformee} qui seul est utile.   */ \
                                        /*                                                                                           */ \
                                        /* Le 20150408094048, 'Ftraitement_des_points_d_un_champ(...)' a remplace 'AXPB(...)'.       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D ' U N E   I M A G E   Q U E L C O N Q U E   P A R   U N E   F O N C T I O N  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIgenere_champ(les_images_sont_standards,imageR,FimageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf)      \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Igenere_champ(imageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf)                         \
                         ,IFgenere_champ(FimageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf)                       \
                          )                                                                                                             \
                                        /* Initialisation d'une image quelconque ("standard" ou "flottante") par une fonction.       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   D E   L A   F A C O N   D E   C A L C U L E R   L E   T R E F L E  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_01                                                                                  \
                                        /* Cette facon de calculer le trefle utilise une fonction periodique dans le plan, ce qui    */ \
                                        /* provoque une alternance de maxima et de minima quand on s'eloigne vers l'infini ; elle    */ \
                                        /* est de la forme :                                                                         */ \
                                        /*                                                                                           */ \
                                        /* posons :                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                                           rho                                             */ \
                                        /*                  R(X,Y) = Cr.---------------------------- + Pr                            */ \
                                        /*                               Cc.cos(Ct.theta + Pt) + Tc                                  */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                                      W ^                                                  */ \
                                        /*            *                           |         *                                        */ \
                                        /*         *     *                        |      *     *      seule la partie correspondant  */ \
                                        /*       *         *                      |    *         *    a U>0 est utilisee.            */ \
                                        /*      *           *                     |   *           *                                  */ \
                                        /*    *               *                   | *               *                                */ \
                                        /*   ------------------*------------------*-------------------*-------------------*->        */ \
                                        /*                       *               *|                     *               *   U        */ \
                                        /*                          *           * |                       *           *              */ \
                                        /*   W = Cs.sin(U) + Ts      *         *  |                        *         *               */ \
                                        /*                             *     *    |                          *     *                 */ \
                                        /*                                *       |                             *                    */ \
                                        /*                                                                                           */ \
                                        /* on a alors :                                                                              */ \
                                        /*                                                                                           */ \
                                        /*                  F(X,Y) = Cs.sin[R(X,Y)] + Ts                                             */ \
                                        /*                                                                                           */ \
                                        /* la periodicite etant introduite par la fonction 'sin'.                                    */

#define   FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_02                                                                                  \
                                        /* Cette facon de calculer le trefle utilise une fonction non periodique dans le plan,       */ \
                                        /* ce qui fait que l'on ne rencontre qu'un maximum, pour tendre vers zero a l'infini ; elle  */ \
                                        /* est de la forme :                                                                         */ \
                                        /*                                                                                           */ \
                                        /* posons :                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                                           rho                                             */ \
                                        /*                  R(X,Y) = Cr.---------------------------- + Pr                            */ \
                                        /*                               Cc.cos(Ct.theta + Pt) + Tc                                  */ \
                                        /*                                                                                           */ \
                                        /*               2.r                                                                         */ \
                                        /*              U                       W ^                                                  */ \
                                        /*   W = Cs.----------- + Co    *         |         *                                        */ \
                                        /*            4.r            *     *      |      *     *      seule la partie correspondant  */ \
                                        /*           U    + Ts     *         *    |    *         *    a U>0 est utilisee.            */ \
                                        /*                      *             *   |   *              *                               */ \
                                        /*      *     *     *                  *  |  *                    *      *     *             */ \
                                        /*   ------------------------------------***---------------------------------------->        */ \
                                        /*                                        |                                         U        */ \
                                        /*                                        |                                                  */ \
                                        /*                                                                                           */ \
                                        /* on a alors :                                                                              */ \
                                        /*                                                                                           */ \
                                        /*                                       2.r                                                 */ \
                                        /*                                 R(X,Y)                                                    */ \
                                        /*                  F(X,Y) = Cs.--------------- + Co                                         */ \
                                        /*                                     4.r                                                   */ \
                                        /*                               R(X,Y)    + Ts                                              */ \
                                        /*                                                                                           */ \
                                        /* la non periodicite etant introduite par une fonction "polynomiale" ; de plus, plus        */ \
                                        /* le demi-exposant 'r' est grand, plus la "double-bosse" de la courbe ci-dessus est         */ \
                                        /* etroite...                                                                                */

#nodefine FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_03                                                                                  \
                                        /* Cette facon de calculer le trefle utilise une fonction non periodique dans le plan,       */ \
                                        /* ce qui fait que l'on ne rencontre qu'un maximum, pour tendre vers zero a l'infini ; elle  */ \
                                        /* est de la forme :                                                                         */ \
                                        /*                                                                                           */ \
                                        /* posons :                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                                           rho                                             */ \
                                        /*                  R(X,Y) = Cr.---------------------------- + Pr                            */ \
                                        /*                               Cc.cos(Ct.theta + Pt) + Tc                                  */ \
                                        /*                                                                                           */ \
                                        /*                 r                                                                         */ \
                                        /*              - ----.u                                                                     */ \
                                        /*           r     Ts                   W ^                                                  */ \
                                        /*   W = Cs.u .e         + Co             |         *                                        */ \
                                        /*                                        |      *  .  *         seule la partie relative    */ \
                                        /*   (avec r>1 et Ts>0)                   |    *    .    *       a U>0 est utilisee.         */ \
                                        /*                                        |   *     .       *                                */ \
                                        /*                                        |  *      .           *     *      *               */ \
                                        /*   -------------------------------------**---------------------------------------->        */ \
                                        /*                                        |         Ts                              U        */ \
                                        /*                                        |                                                  */ \
                                        /*                                                                                           */ \
                                        /* on a alors :                                                                              */ \
                                        /*                                                                                           */ \
                                        /*                                          r                                                */ \
                                        /*                                       - ----.R(X,Y)                                       */ \
                                        /*                                    r     Ts                                               */ \
                                        /*                  F(X,Y) = Cs.R(X,Y) .e              + Co                                  */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* la non periodicite etant introduite par les exponentielles ; de plus, plus                */ \
                                        /* le exposant 'r' est grand, plus la "bosse" de la courbe ci-dessus est etroite,            */ \
                                        /* les points d'inflexion etant en :                                                         */ \
                                        /*                                                                                           */ \
                                        /*                             1                                                             */ \
                                        /*                  h.(1 +/- -----)                                                          */ \
                                        /*                             ___                                                           */ \
                                        /*                           \/ r                                                            */ \
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   D E   L A   F A C O N   D E   C A L C U L E R   L E   " C H A P E A U   M E X I C A I N "  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_CHAPEAU_MEXICAIN_VERSION_01                                                                        \
                                        /* Cette facon de calculer le "chapeau mexicain" utilise la fonction suivante :              */ \
                                        /*                                                                                           */ \
                                        /*                                  4       2                                                */ \
                                        /*                  F(X,Y) = c.[c4.R  + c2.R  + t]                                           */ \
                                        /*                                                                                           */
#define   FACON_DE_CALCULER_LE_CHAMP_CHAPEAU_MEXICAIN_VERSION_02                                                                        \
                                        /* Cette facon de calculer le "chapeau mexicain" utilise la fonction suivante :              */ \
                                        /*                                                                                           */ \
                                        /*                               a  b.R                                                      */ \
                                        /*                  F(X,Y) = c.[R .e    + t]                                                 */ \
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   D E   L A   F A C O N   D E   C A L C U L E R   L E   C H A M P   E L L I P S O I D A L  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_ELLIPSOIDAL_VERSION_01                                                                             \
                                        /* Cette facon de calculer le champ ellipsoidal utilise la fonction suivante :               */ \
                                        /*                                                                                           */ \
                                        /*                                  2        2        2                                      */ \
                                        /*                             | X |    | Y |    | Z |                                       */ \
                                        /*                  F(X,Y,Z) = |---|  + |---|  + |---|  - 1                                  */ \
                                        /*                             | A |    | B |    | C |                                       */ \
                                        /*                                                                                           */ \
                                        /* (ceci fut introduit le 20061128085009).                                                   */
#define   FACON_DE_CALCULER_LE_CHAMP_ELLIPSOIDAL_VERSION_02                                                                             \
                                        /* Cette facon de calculer le champ ellipsoidal utilise la fonction suivante :               */ \
                                        /*                                                                                           */ \
                                        /*                               2       2       2                                           */ \
                                        /*                              X       Y       Z                                            */ \
                                        /*                  F(X,Y,Z) = ----  + ----  + ----  - D                                     */ \
                                        /*                              A       B       C                                            */ \
                                        /*                                                                                           */ \
                                        /* (ceci fut introduit le 20061128085009). Cela permet aussi bien ellipsoides                */ \
                                        /* (A>0, B>0, C>0 et D>0) que des hyperboloides (A>0, B<0, C>0 et D>0 ou D<0).               */

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

#if       (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                                  \
           )
#Aif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                                  \
           )
#Eif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                                  \
           )

#if       (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )

#    ifdef     SYSTEME_DPX5000_SPIX_CC

#         ifdef     LACT11
#              TestADef  BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01                                                             \
                                        /* Sur 'SYSTEME_DPX5000_SPIX_CC', le compilateur 'cc' a besoin d'une zone de swap enorme     */ \
                                        /* pour compiler les 'Iterated Function Set' ; etant superieure a celle qui est disponible,  */ \
                                        /* depuis qu'il y a 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', on ne peut plus compiler.     */ \
                                        /* Ceci est valable sur la machine 'LACT11'...                                               */
#         Aifdef    LACT11
#         Eifdef    LACT11

#    Aifdef    SYSTEME_DPX5000_SPIX_CC
#    Eifdef    SYSTEME_DPX5000_SPIX_CC

#Aif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )
#Eif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )

#if       (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )

#    ifdef     SYSTEME_NWS3000_NEWSOS_CC
#         TestADef  BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01                                                                   \
                                        /* Sur 'SYSTEME_NWS3000_NEWSOS_CC', le compilateur 'cc' lorsqu'il compile les fonctions      */ \
                                        /* relatives a l'initialisation d'une image par une iteration produit un binaire errone,     */ \
                                        /* qui donne a l'edition de liens le message d'erreur suivant :                              */ \
                                        /*                                                                                           */ \
                                        /*   ld:                                                                                     */ \
                                        /*   Object file format error in:... relocation entry for non-relocatable symbol in .text    */ \
                                        /*   section for entry...                                                                    */ \
                                        /*                                                                                           */ \
                                        /* la seule solution que j'ai trouve est donc d'inhiber la compilation de ces modules...     */
#    Aifdef    SYSTEME_NWS3000_NEWSOS_CC
#    Eifdef    SYSTEME_NWS3000_NEWSOS_CC

#    ifdef     SYSTEME_NWS3000_NEWSOS_2CC
#         TestADef  BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01                                                                  \
                                        /* Sur 'SYSTEME_NWS3000_NEWSOS_2CC', le compilateur 'cc' lorsqu'il compile les fonctions     */ \
                                        /* relatives a l'initialisation d'une image par une iteration produit un binaire errone,     */ \
                                        /* qui donne a l'edition de liens le message d'erreur suivant :                              */ \
                                        /*                                                                                           */ \
                                        /*   ld:                                                                                     */ \
                                        /*   Object file format error in:... relocation entry for non-relocatable symbol in .text    */ \
                                        /*   section for entry...                                                                    */ \
                                        /*                                                                                           */ \
                                        /* la seule solution que j'ai trouve est donc d'inhiber la compilation de ces modules...     */
#    Aifdef    SYSTEME_NWS3000_NEWSOS_2CC
#    Eifdef    SYSTEME_NWS3000_NEWSOS_2CC

#Aif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )
#Eif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02))                                                                  \
           )

#if       (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))                                                                  \
           )
#Aif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))                                                                  \
           )
#Eif      (         (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03))                                                                  \
           )

#if       (         (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01))                                                       \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01))                                                        \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01))                                                       \
           )
#    nodefine  __VERSION__COMPILER_LA_FONCTION_Iiteration_champ                                                                         \
                                        /* Certains bugs SYSTEMEs empechent la compilation de la fonction 'Iiteration_champ(...)'    */ \
                                        /* et de tout ce qui l'accompagne...                                                         */
#Aif      (         (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01))                                                       \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01))                                                        \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01))                                                       \
           )
#    define    __VERSION__COMPILER_LA_FONCTION_Iiteration_champ                                                                         \
                                        /* Certains bugs SYSTEMEs empechent la compilation de la fonction 'Iiteration_champ(...)'    */ \
                                        /* et de tout ce qui l'accompagne...                                                         */
#Eif      (         (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01))                                                       \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01))                                                        \
          ||        (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01))                                                       \
           )




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