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