2012-09-13 8 views
5

Vorrei creare una trama della superficie 3D che si estenda su tutti i punti da una nuvola di punti [X,Y,Z]. Per esempio, questo è un grafico a dispersione della mia nuvola di punti:Matlab Delaunay Triangolazione della nuvola di punti - Color Matrix

scatter3(X,Y,Z,5,C)

Scatter plot

Come si può vedere ogni punto di dati ha un valore di intensità C.

ora effettuare la triangolazione

dt  = DelaunayTri(X,Y,Z); 
[tri Xb]= freeBoundary(dt); 

E ho la superficie triangolata

figure 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8); 

Surface

Tuttavia, quando si tenta di impostare il colore della superficie utilizzando

trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),C,'EdgeAlpha',0,'FaceColor','interp') 

Viene visualizzato il messaggio di errore: "Avviso: Colore dati non impostato per ombreggiatura interpolata", dovuto al fatto che la dimensione di C non corrisponde a Xb o tri.

Come posso essere sicuro di ottenere il colore di superficie interpolato corretto?

risposta

4

Hai cambiato il numero di punti nella triangolazione tracciata chiamando freeBoundary: solo i punti di superficie sono lasciati, i punti interni non appartengono alla superficie. Pertanto, è necessario estrarre i valori C corrispondenti a tali punti. Puoi usare 'intersect (...,' rows ')' per mappare i punti di superficie Xb sul set di punti originale XYZ. Sulla base di questa mappa si estrae i valori necessari da C. Il codice seguente lo fa.

clear all; 

XYZ = rand(100,3); 
X=XYZ(:,1); 
Y=XYZ(:,2); 
Z=XYZ(:,3); 
C=rand(size(X)); 

scatter3(X, Y, Z, 5,C); 

dt = DelaunayTri(X, Y, Z); 
[tri Xb]=freeBoundary(dt); 

% map Xb onto XYZ 
[~,IA,IB]=intersect(XYZ, Xb, 'rows'); 

% extract the needed colors using the IA map 
Cn  = C(IA); 

% permute the surface triangulation points using IB map 
Xbn  = Xb(IB,:); 

% map the point numbers used in triangle definitions 
% NOTE: for that you need inverse map 
iIB(IB) = 1:length(IB); 
trin = iIB(tri); 

trisurf(trin,Xbn(:,1),Xbn(:,2),Xbn(:,3),Cn,'EdgeAlpha',0,'FaceColor','interp'); 
+0

Brillante, grazie mille per la risposta. Funziona magnificamente! –

+0

Scusa, non lo sapevo –

Problemi correlati