/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   E N T R E   D E S   P O I N T S  :                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    L'interpolation lineaire qui est faite ici                                                                     */
/*                  entre deux points consecutifs peut en quelque                                                                    */
/*                  sorte contenir des "trous" car, en effet,                                                                        */
/*                  cette interpolation prend en compte la distance                                                                  */
/*                  dans l'espace tridimensionnel via 'RdisF3D(...)'                                                                 */
/*                  et non pas la distance dans un plan (celui d'une                                                                 */
/*                  image en particulier...).                                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/interpole.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20150216095510).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L E U R S   I M P L I C I T E S   D E S   P A R A M E T R E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   DIVISEUR_DE_L_INCREMENT_DE_LAMBDA                                                                                             \
                    FU                                                                                                                  \
                                        /* Diviseur de l'increment du parametre d'interpolation.                                     */

#define   PONDERATION_X_IMPLICITE                                                                                                       \
                    FZERO
#define   PONDERATION_Y_IMPLICITE                                                                                                       \
                    FZERO
#define   PONDERATION_Z_IMPLICITE                                                                                                       \
                    FZERO
                                        /* Ponderation de selection des coordonnees apres transformation.                            */
#define   PONDERATION_DE_LAMBDA                                                                                                         \
                    FZERO                                                                                                               \
                                        /* Ponderation du parametre d'interpolation (introduit le 20230123103313 lors de             */ \
                                        /* modifications de 'v $xiirs/.SPHE.Z1.1.$U .xrv.interpole.01.X').                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"

#define   X_IMPLICITE                                                                                                                   \
                    FZERO
#define   Y_IMPLICITE                                                                                                                   \
                    FZERO
#define   Z_IMPLICITE                                                                                                                   \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
                                        /* Definition en memoire des fichiers de coordonnees cartesiennes.                           */

