#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         C O N V E R S I O N   D ' U N   F I C H I E R    D E   P O I N T S   N - D I M E N S I O N N E L S                          #
#         E N   U N   F I C H I E R   D E   P O I N T S   B I D I M E N S I O N N E L S  :                                            #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xrv/map_ND_2D.11$Z [<Fichier3DA>] [<Fichier2DR>] [<Isoles>] [<Axes>] [<Couleurs>] [<Z1>] [<ZN>] [<RayonA>]       #
#                                                                                                                                     #
#                                                                                                                                     #
#         Principe :                                                                                                                  #
#                                                                                                                                     #
#                     Ce programme permet de "mapper" un nuage de                                                                     #
#                   points appartenant a un espace N-dimensionnel                                                                     #
#                   dans un espace tridimensionnel. Cet espace                                                                        #
#                   est le produit d'un plan {OX,OY} par un axe 'OZ' :                                                                #
#                                                                                                                                     #
#                   1-l'axe 'OZ' porte le numero des points du nuage                                                                  #
#                   selon un ordre fixe prealablement (et arbitrairement                                                              #
#                   par rapport au processus de "mapping"),                                                                           #
#                                                                                                                                     #
#                   2-le plan {OX,OY} qui contient un faisceau de                                                                     #
#                   'N' droites concourantes (en 'O') et equireparties.                                                               #
#                   Chacune de ces droites correspond a l'un des 'N'                                                                  #
#                   axes de l'espace du nuage et sont appeles (ces axes                                                               #
#                   comme les droites {X0001,X0002,...,Xnnnn}. Un point                                                               #
#                   quelconque de coordonnnes {C0001,C0002,...,Cnnnn}                                                                 #
#                   dans l'espace a 'N' dimensions est alors represente                                                               #
#                   par le polygone obtenu en joignant le point de                                                                    #
#                   coordonnee 'C0001' sur l'axe 'X0001' au point de                                                                  #
#                   coordonnee 'C0002' sur l'axe 'X0002',... , jusqu'a                                                                #
#                   revenir au point de coordonnee 'C0001' sur l'axe 'X0001'                                                          #
#                   (afin d'obtenir un contour ferme...). Le "mapping"                                                                #
#                   des coordonnees N-dimensionnelles aux coordonnees                                                                 #
#                   bidimensionnelles du plan {OX,OY} est assure par le                                                               #
#                   programme 'v $xrv/map_ND_2D.11$K'.                                                                                #
#                                                                                                                                     #
#                                                                                                                                     #
#                     En prenant un exemple avec N=3, visualisons ainsi                                                               #
#                   le point de coordonnees {C0001,C0002,C0003} (en ne                                                                #
#                   respectant pas l'equirepartition des trois axes comme                                                             #
#                   cela est ecrit ci-dessus -il devrait y avoir pi/3                                                                 #
#                   entre chaque axe dans cet exemple-) :                                                                             #
#                                                                                                                                     #
#                                                                                                                                     #
#                                           X0003 +                                       + X0002                                     #
#                                                   +                                   +                                             #
#                                                     +                               +                                               #
#                                                       +                           # C0002                                           #
#                                                         +                       + */*                                               #
#                                                           +                   +   *///*                                             #
#                                                             +               +     */////*                                           #
#                                                               +           +       *///////*                                         #
#                                                                 +       +         */////////*                                       #
#                                                                   +   +           *///////////*                                     #
#                                       - - - - - - - - - - - - - - - O + + + + + + +/+/+/+/+/+/+/# + + + X0001                       #
#                                                                   -   -           */////////C0001                                   #
#                                                                 -       -         */////////*                                       #
#                                                               -           -       *///////*                                         #
#                                                             -               -     */////*                                           #
#                                                           -                   -   *///*                                             #
#                                                         -                       - */*                                               #
#                                                       -                           # C0003                                           #
#                                                     -                               -                                               #
#                                                   -                                   -                                             #
#                                                 -                                       -                                           #
#                                                                                                                                     #
#                                                                                                                                     #
#                   en supposant ici que :                                                                                            #
#                                                                                                                                     #
#                                       C0001 > 0                                                                                     #
#                                       C0002 > 0                                                                                     #
#                                       C0003 < 0                                                                                     #
#                                                                                                                                     #
#                   et que :                                                                                                          #
#                                                                                                                                     #
#                                       |C0003| = |C0002|                                                                             #
#                                                                                                                                     #
#                   tout cela pour simplifier. Enfin les "+" et les "-"                                                               #
#                   materialisent respectivement les parties positives                                                                #
#                   et negatives des axes.                                                                                            #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xrv/map_ND_2D.11$Z' :                                                                                           #
#                                                                                                                                     #
#                     Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

