2012-09-13 21 views
5

[X,Y,Z]ポイントクラウドからすべてのポイントにわたる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のサイズがXbまたはtriと一致しないために発生します。

補間されたサーフェスの色が正しいことを確認するにはどうすればよいですか?

答えて

4

freeBoundaryを呼び出してプロットされた三角形分割のポイント数を変更しました。サーフェスポイントのみが残され、インナーポイントはサーフェスに属しません。したがって、これらの点に対応するCの値を抽出する必要があります。サーフェスポイントXbを元のポイントセットXYZにマップするには、 'intersect(...、' rows ')'を使用します。このマップに基づいて、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

申し訳ありませんが、私はそれについて知らなかった –

関連する問題