#######################################################################################################################################
#                                                                                                                                     #
#         C A L C U L   D E   L A                                                                                                     #
#         D E F I N I T I O N   D ' U N   O R N E M E N T   D E   Y O U R T E   F U N E R A I R E                                     #
#         E N   V E R S I O N   R E C U R S I V E  :                                                                                  #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xiirf/.YOUF.31.2.$U' :                                                                                          #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, 20070724123128).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

$Z   set       PReFeReNcE=`$CA $FPoint1.ancrage | $NL | $R "$K_TAB" "$K_BLANC" | $GRE " $NEXIST"'$' | $HEA -1 | $AW ' { print $1 } '`
$Z                                      # Parametre introduit le 20070724123128 et definissant le point de reference. Celui-ci est    #
$Z                                      # le premier point a l'etat '$NEXIST' dans la liste '$FPoint1.ancrage'.                       #
$Z                  if        ("$PReFeReNcE" == "$K_VIDE") then
$Z                            EROR      "Le point de reference n'a pu etre defini, on prend le premier point de la liste 'ancrage'."
$Z                            set       PReFeReNcE=1
$Z                                      # On force la valeur '1' au cas ou il n'y aurait aucun point a l'etat '$NEXIST' dans la liste #
$Z                                      # '$FPoint1.ancrage'...                                                                       #
$Z                  else
$Z                  endif

$Z                  FileTmpB  FPointN
$Z                                      # Definition du "premier etage" (et qui sera ensuite cumule aux etages superieurs au cours    #
$Z                                      # des iterations) tel qu'il est pret a etre visualise :                                       #

$Z                  set       NPoInTsE=`$CA $FPoint1.exemplaires | $WCl`

$Z                  alias     genere2   'set       FiChIeR1=\!:1 ; set FiChIeR2=\!:2                                              ;    \\
$Z                                       $xrv/duplique.01$X                                                                            \\
$Z                                                           ne=$NPoInTsE                                                              \\
$Z                                                           fichier=$FiChIeR1                                                         \\
$Z                                                           exemplaires=$FPoint1.exemplaires                                          \\
$Z                                                                                                  >   $FiChIeR2                 ;    \\
$Z                                       unset     FiChIeR1 FiChIeR2'
$Z                                      # Alias introduit le 20070724102131...                                                        #

$Z                  genere2   $FPoint1$COORD_X    $FPointN$COORD_X
$Z                  genere2   $FPoint1$COORD_Y    $FPointN$COORD_Y
$Z                  genere2   $FPoint1.d$COORD_X  $FPointN.d$COORD_X
$Z                  genere2   $FPoint1.d$COORD_Y  $FPointN.d$COORD_Y
$Z                  genere2   $FPoint1.rayon      $FPointN.rayon

$Z                  set       ReDuCtIoN=`calculNS 1/$_____Reduction`
$Z                                      # Reduction courante...                                                                       #

$Z                  set       NEtAgEs=$_____Etages
$Z                                      # Nombre d'etages...                                                                          #

$Z                  set       PaRaMeTrEs_R1="$K_VIDE"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" LISTE_Z=$_____Z0"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" transformation_autosimilaire=VRAI"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" transformation_quelconque=VRAI"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" a11=`calculNS 1/$_____Reduction`"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" a22=`calculNS 1/$_____Reduction`"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" SELECTION_ANCRAGE=$FPoint1.ancrage"
$Z                  set       PaRaMeTrEs_R1="$PaRaMeTrEs_R1"" SELECTION_A_ANCRER=$FPoint1.ancrer"

$Z                  set       PaRaMeTrEs_R2="$K_VIDE"
$Z                  set       PaRaMeTrEs_R2="$PaRaMeTrEs_R2"" DUPLIQUER_VALEUR=$FPoint1.dupliquer"

$Z                  set       PaRaMeTrEs_R3="$K_VIDE"
$Z                  set       PaRaMeTrEs_R3="$PaRaMeTrEs_R3"" DUPLIQUER_VALEUR=$NEXIST"

$Z                  while     ($NEtAgEs > 0)
$Z                            set       xP1_CoUrAnT=`$CA $FPoint1$COORD_X`
$Z                            set       xP1_CoUrAnT=$xP1_CoUrAnT[$PReFeReNcE]
$Z                            set       yP1_CoUrAnT=`$CA $FPoint1$COORD_Y`
$Z                            set       yP1_CoUrAnT=$yP1_CoUrAnT[$PReFeReNcE]
$Z                                      # Le point de reference est initialement le point 'P1_'...                                    #

