/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A R R A N G E M E N T   H A R M O N I E U X   D E   P O I N T S   S U R   L A   S P H E R E                                */
/*        A V E C   T E S T   D E   P L U S I E U R S   C O N D I T I O N S   I N I T I A L E S   D I F F E R E N T E S  :           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Ce programme a ete construit a partir                                                                          */
/*                  de 'v $xtc/PtsSphere.02$c'...                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xtc/PtsSphere.12$c' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20080316101146).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*                                                                                                                                   */
/*                  $Z        alias     distances 'set       NuMeRo=\!*                                                      ;    \\ */
/*                  $Z                             set       FiChIeR=$xTG/XYZ                                                ;    \\ */
/*                  $Z                             $DELETE   $FiChIeR.$NuMeRo*                      >& $nul                  ;    \\ */
/*                  $Z                             (listMN    $FiChIeR :Debut_listG_XYZ_$NuMeRo"": :Fin_listG_XYZ_$NuMeRo"":)     \\ */
/*                  $Z                                                                              >  $FiChIeR.$NuMeRo      ;    \\ */
/*                  $Z                   $CA       $FiChIeR.$NuMeRo | $AW '"'"'{ print $1 }'"'"' >  $FiChIeR.$NuMeRo$COORD_X ;    \\ */
/*                  $Z                   $CA       $FiChIeR.$NuMeRo | $AW '"'"'{ print $2 }'"'"' >  $FiChIeR.$NuMeRo$COORD_Y ;    \\ */
/*                  $Z                   $CA       $FiChIeR.$NuMeRo | $AW '"'"'{ print $3 }'"'"' >  $FiChIeR.$NuMeRo$COORD_Z ;    \\ */
/*                  $Z                             $xrv/optimise.02$X ne=0 cartesiennesA=VRAI uniquement_matrice_distances=VRAI   \\ */
/*                  $Z                                        Valider_noms_relatifs=FAUX                                          \\ */
/*                  $Z                                        LISTE_X=$FiChIeR.$NuMeRo$COORD_X                                    \\ */
/*                  $Z                                        LISTE_Y=$FiChIeR.$NuMeRo$COORD_Y                                    \\ */
/*                  $Z                                        LISTE_Z=$FiChIeR.$NuMeRo$COORD_Z      >& $FiChIeR.$NuMeRo.dist ;    \\ */
/*                  $Z                   echo      "=================== $NuMeRo"                                             ;    \\ */
/*                  $Z                   $CA       $FiChIeR.$NuMeRo $FiChIeR.$NuMeRo.dist                                    ;    \\ */
/*                  $Z                             unset     NuMeRo FiChIeR'                                                         */
/*                                                                                                                                   */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    L'usage sera ensuite le suivant.                                                                               */
/*                  On fera :                                                                                                        */
/*                                                                                                                                   */
/*                                      $xtc/$aPout                                                 >& $xTG/XYZ                      */
/*                                                                                                                                   */
/*                                      listG     $xtc/PtsSphere.12$c :Debut_listG: :Fin_listG:                                      */
/*                                                                                                                                   */
/*                  puis un "copier-coller" de la sortie du                                                                          */
/*                  'listG' ci-dessus...                                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#include  "INCLUDES.01.I"

extern    double    drand48();
extern    double    srand48();

#define   NOMBRE_DE_POINTS                                                                                                              \
                    26

#define   NOMBRE_D_ENSEMBLES_A_GENERER                                                                                                  \
                    1
#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    1000000

#define   RAYON_DE_LA_SPHERE_UNITE                                                                                                      \
                    1.0
                                        /* Definition de la sphere unite.                                                            */
#define   PONDERATION_0                                                                                                                 \
                    0.010
#define   PONDERATION_N                                                                                                                 \
                    (1.0*(1/(double)NOMBRE_D_ITERATIONS))
                                        /* Definition de l'interpolation...                                                          */

#define   RANDOM(inf,sup)                                                                                                               \
                    ((((sup)-(inf))*drand48())+(inf))

#define   DISTANCE_1(dx,dy,dz)                                                                                                          \
                    sqrt(EXP2(dx)+EXP2(dy)+EXP2(dz))
#define   DISTANCE_2(dx,dy,dz)                                                                                                          \
                    (EXP2(dx)+EXP2(dy)+EXP2(dz))
                                        /* On notera que l'usage 'sqrt(...)' n'est utile que pour 'normalisation(...)', par contre   */
                                        /* losrqu'il s'agit uniquement de rechercher les distances extremales, on peut s'en passer   */
                                        /* et ainsi, aller deux fois plus vite...                                                    */

typedef   struct
          {
          double    x,y,z;
          }         points;

void      normalisation(point)
points    *point;
          {
          double    module=DISTANCE_1(point->x,point->y,point->z);

          point->x = RAYON_DE_LA_SPHERE_UNITE*((point->x)/module);
          point->y = RAYON_DE_LA_SPHERE_UNITE*((point->y)/module);
          point->z = RAYON_DE_LA_SPHERE_UNITE*((point->z)/module);
          }

#define   TROUVER(chercher_la_distance_extremale,distance_extremale,OPERATEUR,indice_i,indice_j,distance_extremale_trouvee)             \
                    {                                                                                                                   \
                    if        (chercher_la_distance_extremale == VRAI)                                                                  \
                              {                                                                                                         \
                              if        (distance OPERATEUR distance_extremale)                                                         \
                                        {                                                                                               \
                                        distance_extremale = distance;                                                                  \
                                                                                                                                        \
                                        indice_i = i;                                                                                   \
                                        indice_j = j;                                                                                   \
                                                                                                                                        \
                                        distance_extremale_trouvee = VRAI;                                                              \
                                        /* Recherche de la distance extremale.                                                       */ \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        }                                                                                               \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              }                                                                                                         \
                    }

