1

Matlabで円筒面をプロットすることに関する質問があります。X, Y, Z私のデータセットは、対応する強度値を持つ座標の点群で構成されていますC

scatter3次の関数を使用してそれらをプロットできます。

figure
scatter3(X,Y,Z,8,C)

次の画像になります。

ただし、点ではなく、このオブジェクトの表面をプロットしたいと思います。Delaunay三角形分割を使用してこれを達成しようとしました

tri     = delaunay(X,Y);
figure
trisurf(tri,X,Y,Z,C,'FaceColor','interp')

スクリーンショットへのリンク

画像からわかるように、三角測量に問題があるため、結果は私が望むものではありません。X私には、アルゴリズムが同じものを取得してY複数回調整するという事実にうまく対応していないように見えます。

ヘルプページで紹介されている例に従ってTriRep、次のアプローチを使用しようとしました。

dt = DelaunayTri(X,Y,Z);
tr = TriRep(dt, X, Y, Z);

TriRep関数を呼び出すと次のエラーメッセージが表示されるため、残念ながら成功しませんでした。

??? ==>TriRepパラメータの使用エラーは「ダブルマトリックス」である必要があります。

ジオメトリを制約する必要があると思います。ここでは、関数を使用して例1の解決策を見つけたと思いますが、これを計算するにfreeBoundaryは関数の出力が必要です。TriRepそれは私が立ち往生しているところです。ご覧のとおり、私は三角測量の専門家ではありません。ご協力いただければ幸いです。ありがとう!

4

1 に答える 1

2

必要なのは単純な三角測量ではなく、一連の点の凸包だと思います。

2Dでの凸包の古典的なアナロジー-
点のセットがボード上の釘であると想像すると、凸包は、点の周りに輪ゴムを伸ばすことによって形成されるポリゴンです-つまり、外部ポイントですが、内部ポイントではありません。

これを拡張すると、3D凸包は、点群の外側の点の「スキン」であると考えることができます。

凸包は、より複雑な計算幾何学手法の出発点ですが、あなたの場合は、探しているメッシュが得られます。

Matlabのバージョンは使用していませんが、非常に簡単に見えます:http: //www.mathworks.com/help/techdoc/ref/convhulln.html

編集:以下のコメントを確認した後:すでにTriRep構造を使用している場合は、それを使用して面の法線を取得し、面の法線が真っ直ぐ上/下に近い三角形を削除できます。たとえば、MatlabのFaceNormalsドキュメントページhttp://www.mathworks.com/help/techdoc/ref/trirep.facenormals.htmlの例から始める場合:

numpts = 100;
thetha = rand(numpts,1)*2*pi;
phi = rand(numpts,1)*pi;
x = cos(thetha).*sin(phi);
y = sin(thetha).*sin(phi);
z = cos(phi);
dt = DelaunayTri(x,y,z);
[tri Xb] = freeBoundary(dt);
tr = TriRep(tri, Xb);
P = incenters(tr);
fn = faceNormals(tr);
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8);

次に、法線を単純に実行し、zの大きさが大きい面を削除できます。

for(i=196:-1:1)
    if(abs(fn(i,3))>0.8)
        tri(i)=[];
    end
end
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),'FaceColor','red','faceAlpha',0.7);

HTH-RC

于 2012-04-30T16:52:35.987 に答える