$Z                            set       TrAnSlAtIoN_X=`calculNS -($xP1_CoUrAnT*(1/$_____Reduction))`
$Z                            set       TrAnSlAtIoN_Y=`calculNS -($yP1_CoUrAnT*(1/$_____Reduction))`
$Z                                      # Translation des etages apres reduction...                                                   #

$Z                            set       NPoInTs1X=`$CA $FPoint1$COORD_X | $WCl`
$Z                            set       NPoInTs1Y=`$CA $FPoint1$COORD_Y | $WCl`
$Z                            set       NPoInTs1=`$xcg/MIN2.01$X x=$NPoInTs1X y=$NPoInTs1Y`

$Z                            set       PaRaMeTrEs_R4="$K_VIDE"
$Z                            set       PaRaMeTrEs_R4="$PaRaMeTrEs_R4"" tX=$TrAnSlAtIoN_X tY=$TrAnSlAtIoN_Y"
$Z                            set       PaRaMeTrEs_R4="$PaRaMeTrEs_R4"" alphaX=1 alphaY=1"

$Z                            set       PaRaMeTrEs_R5="$K_VIDE"
$Z                            set       PaRaMeTrEs_R5="$PaRaMeTrEs_R5"" tX=0 tY=0"
$Z                            set       PaRaMeTrEs_R5="$PaRaMeTrEs_R5"" alphaX=0 alphaY=0"

$Z                            FileTmpB  FPoint2
$Z                                      # Definition des etages superieurs...                                                         #

$Z                            set       PaRaMeTrEs_R6="$K_VIDE"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" ne=$NPoInTs1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_X=$FPoint1$COORD_X"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_Y=$FPoint1$COORD_Y"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R4"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" px=1 py=0 pz=0"
$Z                                      # Introduit le 20070724114019...                                                              #

$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R2                                                                        \
$Z                                                                                        >>! $FPointN$COORD_X
$Z                                      # Construction progressive des fichiers '$FPointN' a visualiser par '$xrv/particule.10$X'.    #
$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R3                                                                        \
$Z                                                                                        >   $FPoint2$COORD_X
$Z                                      # Definition du prochain etage a "multiplier" autosimilairement.                              #

$Z                            set       PaRaMeTrEs_R6="$K_VIDE"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" ne=$NPoInTs1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_X=$FPoint1$COORD_X"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_Y=$FPoint1$COORD_Y"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R4"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" px=0 py=1 pz=0"
$Z                                      # Introduit le 20070724114019...                                                              #

$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R2                                                                        \
$Z                                                                                        >>! $FPointN$COORD_Y
$Z                                      # Construction progressive des fichiers '$FPointN' a visualiser par '$xrv/particule.10$X'.    #
$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R3                                                                        \
$Z                                                                                        >   $FPoint2$COORD_Y
$Z                                      # Definition du prochain etage a "multiplier" autosimilairement.                              #

$Z                            set       PaRaMeTrEs_R6="$K_VIDE"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" ne=$NPoInTs1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_X=$FPoint1.d$COORD_X"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_Y=$FPoint1.d$COORD_Y"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R5"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" px=1 py=0 pz=0"
$Z                                      # Introduit le 20070724114019...                                                              #

$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R2                                                                        \
$Z                                                                                        >>! $FPointN.d$COORD_X
$Z                                      # Construction progressive des fichiers '$FPointN' a visualiser par '$xrv/particule.10$X'.    #
$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R3                                                                        \
$Z                                                                                        >   $FPoint2.d$COORD_X
$Z                                      # Definition du prochain etage a "multiplier" autosimilairement.                              #

$Z                            set       PaRaMeTrEs_R6="$K_VIDE"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" ne=$NPoInTs1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_X=$FPoint1.d$COORD_X"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_Y=$FPoint1.d$COORD_Y"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R5"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" px=0 py=1 pz=0"
$Z                                      # Introduit le 20070724114019...                                                              #

$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R2                                                                        \
$Z                                                                                        >>! $FPointN.d$COORD_Y
$Z                                      # Construction progressive des fichiers '$FPointN' a visualiser par '$xrv/particule.10$X'.    #
$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R3                                                                        \
$Z                                                                                        >   $FPoint2.d$COORD_Y
$Z                                      # Definition du prochain etage a "multiplier" autosimilairement.                              #

