#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         G E N E R A T I O N   D E   ' < palette > '   P A R   I N T E R P O L A T I O N   E T / O U   L I S S A G E  :              #
#                                                                                                                                     #
#                                                                                                                                     #
#                   source    $xigP/.INTERPOLE$Y                                                                                      #
#                                                                                                                                     #
#                                                                                                                                     #
#         Arguments :                                                                                                                 #
#                                                                                                                                     #
#                   numeros             : liste des numeros des niveaux (de 1 a ...).                                                 #
#                                                                                                                                     #
#                   niveaux             : liste des niveaux a positionner ("+" signifiant "NiveauPrecedent+1").                       #
#                                                                                                                                     #
#                   fonction            : fonction a appliquer au niveau ("N", "D", "A", "1", "2", "3" ou "4").                       #
#                                                                                                                                     #
#                   rouge               : niveau de la composante '$ROUGE' si la variable 'rouge' existe (sera detruite au retour)    #
#                                         et si '$SystemeRVB', sinon, si '$SystemeHLS' donne le niveau de la composante '$TEINT'.     #
#                   verte               : niveau de la composante '$VERTE' si la variable 'verte' existe (sera detruite au retour)    #
#                                         et si '$SystemeRVB', sinon, si '$SystemeHLS' donne le niveau de la composante '$LUMIN'.     #
#                   bleue               : niveau de la composante '$BLEUE' si la variable 'bleue' existe (sera detruite au retour)    #
#                                         et si '$SystemeRVB', sinon, si '$SystemeHLS' donne le niveau de la composante '$SATUR'.     #
#                                                                                                                                     #
#                   teint               : donne le niveau de la composante '$TEINT' si '$SystemeHLS' dans [$NOIR,$BLANC].             #
#                   lumin               : donne le niveau de la composante '$LUMIN' si '$SystemeHLS' dans [$NOIR,$BLANC].             #
#                   satur               : donne le niveau de la composante '$SATUR' si '$SystemeHLS' dans [$NOIR,$BLANC].             #
#                                                                                                                                     #
#                   initialisation      : indique s'il faut initialiser ('EXIST') ou pas ('NEXIST') la palette.                       #
#                                                                                                                                     #
#                   echelle             : definit un facteur de 'SCALE' a appliquer a la (ou aux) composantes apres une               #
#                                         interpolation ; ainsi, en interpolant entre 0 et 3, puis en faisant une mise a              #
#                                         l'echelle de 64.0, on obtient une palette en marche d'escalier 0,64,128,196.                #
#                   translation         : definit une translation de 'SCALE' a appliquer a la (ou aux) composantes apres une          #
#                                         interpolation.                                                                              #
#                                                                                                                                     #
#                   Fderivee            : facteur utilise lors du calcul des derivees pour l'interpolation de lissage. On notera      #
#                                         que malheureusement '$Fderivee' ne sert a rien dans le cas ou systematiquement les          #
#                                         niveaux correspondant a la definition du "point de depart" par {1,2} (ou a la definition    #
#                                         du "point d'arrivee" par {3,4}) dans les listes {$rouge,$verte,$bleue} sont egaux car, en   #
#                                         effet, dans ces conditions les derivees etant obtenues par des differences ("2"-"1" et      #
#                                         "4"-"3" respectivement) sont systematiquement nulles, et donc les mutiplier par '$Fderivee' #
#                                         ne change rien a cela...                                                                    #
#                   D2A3                : indicateur logique disant si l'interpolation est 'D2-->A3' ('VRAI') ou 'D1-->A4' ('FAUX')   #
#                                         ('v $xiii/Images$STR interpoler_les_listes_de_substitution_entre_D2_et_A3').                #
#                   EpsilonLissage      : petite valeur destinee, lorsqu'elle n'est pas nulle, a corriger le probleme decrit          #
#                                         dans 'v $xigP/gris.52.1$Z LISSE.X'.                                                         #
#                                                                                                                                     #
#                   systeme             : systeme de couleurs utilisees ("RVB" ou "HLS", soit '$SystemeRVB' ou '$SystemeHLS').        #
#                                                                                                                                     #
#                   ToutConserver       : ne faire aucun '$DELETE' a la fin (introduit le 20141117115807).                            #
#                   NePasInterpoler     : ne faire aucune interpolation (introduit le 20141117115807).                                #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xigP/.INTERPOLE$Y' :                                                                                            #
#                                                                                                                                     #
#                     Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

