2012-09-13 36 views
5

Tôi muốn tạo một âm mưu của bề mặt 3D trải rộng trên tất cả các điểm từ một đám mây điểm [X,Y,Z]. Ví dụ đây là một biểu đồ phân tán của đám mây điểm của tôi:Matlab Delaunay Triangulation của Cloud Point - Color Matrix

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

Scatter plot

Như bạn có thể thấy mỗi điểm dữ liệu có giá trị cường độ C.

bây giờ tôi thực hiện các tam giác

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

Và tôi nhận được bề mặt tam giác

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

Surface

Tuy nhiên, khi tôi cố gắng để thiết lập màu sắc của bề mặt bằng cách sử dụng

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

Tôi nhận được thông báo lỗi: "Cảnh báo: Dữ liệu màu không được đặt cho đổ bóng Interpolated", đó là do kích thước của C không khớp với Xb hoặc tri.

Làm cách nào để đảm bảo tôi nhận được màu bề mặt nội suy chính xác?

Trả lời

4

Bạn đã thay đổi số điểm trong tam giác vẽ bằng cách gọi freeBoundary: chỉ các điểm bề mặt còn lại, các điểm bên trong không thuộc bề mặt. Do đó, bạn phải trích xuất các giá trị C tương ứng với các điểm đó. Bạn có thể sử dụng 'intersect (...,' rows ')' để ánh xạ các điểm bề mặt Xb lên điểm gốc XYZ. Dựa trên bản đồ này, bạn trích xuất các giá trị cần thiết từ C. Mã dưới đây thực hiện điều này.

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

Tuyệt vời, cảm ơn bạn rất nhiều vì câu trả lời của bạn. Điều này hoạt động đẹp! –

+0

Xin lỗi, tôi không biết về điều đó –