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