source    $xigP/.INTERPOLE.initialisations$Y
                                        # Introduit sous cette forme le 20240324110309...                                             #

if        ($?Fderivee == $NEXIST) then
          set       Fderivee  = 1.0
                                        # Valeur par defaut...                                                                        #
else
endif

if        ($?D2A3 == $NEXIST) then
          set       D2A3 = VRAI
                                        # Valeur par defaut...                                                                        #
else
endif

if        ($?EpsilonLissage == $NEXIST) then
          set       EpsilonLissage = 0.0
                                        # Valeur par defaut (introduit le 20040910143721) assurant la compatibilite anterieure.       #
else
endif

if        ($?systeme == $NEXIST) then
          if        (($?rouge == $EXIST) && ($?verte == $EXIST) && ($?bleue == $EXIST)) then
                    set       systeme   = $SystemeRVB
                                        # Cas ou il s'agit surement du {R,V,B}...                                                     #
          else
                    if        (($?teint == $EXIST) && ($?lumin == $EXIST) && ($?satur == $EXIST)) then
                              set       systeme   = $SystemeHLS
                                        # Cas ou il s'agit surement du {H,L,S}...                                                     #
                    else
                              set       systeme   = $SystemeRVB
                                        # Valeur par defaut...                                                                        #
                    endif
          endif
else
endif

set       Systeme_RVB_HLS="entree=$systeme sortie=$systeme"
                                        # Choix du systeme de couleur.                                                                #

if        ("$systeme" == "$SystemeRVB") then
          rw        $palette$ROUGE                >& $nul
          rw        $palette$VERTE                >& $nul
          rw        $palette$BLEUE                >& $nul
else

          if        ($?teint == $EXIST) then
                    set       rouge     = ($teint)
          else
          endif

          if        ($?lumin == $EXIST) then
                    set       verte     = ($lumin)
          else
          endif

          if        ($?satur == $EXIST) then
                    set       bleue     = ($satur)
          else
          endif

          rw        $palette$TEINT                >& $nul
          rw        $palette$LUMIN                >& $nul
          rw        $palette$SATUR                >& $nul
endif

set       VaL_NoM="Valider_noms_relatifs=FAUX"
                                        # Introduit le 20080116174617...                                                              #

if        ($?initialisation == $NEXIST) then
          $xciP/ACCES$X       pA=$paletteI pR=$palette entree=$SystemeRVB sortie=$systeme $VaL_NoM
                                        # Initialisation lorsque cela est demande...                                                  #

else
          if        ($initialisation == $EXIST) then
                    $xciP/ACCES$X       pA=$paletteI pR=$palette entree=$SystemeRVB sortie=$systeme $VaL_NoM
                                        # Initialisation lorsque cela est demande...                                                  #
          else
          endif
endif

set       nD=$NOIR
set       nA=$BLANC
                                        # Definition des niveaux de Depart et d'Arrivee a priori pour '$xciP/INTERPOLE$X'.            #
set       n1=$NOIR
set       n4=$BLANC
set       n2=`expr $n1 + 1`
set       n3=`expr $n4 - 1`
                                        # Definition des niveaux de Depart et d'Arrivee a priori pour '$xciP/LISSE$X'.                #

if        ($?numeros == $NEXIST) then
          set       numeros=`$xci/nombres$X premiere=1 derniere=$#niveaux zero="$K_VIDE"`
                                        # Lorsque la liste '$numeros' est absente, on la genere a partir du nombre d'elements de      #
                                        # la liste '$niveaux' qui est necessairement presente...                                      #
else
endif

foreach   numero    ($numeros)
          if        ("$niveaux[$numero]" == "+") then
                    if        ($numero > 1) then
                              @         numero_1 = $numero - 1
                              @         niveaux[$numero] = $niveaux[$numero_1] + 1
                                        # Un niveau repere par "+" doit etre substitue par le niveau qui le precede (s'il existe)     #
                                        # incremente d'une unite (introduit le 20030127091538 pour 'v $xigP/escalier2.01$Z' et toutes #
                                        # les palettes de ce type...                                                                  #
                    else
                              @         niveaux[$numero] = 0
                                        # Un "+" en tete permet de definir le premier niveau (0)...                                   #
                    endif
          else
          endif
