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);
>> figure
>> s = surf(X,Y,Z);
>> s.FaceColor = 'yellow';
>> h = light;
>> h.Color = '#FFFFFF'; % Equivalente a h.Color = 'white'
>> [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.

 

La funzione material imposta le caratteristiche delle superfici e degli oggetti di tipo patch (si veda https://it.mathworks.com/help/matlab/ref/patch.html).
Esistono varie possibilità di configurazione (si veda a proposito https://it.mathworks.com/help/matlab/ref/material.html), le principali sono 'shiny', 'dull' e 'metal'.
  • '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);
>> figure
>> s = surf(X,Y,Z);
>> s.EdgeColor = 'none';
>> colormap copper
>> h = light;
>> lighting 'gouraud';
>> material 'shiny'
>> [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



Ultime modifiche: lunedì, 1 gennaio 2024, 16:35