/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   D ' U N E   S E R I E   D ' I M A G E S                                                          */
/*        D U   T Y P E   " S E R I E   D E   T A Y L O R "  :                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande "accumule" une serie d'images                                                                   */
/*                  en effectuant, suivant les options donnees                                                                       */
/*                  les operations suivantes ('i' designant un                                                                       */
/*                  indice de parcours de la liste 'Image') :                                                                        */
/*                                                                                                                                   */
/*                                                                   a  b  c                                                         */
/*                                                                  X .Y .Z                                                          */
/*                                      Cumul <-- Cumul + Image(i).----------                                                        */
/*                                                                   a!b!c!                                                          */
/*                                                                                                                                   */
/*                    les 'Image(i)' donnant en fait les coefficients                                                                */
/*                  des developpements en serie de Taylor de fonctions                                                               */
/*                  arbitraires permettant de calculer des textures en                                                               */
/*                  tant qu'image Resultat. On notera bien que ces                                                                   */
/*                  coefficients sont locaux a chaque point, puisqu'ils                                                              */
/*                  sont donnes par Image(i,X,Y). Ainsi, en chaque point                                                             */
/*                  {X,Y,Z} on peut se definir une fonction particuliere,                                                            */
/*                  dont les coefficients du developpement en serie de                                                               */
/*                  Taylor sont donnes successivement par les differentes                                                            */
/*                  images de la suite 'Image(i)'...                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/accumule.03$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1992??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

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

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/sequence.01.I"

#define   INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES                                                                                   \
                    FAUX                                                                                                                \
                                        /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a :           */ \
                                        /*                                                                                           */ \
                                        /*                  FAUX    : l'image d'arriere-plan est la premiere de la liste,            */ \
                                        /*                  VRAI    : l'image d'arriere-plan est la derniere de la liste.            */ \
                                        /*                                                                                           */

#define   EDITER_UNIQUEMENT_LA_SERIE_DE_TAYLOR                                                                                          \
                    FAUX                                                                                                                \
                                        /* Indique s'il ne faut qu'editer la serie de Taylor ('VRAI'), ou alors faire reellement     */ \
                                        /* les calculs ('FAUX').                                                                     */

#define   ECHELLE_OX                                                                                                                    \
                    FU
#define   ECHELLE_OY                                                                                                                    \
                    FU
                                        /* Facteur d'echelle a apporter a 'X' et 'Y'.                                                */
#define   TRANSLATION_OX                                                                                                                \
                    FZERO
#define   TRANSLATION_OY                                                                                                                \
                    FZERO
                                        /* Translation a apporter a 'X' et 'Y'.                                                      */
#define   VARIABLE_Z                                                                                                                    \
                    FU                                                                                                                  \
                                        /* Variable 'Z' constante pour toute la serie d'integration.                                 */
#define   PUISSANCE_MAXIMALE                                                                                                            \
                    DEUX                                                                                                                \
                                        /* Puissance maximale des monomes en {X,Y,Z} que l'on va utiliser.                           */
#define   EXPOSANT_MAXIMAL_X                                                                                                            \
                    DEUX
#define   EXPOSANT_MAXIMAL_Y                                                                                                            \
                    DEUX
#define   EXPOSANT_MAXIMAL_Z                                                                                                            \
                    DEUX
                                        /* Exposants maximaux des trois variables 'X', 'Y' et 'Z'.                                   */

#include  xci/accumule.01.I"

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

#define   TABULATION_DES_VARIABLES                                                                                                      \
                    "                "                                                                                                  \
                                        /* Chaine d'espaces utilisees pour tabuler correctement les variables 'X', 'Y et 'Z' lors    */ \
                                        /* de l'edition de la serie de Taylor.                                                       */
