Cambiare le proprietà delle superfici
La visualizzazione delle superfici in un grafico Matlab viene fatto utilizzando dei valori predefiniti che però possono essere variati.
L'esempio che segue, tratto dall'Help Center (https://it.mathworks.com/help/matlab/visualize/changing-surface-properties.html) mostra la visualizzazione tipica utilizzata e le proprietà principali dell'oggetto grafico:
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z)
s =
Surface with properties:
EdgeColor: [0 0 0]
LineStyle: '-'
FaceColor: 'flat'
FaceLighting: 'flat'
FaceAlpha: 1
XData: [50×50 double]
YData: [50×50 double]
ZData: [50×50 double]
CData: [50×50 double]
Show all properties
La chiamata della funzione surf() con argomento di destinazione la classe s, mostra le proprietà principali: EdgeColor, LineStyle, FaceColor, FaceLighting e FaceAlpha.
Edgecolor è un vettore a 3 elementi che indica le 3 componenti RGB del colore degli spigoli. I valori vanno tra 0 e 1. Ad esempio per colorare gli spigoli della griglia della figura precedente in bianco:
>> s.EdgeColor = [1 1 1];
opzioni possibili per il colore dei bordi, oltre alla terna valori, sono:'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black', 'white', 'none'. Alternativamente è possibile esprimere un colore in esadecimale con la notazione esadecimale, per esempio s.FaceColor = '#FF4DA1'.
Linestyle è lo stile con cui viene disegnata la linea, valgono le stesse impostazioni della linea in plot()
'-' linea solida ____
'--' linea tratteggiata -----
':' linea a puntini ......
'-.' linea tratto-punto -.-.-.
Questo il risultato se si prova a cambiare il tratto della linea nella figura d'esempio:
>> s.Linestyle = '.';
(un risultato deludente)!
Più interessante è l'opzione FaceColor che permette di cambiare il colore delle superfici. Esistono due possibilità per cambiare come la superficie viene rappresentata:
- agendo direttamente sul colore
- agendo sulla colormap
Per esempio, nel primo caso:
>> s.FaceColor = 'blue';
altre opzioni possibili per il colore, così come EdgeColor, oltre alla terna valori, sono:'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black', 'white', 'none'. Alternativamente è possibile esprimere un colore in esadecimale con la notazione esadecimale, per esempio:
>> s.FaceColor = '#FF4DA1';
Il secondo metodo, ovvero agendo sulla colormap è già stato visto in dettaglio nel capitolo "Grafici 3D: colormap integrate in Matlab". Ad esempio:
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z);
>> colormap hot; % è equivalente a scrivere colormap('hot');
Un' ulteriore proprietà molto interessante è FaceLighting, tuttavia direttamente non è di facile gestione, è preferibile agire invece sulla possibilità di inserire una luce virtuale che illumina la curva e agire sulla proprietà di riflettanza della superficie.
Per creare una luce virtuale è possibile usare la funzione light. In genere la funzione viene chiamata senza argomenti facendole tornare una class con la quale far cambiare le proprietà della luce. Ad esempio:
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z);
>> h = light
h =
Light with properties:
Color: [1 1 1]
Style: 'infinite'
Position: [1 0 1]
Visible: on
Show all properties
è evidente che l'accensione della luce ha avuto l'effetto di creare un effetto luminoso sulla figura. Se si osservano invece le proprità principali della luce sono: Color, Style, Position e Visible. Parleremo solo di Color, per le altre proprietà è possibile fare riferimento all'Help Center alla pagina https://it.mathworks.com/help/matlab/ref/matlab.graphics.primitive.light-properties.html.
Color è il colore della luce, per default la luce è bianca, ma può essere inserito un colore come in EdgeColor e FaceColor: una terna di valori, 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black', 'white', 'none' o un colore con la notazione esadecimale, per esempio h.Color = '#00FF00' .
Per comprendere la differenza è necessario disegnare la stessa superficie illuminandola con una luce di colore diverso, per esempio:
>> [X,Y,Z] = peaks(50);
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z);
>> s.FaceColor = 'yellow';
>> h = light;
>> h.Color = '#00FF00'; % Equivalente a h.Color = 'green'
In tutte le figure viste fino al ora è evidente la sfaccettatura delle superfici. Nel caso si voglia dare un'idea di superficie curva è possibile utilizzare la funzione lighting che modifica il metodo di illuminazione. Le opzioni possibili sono:
- 'flat' che applica l'illuminazione in modo uniforme su ogni faccia. È l'impostazione di default e fa vedere le superfici sfacettate.
- 'gouraud' che varia la luce sulle facce. Calcola l'illuminazione ai vertici della superficie e quindi interpola linearmente la luce attraverso le facce. Questo metodo permette di vedere le superfici curve.
- 'none' che spegne la luce.
Se alla superficie precedente viene applicata l'illuminazione 'gouraud', effetto è il seguente:
>> lighting 'gouraud';
Tornando nuovamente al punto dal quale si è cominciato, ovvero alla proprietà FaceLighting, oltre al tipo di illuminazione della superfice è possibile variarne anche la riflettanza tramite la funzione material.
-
'shiny' (è metallo di default) imposta le proprietà di riflettanza in modo che l'oggetto abbia un'elevata riflettanza speculare rispetto alla luce diffusa e ambiente, e il colore della luce riflessa dipende solo dal colore della sorgente luminosa.
- 'dull' imposta le proprietà di riflettanza in modo che l'oggetto rifletta la luce più diffusa e non abbia evidenziazioni a specchio, ma il colore della luce riflessa dipende solo dalla sorgente luminosa.
- 'metal' imposta le proprietà di riflettanza in modo che l'oggetto abbia una riflettanza speculare molto alta, una riflettanza ambientale e diffusa molto bassa e il colore della luce riflessa dipenda sia dal colore della sorgente luminosa che dal colore dell'oggetto.
Qui sotto i risultati adottando i tre materiali:
>> [X,Y,Z] = peaks(50);
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z);
>> s.EdgeColor = 'none';
>> colormap copper
>> h = light;
>> lighting 'gouraud';
>> material 'dull'
>> [X,Y,Z] = peaks(50);
>> figure
>> s = surf(X,Y,Z);
>> s.EdgeColor = 'none';
>> colormap copper
>> h = light;
>> lighting 'gouraud';
>> material 'metal'
Per ultima, la proprietà FaceAlpha permette di impostare la trasparenza per tutti gli oggetti negli assi correnti. La trasparenza è un valore compreso tra 1 e 0, dove 1 significa completamente opaco e 0 significa completamente trasparente. Per esempio:
>> alpha(0.8)
Approfondimenti
La documentazione completa di lighting si trova alla pagina https://it.mathworks.com/help/matlab/creating_plots/lighting-overview.html