MATLAB Answers

xyz座標のベクトル​​データ(散布データ​)​から3次元メッシ​ュプ​ロットや表面積​の出し方

8 views (last 30 days)
和大 坂田
和大 坂田 on 20 Dec 2020
Edited: Atsushi Ueno on 17 Oct 2021
Excelやテキストファイルにx, y,z のデータがそれぞれベクトルデータ(散布データ)として定義されています。
このデータを使用して3次元メッシュプロットを描き表面積のを求める方法を教えてください。
  2 Comments
源樹 上林
源樹 上林 on 15 Oct 2021
convexHull なんて便利なのがあったのか。例題はyのデータがゼロだから polyarea で面積出せそうですね。
もしyにも凹凸がある場合は、面積計算は cross を利用できます。外積の半分で三角形の面積になるので delaunay で作った三角形の面積を全部足し合わせれば表面積が出ます。

Sign in to comment.

Answers (2)

Kenta
Kenta on 27 Dec 2020
clear;clc;close all
ptCloud = pcread('teapot.ply');
pcshow(ptCloud);
ptCloud=pcdownsample(ptCloud,"random",0.1);
P=double(ptCloud.Location);
% k = boundary(P);
% trisurf(k,P(:,1),P(:,2),P(:,3),'Facecolor','red','FaceAlpha',0.1)
DT = delaunayTriangulation(P(:,1),P(:,2),P(:,3));
tetramesh(DT,'FaceAlpha',0.3);
[K,v] = convexHull(DT);
trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3))
こんにちは、源樹 上林さまのおっしゃるように、delauney三角形を作成すれば、それらしいものはできます。
試したことはないのですが、以下のようなツールもあるようです。いろいろと試してみていい感じのメッシュができたら面積計算を試みてはどうでしょうか
http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?Doc/Installation

Atsushi Ueno
Atsushi Ueno on 16 Oct 2021
Edited: Atsushi Ueno on 17 Oct 2021
回答に際し今知った関数を使ってみたのですが、理解が浅いためか使い勝手が悪いです。
  • アルファ形状の作成時に指定する「アルファ半径」が謎
  • 何故か面積の値が倍になります。表と裏があるって事でしょうか (追記)見た目から明らかに「アルファ形状」は三角メッシュです。三角形1個を構成する2辺の外積を求めているのであれば、2で割って三角形の面積にしなければならないという事なのでしょうか?surfaceAreaの仕様がよくわかりません
Excelやテキストファイルに定義されたベクトルデータ(散布データ)はこういう事ですよね
n = 10; % xyz:ベクトルデータ(散布データ)の例を作成
xyz(:, 1) = repmat((0:n)', [n+1 1]);
xyz(:, 2) = repelem((0:n)', n+1);
xyz(:, 3) = rand((n+1)^2, 1);
plot(xyz) % xyz:ベクトルデータ(散布データ)の例
shp = alphaShape(xyz, 1.9); % アルファ形状を作成
totalsurfarea = surfaceArea(shp) % アルファ形状の表面積を計算
totalsurfarea = 221.9298
plot(shp);
xyz(:, 3) = rand((n+1)^2, 1).* eps; % xyz:ベクトルデータ(散布データ)をまっすぐに伸ばす
shp = alphaShape(xyz, 1.0); % アルファ形状を作成
totalsurfarea = surfaceArea(shp) % アルファ形状の表面積を計算
totalsurfarea = 200
plot(shp);

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!