Me gustaría crear una parcela de la superficie 3D, que se extiende sobre todos los puntos de una [X,Y,Z] nube de puntos. Por ejemplo este es un gráfico de dispersión de mi nube de puntos:

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

Matlab triangulaciones de Delaunay de la Nube de puntos del Color de la Matriz

Como se puede ver, los datos de cada punto tiene un valor de intensidad C.

Yo ahora llevar a cabo la triangulación

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

Y me superficies trianguladas

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

Matlab triangulaciones de Delaunay de la Nube de puntos del Color de la Matriz

Sin embargo, cuando intento configurar el color de la superficie utilizando

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

Me sale el mensaje de error: «Advertencia: los Datos de Color no está configurado para Interpolados sombreado», lo cual es debido al hecho de que el tamaño de C no coincide con Xb o tri.

Cómo puedo asegurarme de obtener la correcta interpolados color de superficie?

OriginalEl autor space-dementia | 2012-09-13

1 Comentario

  1. 4

    Ha cambiado el número de puntos en la trazada de la triangulación llamando freeBoundary: sólo la superficie de los puntos están a la izquierda, el interior de los puntos que no pertenecen a la superficie. Por lo tanto, usted tiene que extraer los valores de C que corresponden a esos puntos. Puede usar ‘se cruzan(…, ‘filas’)’ mapa de la superficie de los puntos de Xb en el original conjunto de puntos XYZ. Con base en este mapa de extraer los valores necesarios de C. El código de abajo.

    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');
    Genial, muchísimas gracias por tu respuesta. Esto funciona muy bien!
    Lo siento, yo no sé nada de eso

    OriginalEl autor angainor

Dejar respuesta

Please enter your comment!
Please enter your name here