GetArg    Fichier3DA=$xT/Fichier3DA                                                                                                     \
          Fichier2DR=$xT/Fichier2DR                                                                                                     \
          Isoles=VRAI                                                                                                                   \
          Axes=VRAI                                                                                                                     \
          Couleurs=FAUX                                                                                                                 \
          Z1="$K_VIDE"                                                                                                                  \
          ZN="$K_VIDE"                                                                                                                  \
          RayonA=0.01125
                                        # Isoles          : permet de selectionner entre le mode "points isoles" ('VRAI') ou bien     #
                                        #                   prepaper le chainage des points isoles par '$xrv/particule.10$K' dans     #
                                        #                   '$xrv/points_3D.11$Z'.                                                    #
                                        #                                                                                             #
                                        # Axes            : permet de materialiser a priori les axes de coordonnees N-dimensionnels.  #
                                        #                                                                                             #
                                        # Couleurs        : permet de generer automatiquement {ROUGE,VERTE,BLEUE} si besoin est...    #
                                        #                                                                                             #
                                        # {Z1,ZN}         : definit eventuellement l'axe 'OZ'.                                        #
                                        #                                                                                             #
                                        # RayonA          : definition de la taille des spheres materialisant les axes (ATTENTION,    #
                                        #                   avant le 19971113103239, la valeur 0.030 etait utilisee).                 #

