Patch
In Matlab, un oggetto patch è un oggetto grafico che rappresenta un poligono con un colore e una trasparenza specifici. Gli oggetti patch possono essere utilizzati per rappresentare regioni di interesse o per creare figure complesse come grafici 3D o animazioni.
Per disegnare un oggetto patch in Matlab, è necessario specificare le coordinate dei vertici del poligono e il colore del riempimento. Ad esempio, il seguente codice crea un quadrato rosso con angoli in (0,0), (0,1), (1,1), e (1,0):
>> x = [0 0 1 1];
>> y = [0 1 1 0]; >> patch(x, y, 'r');
È anche possibile specificare altri parametri come il bordo del poligono e la trasparenza del colore di riempimento. Ad esempio, il seguente codice crea un quadrato rosso con un bordo nero e un'opacità del 50%:
>> x = [0 0 1 1];
>> y = [0 1 1 0];
>> c = 'r'; % colore del riempimento (rosso)
>> e = 'k'; % colore del bordo (nero)
>> alpha = 0.5; % opacità del riempimento
>> patch(x, y, c, 'EdgeColor', e, 'FaceAlpha', alpha)
L'esempio che segue crea un oggetto patch verde in 3D costituito da due quadrati sovrapposti.
% Definizione delle coordinate dei vertici del poligono
x = [0 0 1 1];
y = [0 1 1 0];
z = [0 0 0 0];
% Creazione dell'oggetto patch con colore di riempimento verde
patch(x, y, z, 'g', 'FaceAlpha', 0.5)
% Aggiunta di un altra patch per creare una figura in 3D
hold on
x = [0 0 1 1];
y = [0 1 1 0];
z = [1 1 1 1];
patch(x, y, z, 'g', 'FaceAlpha', 0.5);
La prima riga di codice definisce le coordinate dei vertici del primo quadrato nel piano xy. La terza riga di codice definisce l'altezza del primo quadrato, fissando tutte le coordinate z a zero.
La quinta riga di codice crea l'oggetto patch con colore di riempimento verde e opacità del 50%. Il parametro 'FaceAlpha' viene utilizzato per impostare l'opacità del colore di riempimento.
La settima e l'ottava riga di codice creano un secondo quadrato sovrapposto al primo, ma posizionato ad un'altezza z=1. Infine, utilizziamo la funzione 'hold on' per mantenere la figura attiva e disegnare il secondo oggetto patch sulla stessa figura del primo.
Proviamo a spiegare un po' meglio come funzionano le cose. La tecnica è di specificare le coordinate di ciascun vertice e l'ordine in cui collegare i vertici per formare le facce. Si consideri il cubo di figura:
ognuna delle sei facce ha quattro vertici. Lo script qui sotto riportato realizza il cubo con la tecnica descritta:
clear
Esiste tuttavia un modo alternativo di utilizzare il comando patch, ovvero specificando tramite 2 sole matrici rispettivamente i vertici e facce della figura geometrica che si vuole creare.
La procedura da utilizzare prevede di creare 2 matrici, una composta da 3 colonne e N righe con le coordinate degli N vertici coinvolti e una seconda matrice che indica quali vertici sono coinvolti per generare una faccia.
Questa tecnica richiede lche la funzione patch(), venga richiamata con l'assegnazione esplicita di valori alle proprietà Vertices e Faces:
patch('Vertices',vertex_matrix,'Faces',faces_matrix)
Poiché la sintassi non assegna automaticamente i colori della faccia o del bordo, è necessario impostare le proprietà appropriate per produrre patch con colori diversi delle facce e del bordo (bianco è il colore predefinito delle facce e nero è il colore predefinito del bordo).
Il codice qui sotto riportato crea il cubo già visto colorandoogni faccia con un colore diverso e imponendo un colore uniforme delle facce.
vert = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
fac = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
patch('Vertices',vert,'Faces',fac,...
'FaceVertexCData',hsv(6),'FaceColor','flat')
view(3)
axis vis3d
Il colore delle facce è specificato tramite la proprietà FaceVertexCData che vuole come ingresso una matrice che ha lo stesso formato di una mappa di colori Matlab (ovvero un array N*3 di valori RGB), questo esempio utilizza la mappa di colori hsv per generare i sei colori richiesti per il colore uniforme delle facce.
È possibile interpolare il colore delle facce in questo caso ad ogni vertice viene assegnato un colore e nel passare da un vertice all'altro Matlab crea le sfumature di colore intermedie. Per fare questo è necessario specificare un colore per ciascun vertice e impostare la proprietà FaceColor su interp. Ad esempio, disegnando lo stesso cubo dell'esempio precedente:
vert = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];