/*************************************************************************************************************************************/
/* */
/* M A P P I N G E N T R E U N E S P A C E N - D I M E N S I O N N E L */
/* E T U N E S P A C E B I D I M E N S I O N N E L : */
/* */
/* */
/* Nota : */
/* */
/* Pour plus d'informations et un exemple */
/* d'utilisation d'un tel mapping, voir le */
/* programme 'v $xrv/map_ND_2D.11$Z'. */
/* */
/* */
/* Author of '$xrv/map_ND_2D.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1997??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 NOMBRE_DE_DIMENSIONS \
TRI_DIMENSIONNEL \
/* Dimension a priori de l'espace N-dimensionnel. */
#define INTERPOLATION_DE_L_ORIGINE_A_UN_POLYGONE \
FZERO \
/* Constante permettant de passer d'une representation centree a l'origine (0) a une */ \
/* representation "polygonale" (par exemple avec 1). */
#define ECHELLE_GENERALE_DES_COORDONNEES \
FU
#define TRANSLATION_GENERALE_DES_COORDONNEES \
FZERO
/* Echelle et translation generales des coordonnees. */
#define MAPPING_INFINI_M1_P1 \
FAUX \
/* Permet de passer de ]-infini,+infini[ a ]-1,+1[. */
#define FAIRE_DU_FAUX_TRIDIMENSIONNEL \
FAUX \
/* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z' (=Zmin), ce */ \
/* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
#define COORDONNEE_Z \
FLOT(Zmin) \
/* Coordonnee 'Z' a priori. */
#define EDITER_DES_INFORMATIONS_ARBITRAIRES \
FAUX \
/* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre */ \
/* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE}, */ \
/* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U F I C H I E R : */
/* */
/*************************************************************************************************************************************/
#define SAUT_DANS_LE_FICHIER \
ZERO
DEFV(Local,DEFV(Positive,INIT(saut_dans_le_fichier_des_coordonnees,SAUT_DANS_LE_FICHIER)));
/* Definition du nombre de valeurs a sauter entre deux valeurs recuperees du fichier de */
/* coordonnees et de valeurs. */
DEFV(Local,DEFV(CHAR,INIT(POINTERc(fichier_des_coordonnees),NOM_PIPE_Local)));
/* Contenu du fichier ASCII Argument. */
#define NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER \
MILLE \
/* Nombre maximal d'elements dans le fichier (valeur tres arbitraire...). */
DEFV(Local,DEFV(Float,DTb1(liste_des_coordonnees,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER)));
/* Definition de la liste contenant les coordonnees. */
#define ELEMENT_DU_FICHIER(index) \
ITb0(liste_des_coordonnees \
,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER) \
) \
/* Acces a un element du point courant du fichier. */
#define lTRANSFORMATION(fichier_des_coordonnees,liste_des_coordonnees,valeur_par_defaut) \
Bblock \
CALS(Fload_fichier_formatte_Float(fichier_des_coordonnees \
,liste_des_coordonnees \
,nombre_de_dimensions \
,ZERO \
,saut_dans_le_fichier_des_coordonnees \
,VRAI \
,valeur_par_defaut \
,LE_NOM_DU_FICHIER_N_EST_PAS_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE \
) \
); \
\
&define __ParaVal liste_des_coordonnees&&& \
&define __ParaInd PREMIER_ELEMENT_D_UN_FICHIER&&& \
&define __ParaLon nombre_de_dimensions&&& \
&define __ParaTyp TYPE_FORMAT_FLOT&&& \
&define __ParaFor FORMAT_FLOT_EDITION&&& \
\
Eblock \
/* Recuperation d'un fichier contenant une liste. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A P P I N G E N T R E U N E S P A C E N - D I M E N S I O N N E L */
/* E T U N E S P A C E B I D I M E N S I O N N E L : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(nombre_de_dimensions,NOMBRE_DE_DIMENSIONS));
/* Dimension a priori de l'espace N-dimensionnel. */
DEFV(Float,INIT(interpolation_de_l_origine_a_un_polygone,INTERPOLATION_DE_L_ORIGINE_A_UN_POLYGONE));
/* Constante permettant de passer d'une representation centree a l'origine (0) a une */
/* representation "polygonale" (par exemple avec 1). */
DEFV(Float,INIT(echelle_generale_des_coordonnees,ECHELLE_GENERALE_DES_COORDONNEES));
DEFV(Float,INIT(translation_generale_des_coordonnees,TRANSLATION_GENERALE_DES_COORDONNEES));
/* Echelle et translation generales des coordonnees. */
DEFV(Logical,INIT(mapping_infini_m1_p1,MAPPING_INFINI_M1_P1));
/* Permet de passer de ]-infini,+infini[ dans ]-1,+1[. */
DEFV(Logical,INIT(faire_du_faux_tridimensionnel,FAIRE_DU_FAUX_TRIDIMENSIONNEL));
/* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z', ce qui rend */
/* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
DEFV(Float,INIT(coordonnee_Z,COORDONNEE_Z));
/* Coordonnee 'Z' a priori. */
DEFV(Logical,INIT(editer_des_informations_arbitraires,EDITER_DES_INFORMATIONS_ARBITRAIRES));
DEFV(CHAR,INIC(POINTERc(informations_arbitraires),C_VIDE));
/* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre */
/* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE}, */
/* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
DEFV(Int,INIT(index,UNDEF));
/* Index de l'element courant dans le fichier. */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(PROCESS_ARGUMENT_I("nd=",nombre_de_dimensions
,BLOC(VIDE;)
,BLOC(Bblock
PRINT_AVERTISSEMENT("'nd=' doit etre defini avant toute entree de fichiers");
Test(IFGT(nombre_de_dimensions,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER))
Bblock
PRINT_ERREUR("le fichier est trop long et va etre tronque (1)");
CAL1(Prer2("Il possede %d elements alors que le maximum est de %d.\n"
,nombre_de_dimensions
,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER
)
);
EGAL(nombre_de_dimensions,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
)
);
PROCESS_ARGUMENT_I("saut=",saut_dans_le_fichier_des_coordonnees
,BLOC(VIDE;)
,BLOC(PRINT_AVERTISSEMENT("'saut=' doit etre defini avant toute entree de fichiers");)
);
/* ATTENTION : la recuperation de 'saut_dans_le_fichier_des_coordonnees' doit */
/* preceder les 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent. Cela implique */
/* aussi que la definition par "saut=", dans les fichiers '$xrq/nucleon.L?$Z', soit en */
/* tete des autres.. */
PROCESS_ARGUMENT_FICHIER("fichier="
,fichier_des_coordonnees
,liste_des_coordonnees
,FZERO
,lTRANSFORMATION
);
GET_ARGUMENT_F("interpolation=",interpolation_de_l_origine_a_un_polygone);
GET_ARGUMENT_F("echelle=",echelle_generale_des_coordonnees);
GET_ARGUMENT_F("translation=",translation_generale_des_coordonnees);
GET_ARGUMENT_L("mapping=",mapping_infini_m1_p1);
GET_ARGUMENT_L("tridimensionnel=",faire_du_faux_tridimensionnel);
GET_ARGUMENT_F("z=""Zf=""Z=",coordonnee_Z);
GET_ARGUMENT_L("editer=",editer_des_informations_arbitraires);
GET_ARGUMENT_C("informations=",informations_arbitraires);
)
);
DoIn(index
,PREMIER_ELEMENT_D_UN_FICHIER
,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,nombre_de_dimensions)
,I
)
Bblock
DEFV(Int,INIT(index_de_l_axe_courant,SOUS(index,PREMIER_ELEMENT_D_UN_FICHIER)));
/* Index 'k' de l'axe courant. */
DEFV(Float,INIT(coordonnee_courante
,AXPB(echelle_generale_des_coordonnees
,ELEMENT_DU_FICHIER(index)
,translation_generale_des_coordonnees
)
)
);
DEFV(Float,INIT(coordonnee_courante_eventuellement_mappee,FLOT__UNDEF));
/* Coordonnee courante dans le fichier et sa version eventuellement "mappee" dans ]-1,+1[. */
CAL2(Prin1("axe=%d",index_de_l_axe_courant));
/* Edition de l'axe courant. */
Test(IL_FAUT(mapping_infini_m1_p1))
Bblock
Test(IFLE(ABSO(coordonnee_courante),LOGX(F_INFINI)))
Bblock
EGAL(coordonnee_courante_eventuellement_mappee,TAHX(coordonnee_courante));
/* Mapping de ]-infini,+infini[ dans ]-1,+1[+1]. */
Eblock
ATes
Bblock
DEFV(Float,INIT(coordonnee_courante_mappee_et_seuillee,MEME_SIGNE_QUE(coordonnee_courante,FU)));
/* Valeur du mapping de la coordonnee courante lorsqu'il y a debordement potentiel dans */
/* 'EXPX(...)' via 'TAHX(...)'. */
PRINT_ERREUR("une coordonnee est trop grande pour passser dans 'EXPX(...)' via 'TAHX(...)'");
CAL1(Prer3("elle vaut %+g alors que la valeur absolue du maximum est de %+g, elle est donc seuillee a %+g\n"
,coordonnee_courante
,LOGX(F_INFINI)
,coordonnee_courante_mappee_et_seuillee
)
);
EGAL(coordonnee_courante_eventuellement_mappee,coordonnee_courante_mappee_et_seuillee);
/* Et on lui donne une valeur correspondant a l'un des deux infinis remappes... */
Eblock
ETes
Eblock
ATes
Bblock
EGAL(coordonnee_courante_eventuellement_mappee,coordonnee_courante);
Eblock
ETes
CAL2(Prin1(" X=%+g"
,LIZ2(coordonnee_courante_eventuellement_mappee
,COSX(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant))
,interpolation_de_l_origine_a_un_polygone
,COSX(SOUS(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant),PI_SUR_2))
)
)
);
CAL2(Prin1(" Y=%+g"
,LIZ2(coordonnee_courante_eventuellement_mappee
,SINX(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant))
,interpolation_de_l_origine_a_un_polygone
,SINX(SOUS(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant),PI_SUR_2))
)
)
);
/* Edition des coordonnees bidimensionnelles {X,Y} equivalentes. */
Test(IL_FAUT(faire_du_faux_tridimensionnel))
Bblock
CAL2(Prin1(" Z=%+g"
,coordonnee_Z
)
);
/* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z', ce qui rend */
/* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_des_informations_arbitraires))
Bblock
CAL2(Prin1(" %s",informations_arbitraires));
/* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre */
/* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE}, */
/* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'. */
Eblock
ATes
Bblock
Eblock
ETes
CAL2(Prin0("\n"));
/* "Fermeture" de la ligne courante... */
Eblock
EDoI
RETU_Commande;
Eblock
ECommande