/*************************************************************************************************************************************/
/* */
/* C A L C U L D E S D I S T A N C E S D ' E N S E M B L E D E P O I N T S { X , Y , Z } */
/* A U N P O I N T F I X E { X0 , Y0 , Z0 } : */
/* */
/* */
/* Author of '$xrv/distance.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20010725113145). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
/* Le 20080311163521, fut supprime : */
/* */
/* @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE */
/* */
/* qui semblait inutile... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE \
FU
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE \
FZERO
#define PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE \
FZERO
/* Ponderation des differentes distances calculables (introduit le 20071025091825). */
/* On notera que cela pourrait faire disparaitre 'utiliser_la_distance_euclidienne', mais */
/* cet indicateur est conserve pour des raisons de compatibilite anterieure. Pour utiliser */
/* ces nouvelles ponderations, il faut que 'utiliser_la_distance_euclidienne' soit 'FAUX'... */
#define UTILISER_LA_DISTANCE_EUCLIDIENNE \
VRAI \
/* Doit-on utiliser la distance euclidienne ('VRAI') ou celle dite "du chauffeur de taxi" */ \
/* ('FAUX') ? */
#define EDITER_L_ENSEMBLE_DES_DISTANCES \
VRAI \
/* Doit-on editer l'ensemble des distances ('VRAI') ou bien les extrema ('FAUX') ? Ceci a */ \
/* ete introduit le 20031129180830. */
#define CONSERVER_LES_DISTANCES_NULLES \
VRAI \
/* Doit-on editer conserver les distances nulles ('VRAI') ou bien les eliminer ('FAUX') ? */ \
/* Ceci a ete introduit le 20200419103352 afin de pouvoir les inverser ensuite... */
#define EDITER_LES_INDICES_DES_EXTREMA \
FAUX \
/* Doit-on editer les indices des extrema ('VRAI') ou bien les extrema eux-memes ('FAUX') ? */ \
/* Ceci a ete introduit le 20031129181516. */
#define EDITER_LA_DISTANCE_MINIMALE \
VRAI
#define EDITER_LA_DISTANCE_MAXIMALE \
VRAI
/* Afin de selectionner les distances minimale et maximale (introduit le 20031129181516). */
#define X_POINT_FIXE \
FZERO
#define Y_POINT_FIXE \
FZERO
#define Z_POINT_FIXE \
FZERO
/* Definition du point fixe {X0,Y0,Z0}. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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"
/* Passage a l'allocation dynamique le 20060214190645... */
#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. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* E D I T I O N D E S E X T R E M A : */
/* */
/*************************************************************************************************************************************/
#define EDITION_D_UNE_DISTANCE(editer,distance,indice) \
Bblock \
Test(IL_FAUT(editer)) \
Bblock \
Test(IL_FAUT(editer_les_indices_des_extrema)) \
Bblock \
CAL2(Prin1("%d\n",indice)); \
Eblock \
ATes \
Bblock \
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(distance); \
/* Introduit sous cette forme le 20160804095025... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition d'une distance (introduit le 20031130093153). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E S D I S T A N C E S D ' E N S E M B L E D E P O I N T S { X , Y , Z } */
/* A U N P O I N T F I X E { X0 , Y0 , Z0 } : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
#include xrv/ARITHMET.22.I"
#include xci/valeurs.03.I"
DEFV(Float,INIT(ponderation_de_la_distance_euclidienne
,PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE
)
);
DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE
)
);
/* Ponderation des differentes distances calculables (introduit le 20071025091825). */
/* On notera que cela pourrait faire disparaitre 'utiliser_la_distance_euclidienne', mais */
/* cet indicateur est conserve pour des raisons de compatibilite anterieure. Pour utiliser */
/* ces nouvelles ponderations, il faut que 'utiliser_la_distance_euclidienne' soit 'FAUX'... */
DEFV(Logical,INIT(utiliser_la_distance_euclidienne,UTILISER_LA_DISTANCE_EUCLIDIENNE));
/* Doit-on utiliser la distance euclidienne ('VRAI') ou celle dite "du chauffeur de taxi" */
/* ('FAUX') ? */
DEFV(Logical,INIT(editer_l_ensemble_des_distances,EDITER_L_ENSEMBLE_DES_DISTANCES));
/* Doit-on editer l'ensemble des distances ('VRAI') ou bien les extrema ('FAUX') ? Ceci a */
/* ete introduit le 20031129180830. */
DEFV(Logical,INIT(conserver_les_distances_nulles,CONSERVER_LES_DISTANCES_NULLES));
/* Doit-on editer conserver les distances nulles ('VRAI') ou bien les eliminer ('FAUX') ? */
/* Ceci a ete introduit le 20200419103352 afin de pouvoir les inverser ensuite... */
DEFV(Logical,INIT(editer_les_indices_des_extrema,EDITER_LES_INDICES_DES_EXTREMA));
/* Doit-on editer les indices des extrema ('VRAI') ou bien les extrema eux-memes ('FAUX') ? */
/* Ceci a ete introduit le 20031129181516. */
DEFV(Logical,INIT(editer_la_distance_minimale,EDITER_LA_DISTANCE_MINIMALE));
DEFV(Logical,INIT(editer_la_distance_maximale,EDITER_LA_DISTANCE_MAXIMALE));
/* Afin de selectionner les distances minimale et maximale (introduit le 20031129181516). */
DEFV(Float,INIT(coordonnee_X_point_fixe,X_POINT_FIXE));
DEFV(Float,INIT(coordonnee_Y_point_fixe,Y_POINT_FIXE));
DEFV(Float,INIT(coordonnee_Z_point_fixe,Z_POINT_FIXE));
/* Definition du point fixe {X0,Y0,Z0}. */
/*..............................................................................................................................*/
#include xrv/champs_5.1A.I"
/* Ceci fut introduit le 20070103173526... */
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
);
PROCESS_ARGUMENT_F("sphere=""distance_euclidienne=",ponderation_de_la_distance_euclidienne
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(utiliser_la_distance_euclidienne,FAUX);
Eblock
)
);
PROCESS_ARGUMENT_F("tmin=""tinf=""taxi_minimum=""taxi_inferieur="
,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(utiliser_la_distance_euclidienne,FAUX);
Eblock
)
);
PROCESS_ARGUMENT_F("tsup=""tmax=""taxi_maximum=""taxi_superieur="
,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(utiliser_la_distance_euclidienne,FAUX);
Eblock
)
);
PROCESS_ARGUMENT_F("tcum=""taxi_cumul=""tadd=",ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(utiliser_la_distance_euclidienne,FAUX);
Eblock
)
);
PROCESS_ARGUMENT_F("tmul=""taxi_multiplication=",ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(utiliser_la_distance_euclidienne,FAUX);
Eblock
)
);
/* Parametres introduits le 20071025091825... */
PROCESS_ARGUMENT_L("euclidienne=""euclide=",utiliser_la_distance_euclidienne
,BLOC(VIDE;)
,BLOC(Bblock
Test(IL_FAUT(utiliser_la_distance_euclidienne))
/* Ce test fut introduit le 20071025091825 pour garantir la compatibilite anterieure... */
Bblock
EGAL(ponderation_de_la_distance_euclidienne,FU);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee,FZERO);
Eblock
ATes
Bblock
EGAL(ponderation_de_la_distance_euclidienne,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure,FZERO);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee,FU);
EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee,FZERO);
Eblock
ETes
Eblock
)
);
GET_ARGUMENT_L("distances=",editer_l_ensemble_des_distances);
GET_ARGUMENT_N("extrema=",editer_l_ensemble_des_distances);
GET_ARGUMENT_L("conserver_distances_nulles=""cdn=",conserver_les_distances_nulles);
GET_ARGUMENT_N("eliminer_distances_nulles=""edn=",conserver_les_distances_nulles);
/* Parametres introduits le 20200419103352... */
GET_ARGUMENT_L("indices=",editer_les_indices_des_extrema);
GET_ARGUMENT_L("minimale=""min=",editer_la_distance_minimale);
GET_ARGUMENT_L("maximale=""max=",editer_la_distance_maximale);
GET_ARGUMENT_F("x=""X=""X0=",coordonnee_X_point_fixe);
GET_ARGUMENT_F("y=""Y=""Y0=",coordonnee_Y_point_fixe);
GET_ARGUMENT_F("z=""Z=""Z0=",coordonnee_Z_point_fixe);
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
/* Cette procedure fut introduite le 20070103173526... */
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
/* Cette procedure fut introduite le 20061226192507... */
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5;
/* Cette procedure fut introduite le 20211005105506... */
)
);
begin_nouveau_block
Bblock
DEFV(Int,INIT(indice_de_la_distance_minimale,UNDEF));
DEFV(Float,INIT(distance_minimale,F_INFINI));
DEFV(Int,INIT(indice_de_la_distance_maximale,UNDEF));
DEFV(Float,INIT(distance_maximale,F_MOINS_L_INFINI));
/* Afin de rechercher les distances extremales (introduit le 20031129181516)... */
gOPERATION_SUR_LES_FICHIERS(BLOC(
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. */
DEFV(Float,INIT(distance_courante,FLOT__UNDEF));
/* Definition de la "distance"... */
EGAL(distance_courante
,UdisF3D(coordonnee_X_point_fixe
,coordonnee_Y_point_fixe
,coordonnee_Z_point_fixe
,coordonnee_X
,coordonnee_Y
,coordonnee_Z
,ponderation_de_la_distance_euclidienne
,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
,ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
,ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
)
);
/* Et enfin, calcul de la "distance" du point courant {X,Y,Z} au point fixe {X0,Y0,Z0}. */
Test(IFLT(distance_courante,distance_minimale))
Bblock
EGAL(distance_minimale,distance_courante);
EGAL(indice_de_la_distance_minimale,index);
/* Memorisation de la distance minimale courante. On notera que le 'IFLT(...)' fait que */
/* si plusieurs points {X,Y,Z} sont a la meme distance minimale de {X0,Y0,Z0}, c'est le */
/* premier d'entre-eux dans la liste qui sera memorisee... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFGT(distance_courante,distance_maximale))
Bblock
EGAL(distance_maximale,distance_courante);
EGAL(indice_de_la_distance_maximale,index);
/* Memorisation de la distance maximale courante. On notera que le 'IFGT(...)' fait que */
/* si plusieurs points {X,Y,Z} sont a la meme distance maximale de {X0,Y0,Z0}, c'est le */
/* premier d'entre-eux dans la liste qui sera memorisee... */
Eblock
ATes
Bblock
Eblock
ETes
)
,distance_courante
,IFET(editer_l_ensemble_des_distances
,IFOU(IL_FAUT(conserver_les_distances_nulles)
,IFET(IL_NE_FAUT_PAS(conserver_les_distances_nulles)
,IZNE(distance_courante)
)
)
)
,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
);
/* Distance du point courant {X,Y,Z} au point fixe {X0,Y0,Z0}. */
Test(IL_FAUT(editer_l_ensemble_des_distances))
/* Test introduit le 20031129180830... */
Bblock
Eblock
ATes
Bblock
EDITION_D_UNE_DISTANCE(editer_la_distance_minimale,distance_minimale,indice_de_la_distance_minimale);
EDITION_D_UNE_DISTANCE(editer_la_distance_maximale,distance_maximale,indice_de_la_distance_maximale);
/* On notera le 20050128103332 que les deux distances extremales editees eventuellement */
/* ci-dessus sont les premieres trouvees dans le 'gOPERATION_SUR_LES_FICHIERS(...)' */
/* ci-dessus ce qui peut etre un peu ennuyeux au cas ou d'autres points {X,Y,Z} seraient */
/* aussi a ces memes distances extremales de {X0,Y0,Z0}. Dans le cas ou il serait */
/* necessaire de connaitre toutes ces distances "synonymes", il suffirait d'editer */
/* l'ensemble des distances (via 'IL_FAUT(editer_l_ensemble_des_distances)') et non plus les */
/* extrema, puis de proceder a un tri (via 'v $xrv/tri.11$K' avec "index=FAUX rang=FAUX") ; */
/* ensuite avec "$UNI -c", puis en recuperant la premiere et la derniere ligne on aura le */
/* nombre de points "synonymes" au niveau des distances... */
Eblock
ETes
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