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