\subsection{Le module \emph{luadraw\_shadedforms}} Ce module ne renvoie rien, il ajoute de nouvelles méthodes graphiques à la classe \emph{ld.graph}. Il permet de dessiner des lignes polygonales ou de remplir une forme en utilisant un gradient de couleurs. \subsubsection{Dshadedpolyline} La méthode \cmd{g:Dshadedpolyline(L, palette, options)} permet de dessiner la ligne polygonale 2D \argu{L}) avec un dégradé de couleurs en fonction de la méthode de calcul et de la \argu{palette} choisies. \argu{L} est une liste de nombres complexes ou une liste de listes de nombres complexes, \argu{palette} est une liste de couleurs, chaque couleur est elle-même une liste de trois nombres entre $0$ et $1$ représentant les trois composantes: rouge, vert et bleu de la couleur. \writeoptions : \begin{itemize} \item \opt{values="x"}, pour chaque point de \argu{L} on calcule une valeur numérique qui permettra de déterminer la couleur de ce point dans la palette choisie. C'est l'option \opt{values} qui détermine le mode de calcul, cette option peut être égale à : \begin{itemize} \item \val{"x"} (valeur par défaut), dans ce cas pour chaque point de \argu{L} la valeur sera l'abscisse. \item \val{"y"}, dans ce cas pour chaque point de \argu{L} la valeur sera l'ordonnée. \item une fonction \val{f}$\colon(x,y)\mapsto f(x,y)\in\mathbf R$, dans ce cas chaque point $(x,y)$ de \argu{L} la valeur sera donnée par $f(x,y)$. \end{itemize} \item \opt{width=<épaisseur courante>}, permet de définir l'épaisseur de ligne en dixième de point. \item \opt{close=false}, booléen indiquant si la ligne polygonale doit être refermée ou non. \item \opt{clip=nil}, cette option est soit \nil (valeur par défaut), soit une table \emph{\{x1,x2,y1,y2\}}, dans le premier cas la ligne est clippée par la fenêtre 2D courante \textbf{après} sa transformation par la matrice 2D du graphe, dans le second cas la ligne est clippée par la fenêtre $[x_1;x_2]\times[y_1;y_2]$ \textbf{avant} d'être transformée par la matrice du graphe. \end{itemize} Cette méthode convertit \argu{L} en une succession de trapèzes qui sont ensuite remplis avec un dégradé de couleur. \begin{demo}{Shaded polyline} \begin{luadraw}{name=shading_polyline} local ld = luadraw local cpx = ld.cpx local i, Z = cpx.I, cpx.Z local g = ld.graph:new{size={10,10},bg="lightgray", margin={0,0,0,0}} require 'luadraw_shadedforms' -- 1ier exemple equation diff. y'= x^2+y^2-1 (=f(x,y)) local x1,x2,y1,y2 = -3,3,-3,3 local A = Z(0,1/2) -- condition initiale local f = function(x,y) return x^2+y^2-1 end local S = ld.odesolve(f, A.re, A.im, x1, x2, 150) -- S est une matrice {X,Y} local L = {} -- convertit {X,Y} en une liste de complexes L for k = 1, #S[1] do table.insert(L, Z(S[1][k],S[2][k])) end L = ld.clippolyline(L,-2.5,2.4,y1,y2)[1] -- L est la courbe solution (approchée) g:Dshadedpolyline(L, ld.palRainbow, {values=f, width=12}) -- la couleur est calculée avec la fonction f -- 2ième exemple L = ld.polar(function(t) return 2*math.cos(3*t) end, -math.pi, math.pi) local f = function(x,y) return cpx.abs(Z(x,y)) end -- ici la valeur sera le module g:Shift(2-2.5*i) g:Dshadedpolyline(L, ld.palAutumn, {values=f, width=12}) -- 3ième exemple g:Shift(-4.5+5*i) g:Dshadedpolyline( ld.polyreg(0,2,8), ld.palGasFlame, {values="y", width=24, close=true}) g:Show() \end{luadraw} \end{demo} \subsubsection{Dcolorbar} La méthode \cmd{g:Dcolorbar(A, pal, options)} permet de dessiner un rectangle avec un gradient de couleurs à partir d'une palette, et éventuellement une graduation. L'argument \argu{A} est un nombre complexe, c'est le point de référence pour la construction du rectangle. L'argument \argu{pal} est une palette de couleurs (liste de listes de la forme $\{r,g,b\}$ avec $r$, $g$ et $b$ entre $0$ et $1$). \writeoptions : \begin{itemize} \item \opt{minmax=\{0,1\}}, liste contenant la valeur minimale (qui sera affectée à la première couleur de la palette) et la valeur maximale (qui sera affectée à la dernière couleur de la palette), ainsi, à toute valeur numérique entre \emph{min} et \emph{max} correspond une couleur de la palette. \item \opt{dir=cpx.I}, direction du grand côté du rectangle (ce vecteur est automatiquement normalisé), par défaut le rectangle est donc vertical. \item \opt{length=8}, longueur du rectangle. \item \opt{width=0.5}, largeur du rectangle. Les sommets du rectangle sont :\par \hfil\verb|A, A+length*dir, A+length*dir+width*cpx.I*dir, A+width*cpx.I*dir|\hfil\par \item \opt{values=0}, cette option permet de définir soit le nombre de valeurs numériques affichées équiréparties dans l'intervalle \opt{minmax} (aucune par défaut), soit la liste des valeurs numériques affichées (dans ce cas \opt{values} doit être une liste de valeurs numériques comprises dans l'intervalle \opt{minmax}). \item \opt{addvalues=nil}, cette option permet de définir une liste des valeurs numériques à afficher en plus des valeurs \emph{min} et \emph{max}. Cette option prime sur la précédente. \item \opt{digits=2}, nombre de décimales pour les affichages numériques. \item \opt{labelpos="E"}, permet de positionner les labels par rapport aux points d'ancrage (\val{"N"}, \val{"NE"}, \val{"E"}, \val{"SE"}, \val{"S"}, \val{"SW"}, "\val{W"}, \val{"NW"}). Les labels sont positionnés le long de l'axe \emph{(A, dir)}. \end{itemize} \begin{demo}{Color bars} \begin{luadraw}{name=Dcolorbar} local ld = luadraw local Z = ld.cpx.Z local g = ld.graph:new{size={10,10}, bbox=false} g:Labelsize("small") require 'luadraw_shadedforms' local pal = require 'luadraw_palettes' g:Dcolorbar(Z(-4,-4), pal.Rainbow) g:Dcolorbar(Z(-2,-4), pal.GasFlame, {minmax={0,7},values=8}) g:Dcolorbar(Z(-1,1), pal.Autumn, {dir=1,length=6,width=1,addvalues={0.25,0.5,0.75},labelpos="S"}) g:Dcolorbar(Z(-1,-1), pal.Viridis, {dir=1,length=6,width=-1,addvalues={0.25,0.5,0.75},labelpos="N"}) g:Dlabel("No value", Z(-4.25,-4),{pos="S"}, "\\parbox{1.95cm}{minmax=\\{0,7\\}\\\\values=8}", Z(-2.25,-4), {}, "dir=1, length=6, width=1", Z(2,2), {pos="N"}, "dir=1, length=6, width=-1", Z(2,-2),{pos="S"}) g:Show() \end{luadraw} \end{demo} \subsubsection{Dshadedrectangle} \noindent\textbf{NB}: l'utilisation de cette méthode nécessite la librairie \emph{shadings}. La méthode \cmd{g:Dshadedrectangle(x1, x2, y1, y2, pal, options)} permet de remplir le rectangle $[x_1;x_2]\times [y_1;_y2]$ avec un gradient de couleurs extraites de la palette \argu{pal}. Chaque point $(x,y)$ du rectangle a une couleur issue de la palette, calculée à partir d'une valeur $f(x,y)$ où $f$ est une fonction à valeurs numériques définie sur le rectangle. \writeoptions : \begin{itemize} \item \opt{values=function(x,y) return cpx.abs(Z(x,y)) end}, cette option définit la fonction $f$ utilisée pour calculer la couleur de chaque point. La valeur maximale de $f$ sur le rectangle correspondra à la dernière couleur de la palette, et la valeur minimale de $f$ correspondra à la première couleur de la palette. Par défaut, cette fonction est le module. \item \opt{grid=\{15,15\}}, cette option définit le nombre de subdivisions pour l'intervalle $[x_1;x_2]$ et pour l'intervalle $[y_1;y_2]$. Plus la subdivision est fine plus l'affichage sera long. \item \opt{bar="none"}, permet d'ajouter ou non une légende en faisant appel à la méthode \cmd{Dcolorbar()}, cette option peut valoir : \val{"none"}, \val{"right"}, \val{"bottom"}, \val{"left"}, ou \val{"top"}. \item \opt{bardist=1}, distance entre le rectangle et la légende s'il y en a une. \item \opt{baroptions=\{\}}, liste d'options pour la méthode \cmd{Dcolorbar()} s'il y a une légende. \item \opt{out=nil}, si on affecte une variable de type liste à ce paramètre \opt{out}, alors la méthode ajoute à cette liste les deux valeurs \emph{min} et \emph{max} de la fonction $f$ (ce qui permet de récupérer éventuellement ces deux valeurs). \end{itemize} \begin{demo}{Shaded rectangle} \begin{luadraw}{name=Dshadedrectangle} local ld = luadraw local cpx = ld.cpx local Z = cpx.Z local g = ld.graph:new{window={-4,6,-5.5,5.5}, size={10,10}, bbox=false} require 'luadraw_shadedforms' require 'luadraw_fields' local pal = require 'luadraw_palettes' g:Labelsize("small") local f = function(x,y) return {math.cos(x+y), x} end -- champ de vecteurs local Nf = function(x,y) local A = f(x,y); return cpx.abs(Z(A[1],A[2])) end -- module de f(x,y) g:Dshadedrectangle(-4,4,-5,5, pal.Picnic, {values=Nf, bar="right", baroptions={addvalues={0.5,1.5,2.5,3.5}}}) g:Dvectorfield(f,{view={-4,4,-5,5},draw_options="-stealth"}) g:Dgradbox({Z(-4,-5),Z(4,5),1,1}, {title="vector field $f(x,y)=(\\cos(x+y),x)$"}) g:Show() \end{luadraw} \end{demo} \subsubsection{Dshadedregion} La méthode \cmd{g:Dshadedregion(apath, pal, options)} permet de remplir la région définie par le chemin \argu{apath} avec un gradient de couleurs extraites de la palette \argu{pal}. Cette méthode utilise la précédente (\cmd{Dshadedrectangle()}) sur le rectangle définie par la boîte englobante du chemin. Chaque point $(x,y)$ de ce rectangle a une couleur issue de la palette, calculée à partir d'une valeur $f(x,y)$ où $f$ est une fonction à valeurs numériques définie sur ce rectangle. Le dessin est clippé par le chemin. L'argument \argu{options} est identique à celui de la méthode précédente \emph{Dshadedrectangle}. \begin{demo}{Shaded region} \begin{luadraw}{name=Dshadedregion} local ld = luadraw local cpx = ld.cpx local Z = cpx.Z local g = ld.graph:new{window={-4.5,6,-4.5,5}, size={10,10},bg="lightgray", bbox=false} g:Labelsize("small") require 'luadraw_shadedforms' local pal = require 'luadraw_palettes' local L1, L2 = -2, 2 local f = function(x,y) local z = Z(x,y) return (cpx.abs(z-L1)-cpx.abs(z-L2))^2 end g:Dshadedregion({4,0,4,3,"e"}, pal.getPal(pal.Grays,{reverse=true}), {values=f, grid={20,20}}) g:Show() \end{luadraw} \end{demo}