end

foreach   numero    ($numeros)
          if        ($?rouge == $EXIST) then
                    set       nR=$rouge[$numero]
                    set       eR=VRAI
          else
                    set       nR=`$xciP/G_NIVEAU$X    p=$palette n=$niveaux[$numero] rouge=VRAI verte=FAUX bleue=FAUX $VaL_NoM |& $CA`
                    set       eR=FAUX
          endif

          if        ($?verte == $EXIST) then
                    set       nV=$verte[$numero]
                    set       eV=VRAI
          else
                    set       nV=`$xciP/G_NIVEAU$X    p=$palette n=$niveaux[$numero] rouge=FAUX verte=VRAI bleue=FAUX $VaL_NoM |& $CA`
                    set       eV=FAUX
          endif

          if        ($?bleue == $EXIST) then
                    set       nB=$bleue[$numero]
                    set       eB=VRAI
          else
                    set       nB=`$xciP/G_NIVEAU$X    p=$palette n=$niveaux[$numero] rouge=FAUX verte=FAUX bleue=VRAI $VaL_NoM |& $CA`
                    set       eB=FAUX
          endif

          if        ($?NePasInterpoler == $NEXIST) then
                                        # Test introduit le 20141117115807...                                                         #
                    $xciP/S_NIVEAU$X    pA=$palette n=$niveaux[$numero] nR=$nR nV=$nV nB=$nB pR=$palette $Systeme_RVB_HLS $VaL_NoM
                                        # Definition et mise en place systematique                                                    #
                                        # du niveau courant.                                                                          #
          else
          endif

          switch    ("$fonction[$numero]")
                    case "N":
                                        # Definition d'un niveau "standard".                                                          #
                              breaksw
                    case "D":
                              set                 nD=$numero
                                        # Definition du niveau de Depart.                                                             #
                              breaksw
                    case "A":
                              set                 nA=$numero
                                        # Definition du niveau d'Arrivee.                                                             #

                              if        ($?NePasInterpoler == $NEXIST) then
                                        # Test introduit le 20141117115807...                                                         #
                                        $xciP/INTERPOLE$X   pA=$palette                                                                 \
                                                            rouge=$eR verte=$eV bleue=$eB                                               \
                                                            nD=$niveaux[$nD] nA=$niveaux[$nA]                                           \
                                                            pR=$palette                                                                 \
                                                            $Systeme_RVB_HLS                                                            \
                                                            $VaL_NoM
                                        # Interpolation du niveau de Depart au niveau d'Arrivee.                                      #
                              else
                              endif

                              if        ($?echelle == $EXIST) then
                                        $xciP/SCALE$X       pA=$palette                                                                 \
                                                            rouge=$eR verte=$eV bleue=$eB                                               \
                                                            nD=$niveaux[$nD] nA=$niveaux[$nA]                                           \
                                                            multiplieur=$echelle                                                        \
                                                            translation=0                                                               \
                                                            pR=$palette                                                                 \
                                                            $Systeme_RVB_HLS                                                            \
                                                            $VaL_NoM
                                        # Mise a l'echelle des niveaux apres interpolation.                                           #
                              else
                              endif

                              if        ($?translation == $EXIST) then
                                        $xciP/SCALE$X       pA=$palette                                                                 \
                                                            rouge=$eR verte=$eV bleue=$eB                                               \
                                                            nD=$niveaux[$nD] nA=$niveaux[$nA]                                           \
                                                            multiplieur=1.0                                                             \
                                                            translation=$translation                                                    \
                                                            pR=$palette                                                                 \
                                                            $Systeme_RVB_HLS                                                            \
                                                            $VaL_NoM
                                        # Translation des niveaux apres interpolation.                                                #
                              else
                              endif

                              set                 nD=$nA
                                        # Definition du niveau de Depart suivant.                                                     #
                              breaksw
                    case "1":
                              set                 n1=$numero
                                        # Definition du niveau de type "1".                                                           #
                              breaksw
                    case "2":
                              set                 n2=$numero
                                        # Definition du niveau de type "2".                                                           #
                              breaksw
                    case "3":
                              set                 n3=$numero
                                        # Definition du niveau de type "3".                                                           #
                              breaksw
                    case "4":
                              set                 n4=$numero
                                        # Definition du niveau de type "4".                                                           #

                              $xciP/LISSE$X       pA=$palette                                                                           \
                                                  rouge=$eR verte=$eV bleue=$eB                                                         \
                                                  n1=$niveaux[$n1] n2=$niveaux[$n2] n3=$niveaux[$n3] n4=$niveaux[$n4]                   \
                                                  facteur=$Fderivee                                                                     \
                                                  interpoler_D2_et_A3=$D2A3                                                             \
                                                  EpsilonLissageSubstitution=$EpsilonLissage                                            \
                                                  pR=$palette                                                                           \
                                                  $Systeme_RVB_HLS                                                                      \
                                                  $VaL_NoM
                                        # Lissage suivant la spline cubique (n1,n2,n3,n4).                                            #

                              if        ($?echelle == $EXIST) then
                                        $xciP/SCALE$X       pA=$palette                                                                 \
                                                            rouge=$eR verte=$eV bleue=$eB                                               \
                                                            nD=$niveaux[$nD] nA=$niveaux[$nA]                                           \
                                                            multiplieur=$echelle                                                        \
                                                            translation=0                                                               \
                                                            pR=$palette                                                                 \
                                                            $Systeme_RVB_HLS                                                            \
                                                            $VaL_NoM
                                        # Interpolation du niveau de Depart au niveau d'Arrivee.                                      #
                              else
                              endif

                              if        ($?translation == $EXIST) then
                                        $xciP/SCALE$X       pA=$palette                                                                 \
                                                            rouge=$eR verte=$eV bleue=$eB                                               \
                                                            nD=$niveaux[$nD] nA=$niveaux[$nA]                                           \
                                                            multiplieur=1.0                                                             \
                                                            translation=$translation                                                    \
                                                            pR=$palette                                                                 \
                                                            $Systeme_RVB_HLS                                                            \
                                                            $VaL_NoM
                                        # Translation des niveaux apres interpolation.                                                #
                              else
                              endif

                              set                 n1=$n3
                              set                 n2=$n4
                                        # Definition des niveaux 'n1' et 'n2' suivants.                                               #
                              breaksw
                    default:
