#!/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