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);
view(-37.5,30);

 

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
close all
 
% Faccia 1 ABFE
% Definizione delle coordinate dei vertici del poligono
x = [0 1 1 0];
y = [0 0 0 0];
z = [0 0 1 1];
 
% Creazione dell'oggetto patch con colore di riempimento verde
patch(x, y, z, 'g', 'FaceAlpha', 0.5)
 
hold on;
 
% Faccia 2 ABCD
x = [0 1 1 0];
y = [0 0 1 1];
z = [0 0 0 0];
patch(x, y, z, 'y', 'FaceAlpha', 0.5)
 
 
% Faccia 3 DCGH
x = [0 1 1 0];
y = [1 1 1 1];
z = [0 0 1 1];
patch(x, y, z, 'p', 'FaceAlpha', 0.5)
 
 
% Faccia 4 EFGH
x = [0 1 1 0];
y = [0 0 1 1];
z = [1 1 1 1];
patch(x, y, z, 'r', 'FaceAlpha', 0.5)
 
 
% Faccia 5 AEHD
x = [0 0 0 0];
y = [0 0 1 1];
z = [0 1 1 0];
patch(x, y, z, 'b', 'FaceAlpha', 0.5)
 
 
% Faccia 6 BFGC
x = [1 1 1 1];
y = [0 0 1 1];
z = [0 1 1 0];
patch(x, y, z, 'w', 'FaceAlpha', 0.5)
view(-37.5,30)
 

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 risultato è:

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];
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(8),'FaceColor','interp')
view(3)
axis vis3d

 

Il risultato è:
 
Per specificare una colorazione personalizzata utilizzando la tecnica x, y, z, c, (coordinate del vertice e relativo colore) c deve essere una matrice m*n*3, dove le dimensioni di x, y e z sono m*n. La figura prova a spiegare la corrispondenza tra le proprietà FaceVertexCData e CData:
 
Maggiori informazioni su come colorare le superfici patch possono essere trovate nell'Help Center all'indirizzo https://it.mathworks.com/help/matlab/creating_plots/how-patch-data-relates-to-a-colormap.html
Ultime modifiche: lunedì, 1 gennaio 2024, 16:10