#define   EDITION_D_UN_MONOME(variable,exposant)                                                                                        \
                    Bblock                                                                                                              \
                    Test(IFNE(exposant,ZERO))                                                                                           \
                                        /* On notera que l'on utilise 'ZERO' et non pas 'EXPOSANT_MINIMAL_...' car en effet, le      */ \
                                        /* parametre 'EXPOSANT_MINIMAL_...' peut ne pas etre nul, or c'est vraiment la nullite que   */ \
                                        /* l'on veut tester ici (car quelque chose a la puissance zero vaut toujours un...).         */ \
                         Bblock                                                                                                         \
                         CAL3(Prme3(".%s%0*d",variable,nombre_de_chiffres,exposant));                                                   \
                                        /* Edition de la variable et de son exposant (on utilise 'nombre_de_chiffres' pour           */ \
                                        /* pour faire joli, mais ce n'est pas a proprement parler le bon parametre...).              */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         CAL3(Prme2("  %.*s",nombre_de_chiffres,TABULATION_DES_VARIABLES));                                             \
                                        /* Il n'y a que tabulation lorsque l'exposant de la variable est nul. On notera que la       */ \
                                        /* chaine "  %.*s" de 'Prme2(...)' est "parallele" a ".%s%0*d" de 'Prme3(...)'.              */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition de l'une des variables d'un monome et de son exposant.                            */

#define   EXPOSANT_MINIMAL_X                                                                                                            \
                    ZERO
#define   EXPOSANT_MINIMAL_Y                                                                                                            \
                    ZERO
#define   EXPOSANT_MINIMAL_Z                                                                                                            \
                    ZERO
                                        /* Exposants minimaux des trois variables 'X', 'Y' et 'Z'.                                   */
#define   variable_X                                                                                                                    \
                    MUL2(echelle_OX,ADD2(_____lNORMALISE_OX(X),translation_OX))
#define   variable_Y                                                                                                                    \
                    MUL2(echelle_OY,ADD2(_____lNORMALISE_OY(Y),translation_OY))
                                        /* Pour faire "pendant" a 'variable_Z'...                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C U M U L A T I O N   D ' U N E   S E R I E   D ' I M A G E S                                                          */
