/*************************************************************************************************************************************/
/* */
/* C A L C U L D E S D I S T A N C E S E N T R E C O U P L E S D E P O I N T S */
/* { XA , YA , ZA } E T { XB , YB , ZB } : */
/* */
/* */
/* Author of '$xrv/distance.12$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20150710090312). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 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. */
/* 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') ? */
#define EDITER_LES_INDICES_DES_EXTREMA \
FAUX \
/* Doit-on editer les indices des extrema ('VRAI') ou bien les extrema eux-memes ('FAUX') ? */
#define EDITER_LA_DISTANCE_MINIMALE \
VRAI
#define EDITER_LA_DISTANCE_MAXIMALE \
VRAI
/* Afin de selectionner les distances minimale et maximale. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 XA_IMPLICITE \
FZERO
#define YA_IMPLICITE \
FZERO
#define ZA_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_XA,liste_initiale_des_XA);
gGENERATION_D_UN_FICHIER(fichier_LISTE_YA,liste_initiale_des_YA);
gGENERATION_D_UN_FICHIER(fichier_LISTE_ZA,liste_initiale_des_ZA);
/* Definition en memoire des fichiers de coordonnees cartesiennes. */
#define ELEMENT_DU_FICHIER_LISTE_XA(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_XA,index)
#define ELEMENT_DU_FICHIER_LISTE_YA(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_YA,index)
#define ELEMENT_DU_FICHIER_LISTE_ZA(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_ZA,index)
/* Acces a un element courant des fichiers de coordonnees cartesiennes. */
#define XB_IMPLICITE \
FZERO
#define YB_IMPLICITE \
FZERO
#define ZB_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_XB,liste_initiale_des_XB);
gGENERATION_D_UN_FICHIER(fichier_LISTE_YB,liste_initiale_des_YB);
gGENERATION_D_UN_FICHIER(fichier_LISTE_ZB,liste_initiale_des_ZB);
/* Definition en memoire des fichiers de coordonnees cartesiennes. */
#define ELEMENT_DU_FICHIER_LISTE_XB(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_XB,index)
#define ELEMENT_DU_FICHIER_LISTE_YB(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_YB,index)
#define ELEMENT_DU_FICHIER_LISTE_ZB(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_ZB,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 20160804095106... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition d'une distance. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E S D I S T A N C E S E N T R E C O U P L E S D E P O I N T S */
/* { XA , YA , ZA } E T { XB , YB , ZB } : */
/* */
/*************************************************************************************************************************************/
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. */
/* 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') ? */
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') ? */
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. */
/*..............................................................................................................................*/
#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_XA="
,fichier_LISTE_XA
,liste_initiale_des_XA
,XA_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_YA="
,fichier_LISTE_YA
,liste_initiale_des_YA
,YA_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_ZA="
,fichier_LISTE_ZA
,liste_initiale_des_ZA
,ZA_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_XB="
,fichier_LISTE_XB
,liste_initiale_des_XB
,XB_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_YB="
,fichier_LISTE_YB
,liste_initiale_des_YB
,YB_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_ZB="
,fichier_LISTE_ZB
,liste_initiale_des_ZB
,ZB_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
)
);
PROCESS_ARGUMENT_L("euclidienne=""euclide=",utiliser_la_distance_euclidienne
,BLOC(VIDE;)
,BLOC(Bblock
Test(IL_FAUT(utiliser_la_distance_euclidienne))
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("indices=",editer_les_indices_des_extrema);
GET_ARGUMENT_L("minimale=""min=",editer_la_distance_minimale);
GET_ARGUMENT_L("maximale=""max=",editer_la_distance_maximale);
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5;
/* Cette procedure fut introduite le 20211005105516... */
)
);
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... */
gOPERATION_SUR_LES_FICHIERS(BLOC(
DEFV(Float,INIT(coordonnee_XA,ELEMENT_DU_FICHIER_LISTE_XA(index)));
DEFV(Float,INIT(coordonnee_YA,ELEMENT_DU_FICHIER_LISTE_YA(index)));
DEFV(Float,INIT(coordonnee_ZA,ELEMENT_DU_FICHIER_LISTE_ZA(index)));
/* Recuperation des coordonnees {XA,YA,ZA} courantes dans les fichiers. */
DEFV(Float,INIT(coordonnee_XB,ELEMENT_DU_FICHIER_LISTE_XB(index)));
DEFV(Float,INIT(coordonnee_YB,ELEMENT_DU_FICHIER_LISTE_YB(index)));
DEFV(Float,INIT(coordonnee_ZB,ELEMENT_DU_FICHIER_LISTE_ZB(index)));
/* Recuperation des coordonnees {XA,YA,ZA} courantes dans les fichiers. */
DEFV(Float,INIT(distance_courante,FLOT__UNDEF));
/* Definition de la "distance"... */
EGAL(distance_courante
,UdisF3D(coordonnee_XA
,coordonnee_YA
,coordonnee_ZA
,coordonnee_XB
,coordonnee_YB
,coordonnee_ZB
,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 {XA,YA,ZA} au point fixe {XB,YB,ZB}. */
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 couples {XA,YA,ZA} et {XB,YB,ZB} sont a la meme distance minimale, 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 couples {XA,YA,ZA} et {XB,YB,ZB} sont a la meme distance maximale, c'est */
/* le premier d'entre-eux dans la liste qui sera memorisee... */
Eblock
ATes
Bblock
Eblock
ETes
)
,distance_courante
,editer_l_ensemble_des_distances
,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
);
/* Distance entre les deux points {XA,YA,ZA} et {XB,YB,ZB}. */
Test(IL_FAUT(editer_l_ensemble_des_distances))
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 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_ZB,ZB_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_YB,YB_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_XB,XB_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_ZA,ZA_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_YA,YA_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_XA,XA_IMPLICITE);
RETU_Commande;
Eblock
ECommande