2012-09-13 85 views
5

我想創建一個橫跨點雲的所有點的3D曲面圖。例如,這是我的點雲的散點圖:Matlab Delaunay點雲三角剖分 - 顏色矩陣

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

Scatter plot

正如你可以看到每個數據點具有強度值C

我現在進行的三角測量

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

而且我得到的三角面

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

Surface

然而,當我嘗試設置表面使用

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

我收到錯誤消息:「警告:顏色數據未設置爲插值着色」,這是由於C的大小不匹配Xbtri這一事實造成的。

如何確保我得到正確的插值曲面顏色?

回答

4

您已通過調用freeBoundary更改了繪製的三角測量中的點數:只留下曲面點,內點不屬於曲面。因此,您必須提取與這些點相對應的C值。您可以使用'intersect(...,'rows')'將曲面點Xb映射到原始點集XYZ上。根據這張地圖,你從C中提取所需的值。下面的代碼是這樣做的。

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

輝煌,非常感謝你的回答。這工作很好! –

+0

對不起,我不知道 –