#20240105111212____:                              echo                "ATTENTION : la fonction demandee n'est pas reconnue."          #
                              echo                "ATTENTION : la fonction demandee ('$fonction[$numero]') n'est pas reconnue."
                              breaksw
          endsw
end

if        ($?rouge == $EXIST) then
          unset     rouge
else
endif

if        ($?verte == $EXIST) then
          unset     verte
else
endif

if        ($?bleue == $EXIST) then
          unset     bleue
else
endif

if        ($?teint == $EXIST) then
          unset     teint
else
endif

if        ($?lumin == $EXIST) then
          unset     lumin
else
endif

if        ($?satur == $EXIST) then
          unset     satur
else
endif

if        ($?ToutConserver == $NEXIST) then
                                        # Introduit le 20141117115807...                                                              #
          unset     numeros
          unset     niveaux
          unset     fonction

          if        ($?initialisation == $EXIST) then
                    unset     initialisation
          else
          endif

          if        ($?echelle == $EXIST) then
                    unset     echelle
          else
          endif

          if        ($?translation == $EXIST) then
                    unset     translation
          else
          endif
else
endif

if        ("$systeme" == "$SystemeRVB") then
          ro        $palette$ROUGE
          ro        $palette$VERTE
          ro        $palette$BLEUE
else
          rw        $palette$ROUGE                >& $nul
          rw        $palette$VERTE                >& $nul
          rw        $palette$BLEUE                >& $nul

          $xciP/ACCES$X       pA=$palette pR=$palette entree=$SystemeHLS sortie=$SystemeRVB $VaL_NoM

          ro        $palette$ROUGE
          ro        $palette$VERTE
          ro        $palette$BLEUE

          delete    $palette$TEINT
          delete    $palette$LUMIN
          delete    $palette$SATUR
                                        # A compter du 19990211122100, meme lorsque le systeme {H,L,S} est utilise pour la generation #
                                        # d'une palette, c'est la palette {R,V,B} uniquement qui est generee et conservee...          #
endif

if        ($?ToutConserver == $NEXIST) then
                                        # Introduit le 20141117115807...                                                              #
          unset     palette

          unset     paletteI
                                        # Pour permettre un autre appel...                                                            #

          unset     VaL_NoM

          unset     Systeme_RVB_HLS
else
endif



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