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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.