#define   AUGMENTATION(distance_extremale_trouvee,indice_i,indice_j)                                                                    \
                    {                                                                                                                   \
                    if        (distance_extremale_trouvee == VRAI)                                                                      \
                              {                                                                                                         \
                              double    dX=ponderation*(ListePoints[indice_j].x - ListePoints[indice_i].x);                             \
                              double    dY=ponderation*(ListePoints[indice_j].y - ListePoints[indice_i].y);                             \
                              double    dZ=ponderation*(ListePoints[indice_j].z - ListePoints[indice_i].z);                             \
                                                                                                                                        \
                              ListePoints[indice_j].x = ListePoints[indice_j].x + dX;                                                   \
                              ListePoints[indice_j].y = ListePoints[indice_j].y + dY;                                                   \
                              ListePoints[indice_j].z = ListePoints[indice_j].z + dZ;                                                   \
                              normalisation(&ListePoints[indice_j]);                                                                    \
                                        /* Augmentation de la distance {indice_i,indice_j}.                                          */ \
                                                                                                                                        \
                              ListePoints[indice_i].x = ListePoints[indice_i].x - dX;                                                   \
                              ListePoints[indice_i].y = ListePoints[indice_i].y - dY;                                                   \
                              ListePoints[indice_i].z = ListePoints[indice_i].z - dZ;                                                   \
                              normalisation(&ListePoints[indice_i]);                                                                    \
                                        /* Augmentation de la distance {indice_i,indice_j}.                                          */ \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              }                                                                                                         \
                    }

main()
          {
          int       compatibilite_20080319100918=0;
          int       chercher_la_distance_minimale=VRAI;
          int       chercher_la_distance_maximale=VRAI;
                                        /* Indicateurs de controle divers...                                                         */

          int       g,n,p;
                                        /* Index divers...                                                                           */

          points    ListePoints[NOMBRE_DE_POINTS];

          if        (compatibilite_20080319100918 == 1)
                    {
                    }
          else
                    {
                    long int  graine=1;
                                        /* Il semblerait qu'utiliser une graine nulle soit une mauvaise idee comme cela se voit      */
                                        /* avec N=19...                                                                              */
                    srand48(graine);
                                        /* Introduit le 20080319100918 car, en effet, manquait...                                    */
                    }

          for       (p=0 ; p<NOMBRE_DE_POINTS ; p++)
                    {
                    ListePoints[p].x = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE);
                    ListePoints[p].y = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE);
                    ListePoints[p].z = RANDOM(-RAYON_DE_LA_SPHERE_UNITE,+RAYON_DE_LA_SPHERE_UNITE);
                                        /* Initialisation aleatoire du nuage de points a l'interieur du cube dans lequel la sphere   */
                                        /* unite est inscrite.                                                                       */

                    normalisation(&ListePoints[p]);
                                        /* Mise du nuage de points sur la surface de la sphere unite.                                */
                    }

          for       (g=1 ; g<=NOMBRE_D_ENSEMBLES_A_GENERER ; g++)
                    {
                    for       (n=1 ; n<=NOMBRE_D_ITERATIONS ; n++)
                              {
                              int       i,j;

                              int       distance_minimale_trouvee=FAUX;
                              double    distance_minimale=+1000;
                              int       min_i,min_j;

                              int       distance_maximale_trouvee=FAUX;
                              double    distance_maximale=-1000;
                              int       max_i,max_j;

                              double    ponderation=((double)((PONDERATION_0*(NOMBRE_D_ITERATIONS-n))+(PONDERATION_N*(n-1))))
                                                    /((double)(NOMBRE_D_ITERATIONS-1)
                                                     );

                              for       (i=0 ; i<NOMBRE_DE_POINTS ; i++)
                                        {
                                        for       (j=i+1 ; j<NOMBRE_DE_POINTS ; j++)
                                                  {
                                                  double    distance=DISTANCE_2(ListePoints[i].x-ListePoints[j].x
                                                                               ,ListePoints[i].y-ListePoints[j].y
                                                                               ,ListePoints[i].z-ListePoints[j].z
                                                                                );

                                                  TROUVER(chercher_la_distance_minimale
                                                         ,distance_minimale
                                                         ,<
                                                         ,min_i,min_j
                                                         ,distance_minimale_trouvee
                                                          );

                                                  TROUVER(chercher_la_distance_maximale
                                                         ,distance_maximale
                                                         ,>
                                                         ,max_i,max_j
                                                         ,distance_maximale_trouvee
                                                          );
                                                  }
                                        }

                              AUGMENTATION(distance_minimale_trouvee,min_i,min_j);
                                        /* Augmentation de la distance minimale.                                                     */

                              AUGMENTATION(distance_maximale_trouvee,max_i,max_j);
                                        /* Augmentation (et non pas diminution !) de la distance maximale.                           */
                              }

                    printf(":Debut_listG_XYZ_%08d:\n",g);

                    for       (p=0 ; p<NOMBRE_DE_POINTS ; p++)
                              {
                              printf("%+.16f %+.16f %+.16f\n",ListePoints[p].x,ListePoints[p].y,ListePoints[p].z);
                                        /* Edition des coordonees {X,Y,Z} resultantes...                                             */
                              }

                    printf(":Fin_listG_XYZ_%08d:\n",g);
                    }

          for       (g=1 ; g<=NOMBRE_D_ENSEMBLES_A_GENERER ; g++)
                    {
                    printf("distances %08d\n",g);
                    }
          }



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