/*        D U   T Y P E   " S E R I E   D E   T A Y L O R "  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
                                        /* Nom de la sequence a integrer.                                                            */
     DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE));
                                        /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
                                        /* Nom du Resultat de l'integration.                                                         */
     DEFV(genere_Float,INIT(premiere_image,FLOT(PREMIERE_IMAGE)));
                                        /* Numero de la premiere image,                                                              */
     DEFV(genere_Float,INIT(derniere_image,FLOT(DERNIERE_IMAGE)));
                                        /* Numero de la derniere image.                                                              */
     DEFV(Int,INIT(translation_des_numeros_des_images,TRANSLATION_DES_NUMEROS_DES_IMAGES));
                                        /* Les numeros d'images peuvent etre translates. Lorsque tel est le cas, le numero           */
                                        /* d'image utilise est le numero translate modulo {premiere,derniere}.                       */
     DEFV(genere_Float,INIT(pas_des_images,FLOT(PAS_DES_IMAGES)));
                                        /* Pas de passage d'un numero d'image a une autre.                                           */
     DEFV(Logical,INIT(inverser_l_ordre_de_recuperation_des_images,INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES));
                                        /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a :           */
                                        /*                                                                                           */
                                        /*                  FAUX    : l'image d'arriere-plan est la premiere de la liste,            */
                                        /*                  VRAI    : l'image d'arriere-plan est la derniere de la liste.            */
                                        /*                                                                                           */
     DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES));
                                        /* Nombre de chiffres codant le numero des images de la serie...                             */
     DEFV(genere_Float,INIT(numero_d_image,FLOT__UNDEF));
                                        /* Numero de l'image courante.                                                               */
     DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF));
                                        /* Nom courant des images.                                                                   */
     DEFV(Logical,INIT(editer_uniquement_la_serie_de_Taylor,EDITER_UNIQUEMENT_LA_SERIE_DE_TAYLOR));
                                        /* Indique s'il ne faut qu'editer la serie de Taylor ('VRAI'), ou alors faire reellement     */
                                        /* les calculs ('FAUX').                                                                     */
     DEFV(Float,INIT(echelle_OX,ECHELLE_OX));
     DEFV(Float,INIT(echelle_OY,ECHELLE_OY));
                                        /* Facteur d'echelle a apporter a 'X' et 'Y'.                                                */
     DEFV(Float,INIT(translation_OX,TRANSLATION_OX));
     DEFV(Float,INIT(translation_OY,TRANSLATION_OY));
                                        /* Translation a apporter a 'X' et 'Y'.                                                      */
     DEFV(Float,INIT(variable_Z,VARIABLE_Z));
                                        /* Variable 'Z' constante pour toute la serie d'integration.                                 */
     DEFV(Int,INIT(puissance_maximale,PUISSANCE_MAXIMALE));
                                        /* Puissance maximale des monomes en {X,Y,Z} que l'on va utiliser.                           */
     DEFV(Int,INIT(exposant_maximal_X,EXPOSANT_MAXIMAL_X));
     DEFV(Int,INIT(exposant_maximal_Y,EXPOSANT_MAXIMAL_Y));
     DEFV(Int,INIT(exposant_maximal_Z,EXPOSANT_MAXIMAL_Z));
                                        /* Exposants maximaux des trois variables 'X', 'Y' et 'Z'.                                   */
     DEFV(Int,INIT(exposant_X,UNDEF));
     DEFV(Int,INIT(exposant_Y,UNDEF));
     DEFV(Int,INIT(exposant_Z,UNDEF));
                                        /* Exposants courants des trois variables 'X', 'Y' et 'Z'.                                   */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("postfixe=",nom_postfixe);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_F("premiere=",premiere_image);
                         GET_ARGUMENT_F("derniere=",derniere_image);
                         GET_ARGUMENT_F("pas=",pas_des_images);
                         GET_ARGUMENT_I("modulo=",translation_des_numeros_des_images);
                         GET_ARGUMENT_L("inverser=",inverser_l_ordre_de_recuperation_des_images);
                         GET_ARGUMENT_I("chiffres=",nombre_de_chiffres);
                         GET_ARGUMENT_L("editer=",editer_uniquement_la_serie_de_Taylor);
                         GET_ARGUMENT_F("ex=""eX=""Ex=",echelle_OX);
                         GET_ARGUMENT_F("ey=""eY=""Ey=",echelle_OY);
                         GET_ARGUMENT_F("tX=""Tx=",translation_OX);
                                        /* Le 20050623143612, "tx=" a ete supprime (double definition...).                           */
                         GET_ARGUMENT_F("tY=""Ty=",translation_OY);
                                        /* Le 20050623143612, "ty=" a ete supprime (double definition...).                           */
                         GET_ARGUMENT_F("z=""Z=",variable_Z);
                         GET_ARGUMENT_I("p=",puissance_maximale);
                         GET_ARGUMENT_I("emx=""emX=",exposant_maximal_X);
                         GET_ARGUMENT_I("emy=""emY=",exposant_maximal_Y);
                         GET_ARGUMENT_I("emz=""emZ=",exposant_maximal_Z);
                         )
                    );

     begin_nouveau_block
          Bblock
          BDEFV(imageF,cumul_des_couches);
                                        /* Image flottante dans laquelle on cumule les differentes couches d'avant en arriere.       */
          BDEFV(imageF,couche_courante);
                                        /* Image flottante dans laquelle on trouve la couche courante, puis a la fin le              */
                                        /* resultat renormalise par le nombre d'images...                                            */
          BDEFV(imageF,monome_courant);
                                        /* Image flottante dans laquelle on trouve le monome courant.                                */

          Test(IL_FAUT(editer_uniquement_la_serie_de_Taylor))
               Bblock
               Eblock
          ATes
               Bblock
               CALi(IFinitialisation(cumul_des_couches,FZERO));
                                        /* Nettoyage de l'image finale flottante...                                                  */
               Eblock
          ETes

          EGAL(numero_d_image,premiere_image);
                                        /* Positionnement sur la premiere image.                                                     */

          DoIn(exposant_X,EXPOSANT_MINIMAL_X,exposant_maximal_X,I)
               Bblock
                                        /* Calcul d'un exposant 'eX' possible pour la variable 'X'.                                  */
               DoIn(exposant_Y,EXPOSANT_MINIMAL_Y,exposant_maximal_Y,I)
                    Bblock
                                        /* Calcul d'un exposant 'eY' possible pour la variable 'Y'.                                  */
                    DoIn(exposant_Z,EXPOSANT_MINIMAL_Z,exposant_maximal_Z,I)
                         Bblock
                                        /* Calcul d'un exposant 'eZ' possible pour la variable 'Z'.                                  */
                         Test(IFLE(ADD3(exposant_X,exposant_Y,exposant_Z),puissance_maximale))
                              Bblock
                                        /* Le triplet (eX,eY,eZ) des exposants des trois variables 'X', 'Y' et 'Z' n'est valide que  */
                                        /* si leur somme est inferieure ou egale a la puissance maximale des monomes.                */
                              Test(IFLE(numero_d_image,derniere_image))
                                   Bblock
                                        /* Ce processus est repete tant que l'on n'a pas epuise l'ensemble des images Argument. On   */
                                        /* notera la relation suivante :                                                             */
                                        /*                                                                                           */
                                        /* supposons que la variable 'Z' soit ignoree, on prend donc :                               */
                                        /*                                                                                           */
                                        /*                  emz=0                                                                    */
                                        /*                                                                                           */
                                        /* Soit 'p' le degre maximal des monomes ('puissance_maximale') ; il va donc y avoir :       */
                                        /*                                                                                           */
                                        /*                   1  monome  de degre 0     : 1                                           */
                                        /*                                                                                           */
                                        /*                   2  monomes de degre 1     : x, y                                        */
                                        /*                                                                                           */
                                        /*                                                2        2                                 */
                                        /*                   3  monomes de degre 2     : x , x.y, y                                  */
                                        /*                                                                                           */
                                        /*                                                3   2        2   3                         */
                                        /*                   4  monomes de degre 3     : x , x .y , x.y , y                          */
                                        /*                                                                                           */
                                        /*                   .     .         .   .                                                   */
                                        /*                   .     .         .   .                                                   */
                                        /*                   .     .         .   .                                                   */
                                        /*                                                p   p-1            p-1   p                 */
                                        /*                  p+1 monomes de degre p     : x , x   .y, ..., x.y   , y                  */
                                        /*                                                                                           */
                                        /* Soit au total :                                                                           */
                                        /*                                                                                           */
                                        /*                                                 (p+1).(p+2)                               */
                                        /*                  1 + 2 + 3 + 4 + ... + (p+1) = ------------- monomes                      */
                                        /*                                                      2                                    */
                                        /*                                                                                           */
                                        /* Soit alors 'N' le nombre d'images ; il faudrait donc que l'on ait theoriquement :         */
                                        /*                                                                                           */
                                        /*                   (p+1).(p+2)                                                             */
                                        /*                  ------------- = N                                                        */
                                        /*                        2                                                                  */
                                        /*                                                                                           */
                                        /* ou :                                                                                      */
                                        /*                                                                                           */
                                        /*                  (p+1).(p+2) = 2.N                                                        */
                                        /*                                                                                           */
                                        /*                   2                                                                       */
                                        /*                  p  + 3.p + 2.(1-N) = 0                                                   */
                                        /*                                                                                           */
                                        /* 'p' etant un nombre entier.                                                               */
                                        /*                                                                                           */
                                        /* Le discriminant 'D' vaut :                                                                */
                                        /*                                                                                           */
                                        /*                       2                                                                   */
                                        /*                  D = 3  - 4.1.2.(1-N)                                                     */
                                        /*                                                                                           */
                                        /*                  D = 1 + 8.N                                                              */
                                        /*                                                                                           */
                                        /* qui doit donc etre un carre, pour que 'p' ait une chance d'etre entier. 'D' est d'autre   */
                                        /* part impair. La racine 'p' positive vaut :                                                */
                                        /*                               __                                                          */
                                        /*                              /                                                            */
                                        /*                       -3 + \/ D                                                           */
                                        /*                  p = ------------                                                         */
                                        /*                           2                                                               */
                                        /*                                                                                           */
                                        /* pour que 'p' soit entier, il faut que le numerateur soit pair, et que donc la racine      */
                                        /* du discriminant soit impaire (puisque la difference de deux nombres impairs est paire,    */
                                        /* et que '3' est impair). On arrive donc aux solutions :                                    */
                                        /*                                                                                           */
                                        /*                            __                                                             */
                                        /*                       |   /   |     |                                                     */
                                        /*                    D  | \/ D  |  N  |  p                                                  */
                                        /*                       |       |     |                                                     */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                    25 |    5  |   3 |   1                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                    49 |    7  |   6 |   2                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                    81 |    9  |  10 |   3                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   121 |   11  |  15 |   4                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   169 |   13  |  21 |   5                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   225 |   15  |  28 |   6                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   289 |   17  |  36 |   7                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   361 |   19  |  45 |   8                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   441 |   21  |  55 |   9                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   529 |   23  |  66 |  10                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   625 |   25  |  78 |  11                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   729 |   27  |  91 |  12                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   841 |   29  | 105 |  13                                                 */
                                        /*                  -----|-------|-----|-----                                                */
                                        /*                   961 |   31  | 120 |  14                                                 */
                                        /*                                                                                           */
                                        /* avec :                                                                                    */
                                        /*                                                                                           */
                                        /*                       D-1                                                                 */
                                        /*                  N = -----                                                                */
                                        /*                        8                                                                  */
                                        /*                                                                                           */
                                   Test(IFNE(numero_d_image,fINTE(numero_d_image)))
                                        Bblock
                                        PRINT_ATTENTION("le numero de l'image courante n'est pas entier, il va etre tronque");
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes

                                   EGAL(nom_image
                                       ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE)
                                            ,chain_Aconcaten2_sauf_nom_pipe(nom_imageA
                                                                           ,chain_numero_modulo(INTE(NUMERO_D_IMAGE)
                                                                                               ,nombre_de_chiffres
                                                                                                )
                                                                            )
                                            ,chain_Aconcaten3_sauf_nom_pipe(nom_imageA
                                                                           ,chain_numero_modulo(INTE(NUMERO_D_IMAGE)
                                                                                               ,nombre_de_chiffres
                                                                                                )
                                                                           ,nom_postfixe
                                                                            )
                                             )
                                        );
                                        /* Notons I(0) la premiere image.                                                            */
                                        /*                                                                                           */
                                        /* Voici un premier exemple :                                                                */
                                        /*                                                                                           */
                                        /*                  eX E [0,2]                                                               */
                                        /*                  eY = 0                                                                   */
                                        /*                  eZ = 0                                                                   */
                                        /*                                                                                           */
                                        /*                  (eX) <= 2                                                                */
                                        /*                                                                                           */
                                        /* on a alors les associations suivantes :                                                   */
                                        /*                                                                                           */
                                        /*                               0                                                           */
                                        /*                  I(0) --0--> X                                                            */
                                        /*                                                                                           */
                                        /*                               1                                                           */
                                        /*                  I(1) --0--> X                                                            */
                                        /*                                                                                           */
                                        /*                               2                                                           */
                                        /*                  I(2) --0--> X                                                            */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Voici un second exemple :                                                                 */
                                        /*                                                                                           */
                                        /*                  eX E [0,2]                                                               */
                                        /*                  eY E [0,2]                                                               */
                                        /*                  eZ = 0                                                                   */
                                        /*                                                                                           */
                                        /*                  (eX+eY) <= 2                                                             */
                                        /*                                                                                           */
                                        /* on a alors les associations suivantes :                                                   */
                                        /*                                                                                           */
                                        /*                               0  0                                                        */
                                        /*                  I(0) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                               0  1                                                        */
                                        /*                  I(1) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                               0  2                                                        */
                                        /*                  I(2) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                               1  0                                                        */
                                        /*                  I(3) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                               1  1                                                        */
                                        /*                  I(4) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                               2  0                                                        */
                                        /*                  I(5) --0--> X .Y                                                         */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Voici un troisieme exemple :                                                              */
                                        /*                                                                                           */
                                        /*                  eX E [0,2]                                                               */
                                        /*                  eY E [0,2]                                                               */
                                        /*                  eZ E [0,2]                                                               */
                                        /*                                                                                           */
                                        /*                  (eX+eY+eZ) <= 2                                                          */
                                        /*                                                                                           */
                                        /* on a alors les associations suivantes :                                                   */
                                        /*                                                                                           */
                                        /*                               0  0  0                                                     */
                                        /*                  I(0) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               0  0  1                                                     */
                                        /*                  I(1) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               0  0  2                                                     */
                                        /*                  I(2) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               0  1  0                                                     */
                                        /*                  I(3) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               0  1  1                                                     */
                                        /*                  I(4) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               0  2  0                                                     */
                                        /*                  I(5) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               1  0  0                                                     */
                                        /*                  I(6) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               1  0  1                                                     */
                                        /*                  I(7) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               1  1  0                                                     */
                                        /*                  I(8) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                               2  0  0                                                     */
                                        /*                  I(9) --0--> X .Y .Z                                                      */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Le 20221212114347, 'chain_numero_modulo(...)' a remplace 'chain_numero(...)'...           */

                                   Test(IL_FAUT(editer_uniquement_la_serie_de_Taylor))
                                        Bblock
                                        CAL3(Prme2("+ I(%0*d)",nombre_de_chiffres,INTE(numero_d_image)));
                                        /* Edition du numero courant de l'image.                                                     */
                                        EDITION_D_UN_MONOME("x",exposant_X);
                                        /* Edition de la variable 'X' et de son exposant.                                            */
                                        EDITION_D_UN_MONOME("y",exposant_Y);
                                        /* Edition de la variable 'Y' et de son exposant.                                            */
                                        EDITION_D_UN_MONOME("z",exposant_Z);
                                        /* Edition de la variable 'Z' et de son exposant.                                            */
                                        CALS(Fsauts_de_lignes(UN));
                                        Eblock
                                   ATes
                                        Bblock
                                        Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_image))))
                                             Bblock
                                        /* 'ImageA' donne la couche a l'instant courant,                                             */
                                             CALS(Istd_float(couche_courante
                                                            ,FLOT__NOIR
                                                            ,FLOT__BLANC
                                                            ,ImageA
                                                             )
                                                  );
                                        /* Que l'on convertit en flottant...                                                         */
                                             begin_image
                                                  Bblock
                                                  storeF_point(DIVI(NEUT(MUL3(PUIX(variable_X,exposant_X)
                                                                             ,PUIX(variable_Y,exposant_Y)
                                                                             ,PUIX(variable_Z,exposant_Z)
                                                                              )
                                                                         )
                                                                   ,MUL3(FACT(exposant_X)
                                                                        ,FACT(exposant_Y)
                                                                        ,FACT(exposant_Z)
                                                                         )
                                                                    )
                                                              ,monome_courant
                                                              ,X,Y
                                                               );
                                        /* Calcul du monome courant en chacun des points de l'image, c'est-a-dire la quantite :      */
                                        /*                                                                                           */
                                        /*                    eX  eY  eZ                                                             */
                                        /*                   X  .Y  .Z                                                               */
                                        /*                  -------------                                                            */
                                        /*                    eX!eY!eZ!                                                              */
                                        /*                                                                                           */
                                        /* ou 'X', 'Y' et 'Z' representent les coordonnees normalisees dans [0,1] avec une           */
                                        /* translation et un facteur d'echelle eventuels.                                            */
                                        /*                                                                                           */
                                        /* Cette formule s'obtient de la facon suivante lorsque l'on veut calculer une quantite du   */
                                        /* type :                                                                                    */
                                        /*                                                                                           */
                                        /*                              n                                                            */
                                        /*                  S  = (x+y+z)                                                             */
                                        /*                   n                                                                       */
                                        /*                                                                                           */
                                        /*                        k=n                                                                */
                                        /*                        ___                                                                */
                                        /*                        \    k  n-k      k                                                 */
                                        /*                  S  =  /__ C .x   .(y+z)                                                  */
                                        /*                   n         n                                                             */
                                        /*                        k=0                                                                */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*                        k=n         p=k                                                    */
                                        /*                        ___         ___                                                    */
                                        /*                        \    k  n-k \    p  k-p  p                                         */
                                        /*                  S  =  /__ C .x   ./__ C .y   .z                                          */
                                        /*                   n         n           k                                                 */
                                        /*                        k=0         p=0                                                    */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*                        k=n p=k                                                            */
                                        /*                        ___ ___                                                            */
                                        /*                        \   \    k p  n-k  k-p  p                                          */
                                        /*                  S  =  /__ /__ C C .x   .y   .z                                           */
                                        /*                   n             n k                                                       */
                                        /*                        k=0 p=0                                                            */
                                        /*                                                                                           */
                                        /* or :                                                                                      */
                                        /*                                                                                           */
                                        /*                   k  p       n!         k!              n!                                */
                                        /*                  C .C  = ----------.---------- = ----------------                         */
                                        /*                   n  k    (n-k)!k!   (k-p)!p!     (n-k)!(k-p)!p!                          */
                                        /*                                                                                           */
                                        /* d'ou :                                                                                    */
                                        /*                                                                                           */
                                        /*                        k=n p=k                                                            */
                                        /*                        ___ ___                                                            */
                                        /*                        \   \          n!         n-k  k-p  p                              */
                                        /*                  S  =  /__ /__ ----------------.x   .y   .z                               */
                                        /*                   n             (n-k)!(k-p)!p!                                            */
                                        /*                        k=0 p=0                                                            */
                                        /*                                                                                           */
                                        /* or une serie de Taylor pour une fonction de trois variables est du type symbolique :      */
                                        /*                                                                                           */
                                        /*                                    n=N                                                    */
                                        /*                                    ___                                                    */
                                        /*                                    \    1       d        d        d   n                   */
                                        /*        f(x+a,y+b,z+c) = f(x,y,z) + /__ ----.(a.---- + b.---- + c.----) f(x,y,z) + Reste   */
                                        /*                                         n!      dx       dy       dz                      */
                                        /*                                    n=1                                                    */
                                        /*                                                                                           */
                                        /*                                              \______________________/                     */
                                        /*                                                                                           */
                                        /*                                                          S                                */
                                        /*                                                           n                               */
                                        /*                                                                                           */
                                        /* d'ou la formule annoncee puisqu'on trouve ci-dessus au numerateur et au denominateur n!   */
                                        /* qui s'eliminent l'un l'autre...                                                           */
                                                  Eblock
                                             end_image

                                             CALS(IFmultiplication(couche_courante
                                                                  ,couche_courante
                                                                  ,monome_courant
                                                                   )
                                                  );
                                        /* Puis attenuation a l'aide de la matrice de monomes.                                       */
                                             CALS(IFaddition(cumul_des_couches,cumul_des_couches,couche_courante));
                                        /* Et on cumule d'avant en arriere par addition arithmetique.                                */
                                             Eblock
                                        ATes
                                             Bblock
                                             Test__CODE_ERREUR__ERREUR07;
                                             Eblock
                                        ETes
                                        Eblock
                                   ETes
                                   INCR(numero_d_image,pas_des_images);
                                        /* Passage a l'image suivante. Ce comptage n'est fait que tant que le traitement est licite. */
                                   CALZ_FreCC(nom_image);
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EDoI
                    Eblock
               EDoI
               Eblock
          EDoI

          Test(IL_FAUT(editer_uniquement_la_serie_de_Taylor))
               Bblock
               CALS(Fsauts_de_lignes(UN));
               Eblock
          ATes
               Bblock
               CALS(Ifloat_std_avec_renormalisation(ImageR,cumul_des_couches));
                                        /* Contrairement a 'v $xci/accumule.01$K', ou l'on peut choisir entre renormaliser et ne pas */
                                        /* renormaliser, ici il faut le faire systematiquement, car en effet, la ponderation au      */
                                        /* niveau d'une couche n'est plus constante, mais varie d'un point a l'autre (en fonction    */
                                        /* de 'X', 'Y' et 'Z').                                                                      */
               CALi(Iupdate_image(nom_imageR,ImageR));
               Eblock
          ETes

          EDEFV(imageF,monome_courant);
                                        /* Image flottante dans laquelle on trouve le monome courant.                                */
          EDEFV(imageF,couche_courante);
                                        /* Image flottante dans laquelle on trouve la couche courante, puis a la fin le              */
                                        /* resultat renormalise par le nombre d'images...                                            */
          EDEFV(imageF,cumul_des_couches);
                                        /* Image flottante dans laquelle on cumule les differentes couches d'avant en arriere.       */
          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



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