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