if        (-e $Fichier3DA) then
          if        (! -e $Fichier2DR) then
                    source    $xrv/map_ND_2D.11$Y
                                        # Definition de la representation des axes (lorsque '$Isoles' est 'FAUX').                    #

                    FileTmpB  nomTA

                    FileTmpB  nomT1
                    FileTmpB  nomT2
                    FileTmpB  nomT3
                    FileTmpB  nomT4
                    FileTmpB  nomT5
                    FileTmpB  nomT6
                    FileTmpB  nomT7

                    FileTmpB  nomTR
                    FileTmpB  nomTV
                    FileTmpB  nomTB
                                        # Creation de noms temporaires.                                                               #

                    set       AxeX="X0001"
                    set       AxeY="X0002"
                    set       AxeZ="X0003"
                                        # Definition d'une version "traditionnelle" de {X0001,X0002,X0003} sous la forme {X,Y,Z}.     #

                    $CA       $Fichier3DA                                                                                               \
                                        |  $SE       -e '/^ *$/d'                                                                       \
                                                     -e "s/X\(=\)/$AxeX\1/g"                                                            \
                                                     -e "s/Y\(=\)/$AxeY\1/g"                                                            \
                                                     -e "s/Z\(=\)/$AxeZ\1/g"                                                            \
                                                                                          >   $nomTA
                                        # Nettoyage du fichier Argument et mise sous la forme "standard" de {X,Y,Z} eventuellement.   #

                    set       Point1=1
                    set       Npoints3D=`$WC $nomTA`
                    set       Npoints3D=$Npoints3D[$WC1]
                                        # Nombre de points N-dimensionnels. Chacun d'entre-eux occupe une ligne du fichier            #
                                        # '$Fichier3DA' et aura en general la forme :                                                 #
                                        #                                                                                             #
                                        #                   X=... Y=... Z=... [RAYON=...] [ROUGE=...] [VERTE=...] [BLEUE=...]         #
                                        #                                                                                             #
                                        # ou sous la forme :                                                                          #
                                        #                                                                                             #
                                        #                   X0001=... X0002=... [...] [RAYON=...] [ROUGE=...] [VERTE=...] [BLEUE=...] #
                                        #                                                                                             #

                    $CA       $nomTA                                                                                                    \
                                        |  $SE       -e "s/X[0-9][0-9]*=\([^ ][^ ]*\)/\1/g"                                             \
                                                     -e "s/[^ ][^ ]*=[^ ][^ ]*//g"                                                      \
                                        |  $R       "$K_BLANC" "$K_NL"                                                                  \
                                        |  $SE       -e '/^ *$/d'                                                                       \
                                                                                          >   $nomT2

                    set       Nombre=`$WC $nomT2`
                    set       Nombre=$Nombre[$WC1]
                                        # Nombre d'elements sur lesquels rechercher les extrema...                                    #

                    if        (("$Z1" == "$K_VIDE") || ("$ZN" == "$K_VIDE")) then
                    set  MinimumXYZ=`$xrv/extrema.01$X ne=$Nombre fichier=$nomT2 |& $GRE "^minimum *=" | $SE -e 's/^.*\([-+].*\)$/\1/'`
                    set  MaximumXYZ=`$xrv/extrema.01$X ne=$Nombre fichier=$nomT2 |& $GRE "^maximum *=" | $SE -e 's/^.*\([-+].*\)$/\1/'`
                    else
                    endif

                    set  ModuleXYZ=`$xrv/extrema.01$X ne=$Nombre fichier=$nomT2 |& $GRE "^module *=" | $SE -e 's/^.*\([-+].*\)$/\1/'`
                                        # Recherche des extrema globaux de {X,Y,Z} afin de definir a priori {Z1,ZN}.                  #

                    if        ("$Z1" == "$K_VIDE") then
                              set       Z1=$MinimumXYZ
                    else
                    endif

                    if        ("$ZN" == "$K_VIDE") then
                              set       ZN=$MaximumXYZ
                    else
                    endif

                    set       CoordoonnesZ="`$xci/valeurs_inte$X premiere=$Point1 derniere=$Npoints3D cubique=FAUX vD=$Z1 vA=$ZN`"
                                        # Generation de la liste des coordonnees 'Z' de mise dans des plans {OX,OY} differents        #
                                        # pour chaque point N-dimensionnel Argument.                                                  #

                    $DELETE   $nomT2

                    set       Liste="`$xci/nombres$X premiere=$Point1 derniere=$Npoints3D`"

                    set       Numerotage=4
                                        # Nombre de chiffres utiles pour numeroter les differents points N-dimensionnels.             #

                    if        ($Couleurs == VRAI) then
                              set       Ra_prioriB=$GRIS_2
                              set       Ra_prioriG=$GRIS_6
                              set       Va_prioriB=$GRIS_2
                              set       Va_prioriG=$GRIS_6
                              set       Ba_prioriB=$GRIS_2
                              set       Ba_prioriG=$GRIS_6
                                        # Parametrage du generateur de couleurs.                                                      #

                              set                            Angle=`$xcg/MUL2.01$X nombre_1=1.0 nombre_2=$dpi`
                              $xci/valeurs_trig$X            premiere=$Point1 derniere=$Npoints3D                                       \
                                                             aD=0 aA=$Angle                                                             \
                                                             alpha=0 beta=$Ra_prioriB gamma=$Ra_prioriG                                 \
                                                             entiers=VRAI                                                               \
                                                  |  $SE       -e "s/^/ROUGE=/"                                                         \
                                                                                                                        >>! $nomTR

                              set                            Angle=`$xcg/MUL2.01$X nombre_1=2.0 nombre_2=$dpi`
                              $xci/valeurs_trig$X            premiere=$Point1 derniere=$Npoints3D                                       \
                                                             aD=0 aA=$Angle                                                             \
                                                             alpha=0 beta=$Va_prioriB gamma=$Va_prioriG                                 \
                                                             entiers=VRAI                                                               \
                                                  |  $SE       -e "s/^/VERTE=/"                                                         \
                                                                                                                        >>! $nomTV

                              set                            Angle=`$xcg/MUL2.01$X nombre_1=3.0 nombre_2=$dpi`
                              $xci/valeurs_trig$X            premiere=$Point1 derniere=$Npoints3D                                       \
                                                             aD=0 aA=$Angle                                                             \
                                                             alpha=0 beta=$Ba_prioriB gamma=$Ba_prioriG                                 \
                                                             entiers=VRAI                                                               \
                                                  |  $SE       -e "s/^/BLEUE=/"                                                         \
                                                                                                                        >>! $nomTB

                              $PAST     $nomTA $nomTR $nomTV $nomTB                                                                     \
                                                                                                    >   $nomT2

                              $DELETE   $nomTR
                              $DELETE   $nomTV
                              $DELETE   $nomTB
                    else
                              $CA       $nomTA                                                                                          \
                                                                                                    >   $nomT2
                    endif

                    $CA       $nomT2                                                                                                    \
                                        |  $NL       -nrz -w$Numerotage                                                                 \
                                        |  $R        "$K_TAB" "$K_BLANC"                                                                \
                                                                                          >   $nomT1

                    $DELETE   $nomT2

                    foreach   nPoint3D  ($Liste)
                              set       Point3D=`$CA $nomT1 | $GRE "^$nPoint3D " | $SE -e "s/^$nPoint3D //"`
                                        # Recuperation du point N-dimensionnel courant.                                               #

                              $DELETE   $nomT2

                              echo      $Point3D                                                                                        \
                                                  |  $R        "$K_BLANC" "$K_NL"                                                       \
                                                  |  $SOR      -u                                                                       \
                                                  |  $SE       -e "s/X[0-9][0-9]*=\([^ ][^ ]*\)/\1/g"                                   \
                                                               -e "s/[^ ][^ ]*=[^ ][^ ]*//g"                                            \
                                                  |  $SE       -e '/^ *$/d'                                                             \
                                                                                                    >   $nomT2

                              set       Dimension=`$WC $nomT2`
                              set       Dimension=$Dimension[$WC1]
                                        # Dimension de l'espace auquel appartient le point courant.                                   #

                              if        (($Isoles == VRAI) || ($Axes == FAUX)) then
                                        # Cas ou l'on ne materialise pas les axes...                                                  #
                              else
                                        set       RayonA_reel=`$xcg/MUL2.01$X nombre_1=$RayonA nombre_2=$ModuleXYZ`
                                        set       InformationsAN="RAYON=$RayonA_reel ROUGE=$RaxesN VERTE=$VaxesN BLEUE=$BaxesN"
                                        set       InformationsAP="RAYON=$RayonA_reel ROUGE=$RaxesP VERTE=$VaxesP BLEUE=$BaxesP"
                                        set       ExtensionA=`$xcg/MUL2.01$X nombre_1=$FExtensionA nombre_2=$ModuleXYZ`
                                        # Definition des axes de coordonnees.                                                         #

                                        set       Separateur=":"
                                        # Definition d'un separateur destine a deconcatener la partie 'Negative' de la partie         #
                                        # 'Positive' des axes sur deux lignes differentes...                                          #

                                        repeat    $Dimension          echo "$ExtensionA"                                                \
                                                                                                              >   $nomT5
                                        # Generation d'un point auxiliaire destine a definir la representation des axes               #
                                        # N-dimensionnels dans le plan {X,Y}.                                                         #

                                        $xrv/map_ND_2D.11$X           nd=$Dimension fichier=$nomT5                                      \
                                                                      echelle=-1                                                        \
                                                                      tridimensionnel=VRAI Z=$CoordoonnesZ[$nPoint3D]                   \
                                                                      editer=VRAI informations="$InformationsAN"                        \
                                                                                          |& $SE      -f $xrv/supATTENTION$sed          \
                                                                                                      -e "s/^axe=[0-9]*  *//"           \
                                                                                                      -e 's/$/'"$Separateur/"           \
                                                                                                              >>! $nomT6
                                        # Generation des extremites negatives ("echelle=-1") de la representation des axes.           #
                                        $xrv/map_ND_2D.11$X           nd=$Dimension fichier=$nomT5                                      \
                                                                      echelle=+1                                                        \
                                                                      tridimensionnel=VRAI Z=$CoordoonnesZ[$nPoint3D]                   \
                                                                      editer=VRAI informations="$InformationsAP"                        \
                                                                                          |& $SE      -f $xrv/supATTENTION$sed          \
                                                                                                      -e "s/^axe=[0-9]*  *//"           \
                                                                                                              >>! $nomT7
                                        # Generation des extremites positives ("echelle=+1") de la representation des axes.           #

                                        $PAST                         $nomT6 $nomT7                                                     \
                                                                                          |  $R       "$K_TAB" "$K_BLANC"               \
                                                                                          |  $R       "$Separateur" "$K_NL"             \
                                                                                          |  $SE      -e "s/^ *//"                      \
                                                                                                              >>! $Fichier2DR
                                        # Generation des couples d'extremites {negatives,positives} de la representation des axes.    #

                                        $DELETE   $nomT5
                                        $DELETE   $nomT6
                                        $DELETE   $nomT7
                              endif

                              set       Informations="$Point3D"
                              set       Informations=`echo $Informations | $SE -e "s/X[0-9][0-9]*=\([^ ][^ ]*\)//g"`
                              set       Informations=`echo $Informations | $SE -e "s/^ *//"`
                                        # Recuperation des informations autres que {X,Y,Z} relatives au point N-dimensionnel.         #

                              $xrv/map_ND_2D.11$X           nd=$Dimension fichier=$nomT2                                                \
                                                            echelle=+1                                                                  \
                                                            tridimensionnel=VRAI Z=$CoordoonnesZ[$nPoint3D]                             \
                                                            editer=VRAI informations="$Informations"                                    \
                                                                                |& $SE      -f $xrv/supATTENTION$sed                    \
                                                                                            -e "s/^axe=[0-9]*  *//"                     \
                                                                                                    >   $nomT3
                                        # Generation incrementale du fichier des "tri-points" bidimensionnels.                        #

                              if        ($Isoles == VRAI) then
                                        $CA       $nomT3                                                                                \
                                                                                                              >>! $Fichier2DR
                                        # Generation finale du fichier des "tri-points" bidimensionnels de type "isoles".             #
                              else
                                        $CA       $nomT3                                                                                \
                                                            |  $AW       ' { print $0 "\n" $0 } '                                       \
                                                                                                              >   $nomT4
                                        decaleC   $nomT4 1
                                        $CA       $nomT4                                                                                \
                                                                                                              >>! $Fichier2DR
                                        # Generation finale du fichier des "tri-points" bidimensionnels de type "pre-chaines"         #
                                        # utilisables par '$xrv/particule.10$K' dans '$xrv/points_3D.11$Z'.                           #

                                        $DELETE   $nomT4
                              endif

                              $DELETE   $nomT2
                              $DELETE   $nomT3
                    end

                    FileTmpE  nomTA

                    FileTmpE  nomT1
                    FileTmpE  nomT2
                    FileTmpE  nomT3
                    FileTmpE  nomT4
                    FileTmpE  nomT5
                    FileTmpE  nomT6
                    FileTmpE  nomT7

                    FileTmpE  nomTR
                    FileTmpE  nomTV
                    FileTmpE  nomTB
                                        # Nettoyage a posteriori...                                                                   #
          else
                    EROR      "Le fichier '$Fichier2DR' des points bidimensionnels existe deja."
          endif
else
          EROR      "Le fichier '$Fichier3DA' des points N-dimensionnels n'existe pas."
endif



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.