$Z                            set       PaRaMeTrEs_R6="$K_VIDE"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" ne=$NPoInTs1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_X=$FPoint1.rayon"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" LISTE_Y=0"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R1"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" $PaRaMeTrEs_R5"
$Z                            set       PaRaMeTrEs_R6="$PaRaMeTrEs_R6"" px=1 py=0 pz=0"
$Z                                      # Introduit le 20070724114019...                                                              #

$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R2                                                                        \
$Z                                                                                        >>! $FPointN.rayon
$Z                                      # Construction progressive des fichiers '$FPointN' a visualiser par '$xrv/particule.10$X'.    #
$Z                            $xrv/ROTATION.01$X                                                                                        \
$Z                                                $PaRaMeTrEs_R6                                                                        \
$Z                                                $PaRaMeTrEs_R3                                                                        \
$Z                                                                                        >   $FPoint2.rayon
$Z                                      # Definition du prochain etage a "multiplier" autosimilairement.                              #

$Z                            $CA                 $FPoint1.ancrage $FPoint1.ancrage                                                     \
$Z                                                                                        >   $FPoint2.ancrage
$Z                                      # Le fichier d'ancrage etant du type :                                                        #
$Z                                      #                                                                                             #
$Z                                      #                   1 0 1     1 0 1     1 0 1     1 0 1     (...)                             #
$Z                                      #                   V F V     V F V     V F V     V F V     (...)                             #
$Z                                      #                                                                                             #
$Z                                      # le passage de sa version courante a la suivante se fait tout simplement par "doublement"    #
$Z                                      # (c'est-a-dire par "auto-concatenation")...                                                  #
$Z                            $CA                 $FPoint1.ancrer                                                                       \
$Z                                                                                        >   $FPoint2.ancrer
$Z                            set                 NPoInTs1=`$CA $FPoint2.ancrer | $WCl`
$Z                            set                 NPoInTs2=`$CA $FPoint2.ancrage | $WCl`
$Z                            set                 NPoInTs=`calculNS $NPoInTs2-$NPoInTs1`
$Z                            repeat              $NPoInTs                                                                              \
$Z                                                echo      $NEXIST                                           >>! $FPoint2.ancrer
$Z                                      # Le fichier d'ancrage etant du type :                                                        #
$Z                                      #                                                                                             #
$Z                                      #                   1 1 1     0 0 0     0 0 0     0 0 0     (...)                             #
$Z                                      #                   V V V     F F F     F F F     F F F     (...)                             #
$Z                                      #                                                                                             #
$Z                                      # le passage de sa version courante a la suivante se fait tout simplement en ajoutant         #
$Z                                      # suffisamment de triplets {0,0,0} en queue...                                                #
$Z                            $CA                 $FPoint1.dupliquer $FPoint1.dupliquer                                                 \
$Z                                                                                        >   $FPoint2.dupliquer
$Z                                      # Le fichier de duplication etant du type :                                                   #
$Z                                      #                                                                                             #
$Z                                      #                   0 1 0     0 1 0     0 1 0     0 1 0     (...)                             #
$Z                                      #                   F V F     F V F     F V F     F V F     (...)                             #
$Z                                      #                                                                                             #
$Z                                      # le passage de sa version courante a la suivante se fait tout simplement par "doublement"    #
$Z                                      # (c'est-a-dire par "auto-concatenation")...                                                  #

$Z                            $DELETE   $FPoint1.*

$Z                            $MV       $FPoint2$COORD_X    $FPoint1$COORD_X
$Z                            $MV       $FPoint2$COORD_Y    $FPoint1$COORD_Y

$Z                            $MV       $FPoint2.d$COORD_X  $FPoint1.d$COORD_X
$Z                            $MV       $FPoint2.d$COORD_Y  $FPoint1.d$COORD_Y

$Z                            $MV       $FPoint2.rayon      $FPoint1.rayon

$Z                            $MV       $FPoint2.ancrage    $FPoint1.ancrage
$Z                            $MV       $FPoint2.ancrer     $FPoint1.ancrer
$Z                            $MV       $FPoint2.dupliquer  $FPoint1.dupliquer
$Z                                      # Passage de l'etage courant ('$FPoint1') a l'etage suivant ('$FPoint2')...                   #

$Z                            FileTmpE  FPoint2 $NEXIST

$Z                            set       ReDuCtIoN=`calculNS $ReDuCtIoN/$_____Reduction`
$Z                                      # Reduction courante...                                                                       #

$Z                            @         NEtAgEs = $NEtAgEs - 1
$Z                                      # Passage a l'etage superieur...                                                              #
$Z                  end