#define   ELEMENT_DU_FICHIER_LISTE_X(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define   ELEMENT_DU_FICHIER_LISTE_Y(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define   ELEMENT_DU_FICHIER_LISTE_Z(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
                                        /* Acces a un element courant des fichiers de coordonnees cartesiennes.                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   E N T R E   D E S   P O I N T S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Float,INIT(diviseur_de_l_increment_de_lambda,DIVISEUR_DE_L_INCREMENT_DE_LAMBDA));
                                        /* Diviseur de l'increment du parametre d'interpolation.                                     */
                                        /*                                                                                           */
                                        /* Je note le 20230222091655 le bon fonctionnement de ce parametre. Soit en effet le         */
                                        /* fichier suivant :                                                                         */
                                        /*                                                                                           */
                                        /*                  0.90                                                                     */
                                        /*                  1.00                                                                     */
                                        /*                  2.00                                                                     */
                                        /*                                                                                           */
                                        /* interpole en tant que "LISTE_X=... pX=1 pY=0 pZ=0 pL=0" avec :                            */
                                        /*                                                                                           */
                                        /*                  diviseur_lambda=20                                                       */
                                        /*                                                                                           */
                                        /* donne :                                                                                   */
                                        /*                                                                                           */
                                        /*                  0.90                                                                     */
                                        /*                       0.95                                                                */
                                        /*                  1.00                                                                     */
                                        /*                       1.05                                                                */
                                        /*                       1.10                                                                */
                                        /*                       1.15                                                                */
                                        /*                       1.20                                                                */
                                        /*                       1.25                                                                */
                                        /*                       1.30                                                                */
                                        /*                       1.35                                                                */
                                        /*                       1.40                                                                */
                                        /*                       1.45                                                                */
                                        /*                       1.50                                                                */
                                        /*                       1.55                                                                */
                                        /*                       1.60                                                                */
                                        /*                       1.65                                                                */
                                        /*                       1.70                                                                */
                                        /*                       1.75                                                                */
                                        /*                       1.80                                                                */
                                        /*                       1.85                                                                */
                                        /*                       1.90                                                                */
                                        /*                       1.95                                                                */
                                        /*                  2.00                                                                     */
                                        /*                                                                                           */
                                        /* ce qui est parfait, en notant que l'inverse de la valeur absolue de la difference         */
                                        /* de deux elements successifs est egal au "diviseur de lambda". Par exemple :               */
                                        /* est egal au "diviseur de lambda". Par exemple :                                           */
                                        /*                                                                                           */
                                        /*                        1               1                                                  */
                                        /*                  ------------- = ------------- = 20                                       */
                                        /*                   |0.95-0.90|     |1.55-1.50|                                             */
                                        /*                                                                                           */

     DEFV(Float,INIT(ponderation_X,PONDERATION_X_IMPLICITE));
     DEFV(Float,INIT(ponderation_Y,PONDERATION_Y_IMPLICITE));
     DEFV(Float,INIT(ponderation_Z,PONDERATION_Z_IMPLICITE));
                                        /* Ponderation de selection des coordonnees apres transformation.                            */
     DEFV(Float,INIT(ponderation_de_lambda,PONDERATION_DE_LAMBDA));
                                        /* Ponderation du parametre d'interpolation (introduit le 20230123103313 lors de             */
                                        /* modifications de 'v $xiirs/.SPHE.Z1.1.$U .xrv.interpole.01.X').                           */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;

                         PROKESF_ARGUMENT_FICHIER("LISTE_X="
                                                 ,fichier_LISTE_X
                                                 ,liste_initiale_des_X
                                                 ,X_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Y="
                                                 ,fichier_LISTE_Y
                                                 ,liste_initiale_des_Y
                                                 ,Y_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Z="
                                                 ,fichier_LISTE_Z
                                                 ,liste_initiale_des_Z
                                                 ,Z_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_F("dl=""diviseur_lambda=",diviseur_de_l_increment_de_lambda);

                         GET_ARGUMENT_F("PX=""pX=""Pond1=",ponderation_X);
                         GET_ARGUMENT_F("PY=""pY=""Pond2=",ponderation_Y);
                         GET_ARGUMENT_F("PZ=""pZ=""Pond3=",ponderation_Z);
                         GET_ARGUMENT_F("PL=""pL=""PondL=",ponderation_de_lambda);
                                        /* Argument introduit le 20230123103313...                                                   */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                         )
                    );

     begin_nouveau_block
          Bblock
          DEFV(Float,INIT(coordonnee_X_A,FLOT__UNDEF));
          DEFV(Float,INIT(coordonnee_Y_A,FLOT__UNDEF));
          DEFV(Float,INIT(coordonnee_Z_A,FLOT__UNDEF));
                                        /* Definition du point A.                                                                    */
          DEFV(Float,INIT(coordonnee_X_B,FLOT__UNDEF));
          DEFV(Float,INIT(coordonnee_Y_B,FLOT__UNDEF));
          DEFV(Float,INIT(coordonnee_Z_B,FLOT__UNDEF));
                                        /* Definition du point B.                                                                    */

          DoIn(index
              ,PREMIER_ELEMENT_D_UN_FICHIER
              ,DERNIER_ELEMENT_D_UN_FICHIER
              ,I
               )
               Bblock
               DEFV(Float,INIT(coordonnee_X,ELEMENT_DU_FICHIER_LISTE_X(index)));
               DEFV(Float,INIT(coordonnee_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)));
               DEFV(Float,INIT(coordonnee_Z,ELEMENT_DU_FICHIER_LISTE_Z(index)));
                                        /* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers.                         */

               Test(IFEQ(index,PREMIER_ELEMENT_D_UN_FICHIER))
                    Bblock
                                        /* Cas du premier point :                                                                    */
                    EGAL(coordonnee_X_A,coordonnee_X);
                    EGAL(coordonnee_Y_A,coordonnee_Y);
                    EGAL(coordonnee_Z_A,coordonnee_Z);
                                        /* Definition du point A.                                                                    */
                    Eblock
               ATes
                    Bblock
                                        /* Cas des points suivants :                                                                 */
                    DEFV(Float,INIT(coordonnee_X_interpolee,FLOT__UNDEF));
                    DEFV(Float,INIT(coordonnee_Y_interpolee,FLOT__UNDEF));
                    DEFV(Float,INIT(coordonnee_Z_interpolee,FLOT__UNDEF));
                                        /* Definition du point interpole.                                                            */
                    DEFV(Float,INIT(distance_AB,FLOT__UNDEF));

                    EGAL(coordonnee_X_B,coordonnee_X);
                    EGAL(coordonnee_Y_B,coordonnee_Y);
                    EGAL(coordonnee_Z_B,coordonnee_Z);
                                        /* Definition du point B.                                                                    */

                    EGAL(distance_AB
                        ,RdisF3D(coordonnee_X_A,coordonnee_Y_A,coordonnee_Z_A
                                ,coordonnee_X_B,coordonnee_Y_B,coordonnee_Z_B
                                 )

                         );

                    Test(IZNE(distance_AB))
                         Bblock
                         DEFV(Float,INIT(lambda,COORDONNEE_BARYCENTRIQUE_MINIMALE));
                         DEFV(Float,INIT(increment_de_lambda,DIVZ(INVE(distance_AB),diviseur_de_l_increment_de_lambda)));
                                        /* Definition du parametre d'interpolation...                                                */

                         Tant(IFLE(lambda,COORDONNEE_BARYCENTRIQUE_MAXIMALE))
                              Bblock
                              EGAL(coordonnee_X_interpolee,BARY(coordonnee_X_A,coordonnee_X_B,lambda));
                              EGAL(coordonnee_Y_interpolee,BARY(coordonnee_Y_A,coordonnee_Y_B,lambda));
                              EGAL(coordonnee_Z_interpolee,BARY(coordonnee_Z_A,coordonnee_Z_B,lambda));
                                        /* Definition du point interpole.                                                            */

                              EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(LIZ4(ponderation_X,coordonnee_X_interpolee
                                                                                              ,ponderation_Y,coordonnee_Y_interpolee
                                                                                              ,ponderation_Z,coordonnee_Z_interpolee
                                                                                              ,ponderation_de_lambda,lambda
                                                                                               )
                                                                                          );
                                        /* Sortie des valeurs interpolees...                                                         */
                                        /*                                                                                           */
                                        /* Introduit sous cette forme le 20160804095401...                                           */

                              INCR(lambda,increment_de_lambda);
                                        /* Afin de progresser sur la droite AB...                                                    */
                              Eblock
                         ETan

                         Test(IFEQ(index,DERNIER_ELEMENT_D_UN_FICHIER))
                              Bblock
                              Test(I3OU(IFNE(coordonnee_X_interpolee,coordonnee_X_B)
                                       ,IFNE(coordonnee_Y_interpolee,coordonnee_Y_B)
                                       ,IFNE(coordonnee_Z_interpolee,coordonnee_Z_B)
                                        )
                                   )
                                   Bblock
                                   EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(LIZ3(ponderation_X,coordonnee_X_B
                                                                                                   ,ponderation_Y,coordonnee_Y_B
                                                                                                   ,ponderation_Z,coordonnee_Z_B
                                                                                                    )
                                                                                               );
                                        /* Sortie du point B si necessaire (c'est-a-dire s'il est different du dernier point         */
                                        /* interpole...).                                                                            */
                                        /*                                                                                           */
                                        /* Introduit sous cette forme le 20160804095401...                                           */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(coordonnee_X_A,coordonnee_X_B);
                    EGAL(coordonnee_Y_A,coordonnee_Y_B);
                    EGAL(coordonnee_Z_A,coordonnee_Z_B);
                                        /* Changement de point A.                                                                    */
                    Eblock
               ETes
               Eblock
          EDoI
          Eblock
     end_nouveau_block

     lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);

     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.