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