$Z                  set       NPoInTsX=`$CA $FPointN$COORD_X | $WCl`
$Z                  set       NPoInTsY=`$CA $FPointN$COORD_Y | $WCl`
$Z                  set       NPoInTs=`$xcg/MIN2.01$X x=$NPoInTsX y=$NPoInTsY`

$Z                  FileTmpB  FPointC

$Z                  set       GrAiNe=$_____Graine
$Z                                      # Graine du generateur aleatoire de couleurs...                                               #

$Z                  alias     genere3   'set       CoUlEuR=\!:1 ; set MiNiMuM=\!:2 ; set MaXiMuM=\!:3                             ;    \\
$Z                                       $xrv/val_alea.01$X                                                                            \\
$Z                                                           ne=$NPoInTs                                                               \\
$Z                                                           graine=$GrAiNe                                                            \\
$Z                                                           LISTE_BORNES_INFERIEURES=$MiNiMuM                                         \\
$Z                                                           LISTE_BORNES_SUPERIEURES=$MaXiMuM                                         \\
$Z                                                           entiers=VRAI                                                              \\
$Z                                                                                                  >   $FPointC$CoUlEuR          ;    \\
$Z                                       @         GrAiNe = $GrAiNe + $_____DGraine                                               ;    \\
$Z                                       unset     CoUlEuR MiNiMuM MaXiMuM'
$Z                                      # Alias introduit le 20070724115348...                                                        #

$Z                  genere3   $ROUGE $_____MinROUGE $_____MaxROUGE
$Z                  genere3   $VERTE $_____MinVERTE $_____MaxVERTE
$Z                  genere3   $BLEUE $_____MinBLEUE $_____MaxBLEUE
$Z                                      # Generation des composantes {R,V,B}...                                                       #

$Z                  alias     genere4   'set       CoUlEuR=\!:1                                                                   ;    \\
$Z                                       $xrv/homogene.01$X                                                                            \\
$Z                                                           ne=$NPoInTs                                                               \\
$Z                                                           LISTE_X=$FPointN$COORD_X                                                  \\
$Z                                                           LISTE_Y=$FPointN$COORD_Y                                                  \\
$Z                                                           LISTE_Z=$_____Z0                                                          \\
$Z                                                           LISTE_VALEUR=$FPointC$CoUlEuR                                             \\
$Z                                                           entiers=VRAI                                                              \\
$Z                                                                                                  >   $FPointN$CoUlEuR          ;    \\
$Z                                       unset     CoUlEuR'
$Z                                      # Alias introduit le 20070724115348...                                                        #

$Z                  genere4   $ROUGE
$Z                  genere4   $VERTE
$Z                  genere4   $BLEUE
$Z                                      # Homogeneisation des composantes {R,V,B} afin que tous les points identiques (c'est-a-dire   #
$Z                                      # de memes coordonnees {X,Y,Z}) aient exactement la meme couleur...                           #

$Z                  FileTmpE  FPointC

$Z                  $xrv/particule.10$X                                                                                                 \
$Z                                      npoints=$NPoInTs                                                                                \
$Z                                      LISTE_X=$FPointN$COORD_X                                                                        \
$Z                                      LISTE_Y=$FPointN$COORD_Y                                                                        \
$Z                                      LISTE_Z=$_____Z0                                                                                \
$Z                                      LISTE_dX=$FPointN.d$COORD_X                                                                     \
$Z                                      LISTE_dY=$FPointN.d$COORD_Y                                                                     \
$Z                                      LISTE_dZ=0                                                                                      \
$Z                                      LISTE_RAYON=$FPointN.rayon                                                                      \
$Z                                      LISTE_ROUGE=$FPointN$ROUGE                                                                      \
$Z                                      LISTE_VERTE=$FPointN$VERTE                                                                      \
$Z                                      LISTE_BLEUE=$FPointN$BLEUE                                                                      \
$Z                                      isoles=FAUX                                                                                     \
$Z                                      Pajuster=VRAI                                                                                   \
$Z                                      chainer=FAUX                                                                                    \
$Z                                      equidistance=VRAI                                                                               \
$Z                                      cubique=$_____Cubique                                                                           \
$Z                                      ZOOM=$_____Zoom                                                                                 \
$Z                                      extrema_hors=FAUX                                                                               \
$Z                                      R=$_____ImageR                                                                                  \
$Z                                      chiffres=0                                                                                      \
$Z                                                                                                                      $formatI
$Z                                      # Generation de l'image finale...                                                             #

$Z                  FileTmpE  FPointN
$Z                  FileTmpE  FPoint1



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.