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