2012-09-13 31 views
5

Me gustaría crear un trazado de la superficie 3D que abarque todos los puntos desde una nube de puntos [X,Y,Z]. Por ejemplo, este es un gráfico de dispersión de mi nube de puntos:Matlab Delaunay Triangulación de Nube de puntos - Matriz de color

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

Scatter plot

como se puede ver cada punto de datos tiene un valor de intensidad C.

ahora llevo a cabo la triangulación

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

Y consigo la superficie triangulada

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

Surface

Sin embargo, cuando intento para establecer el color de la superficie usando

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

Recibo el mensaje de error: "Advertencia: los datos de color no están configurados para el sombreado interpolado", que se debe a que el tamaño de C no coincide con Xb o tri.

¿Cómo puedo asegurarme de obtener el color correcto de la superficie interpolada?

Respuesta

4

Ha cambiado el número de puntos en la triangulación graficada al llamar a freeBoundary: solo quedan los puntos de superficie, los puntos interiores no pertenecen a la superficie. Por lo tanto, debe extraer los valores C que corresponden a esos puntos. Puede usar 'intersect (...,' rows ')' para mapear los puntos de superficie Xb en el punto original establecido XYZ. Basado en este mapa, extrae los valores necesarios de C. El código siguiente lo hace.

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, muchísimas gracias por su respuesta. Esto funciona maravillosamente! –

+0

Lo siento, no sabía de eso –

Cuestiones relacionadas