三次元データのプロット、および表面の作製方法

10 ビュー (過去 30 日間)
知真 梶山
知真 梶山 2021 年 8 月 26 日
コメント済み: 知真 梶山 2021 年 10 月 11 日
m1_1,m1_2,...,m8_4,m8_5(計40点)それぞれのxyz座標データがあります。これらの点群を三次元空間にプロットし、隣接する点を繋ぐことで表面形状モデルを作製するためにはどうすれば良いでしょうか。
  2 件のコメント
Hernia Baby
Hernia Baby 2021 年 8 月 27 日
すみません、これってどのような表面形状が正解なのでしょうか?
5点ずつ区切って形を確認してみましたが、表面のイメージがつかず。
教えていただけると幸いです。
以下のコードで確認しました。
xlsreadがここではエラーを出すので実行していません。
clc,clear,close all;
[a,~,~] = xlsread('test.csv');
a = reshape(a,5,3,[]);
figure
hold on
%
for i = 1:length(a(1,1,:))
plot3(a(:,1,i),a(:,2,i),a(:,3,i))
end
view([45 45 45])
知真 梶山
知真 梶山 2021 年 8 月 27 日
回答ありがとうございます。
それぞれの三次元データは8✕5行列の格子状に配置にされています。
具体的には、m1_1からm1_5までが一行目、m2_1からm2_5までが二行目...といった形です。
膝関節上面の周辺皮膚にマーカーを貼付して得た座標データで、膝関節上面の皮膚表面形状モデルを作製したいです。

サインインしてコメントする。

採用された回答

源樹 上林
源樹 上林 2021 年 9 月 14 日
座標データと言うことですが、説明を聞く限り各変数は格子状に並んでいるようなのでそのままイメージ図の通りsurfで法線方向座標をプロットすれば形状確認はできそうに思えます。
とそう思ってCSVのデータプロットしてみたらそうでもなかった。XY方向にも動きがあるんですね。こういうときはdelaunayがお手軽で便利です。
m1_1 = [ 358.05338, 430.87082, 826.53064 ];
m1_2 = [ 326.88449, 437.67047, 850.28442 ];
m1_3 = [ 289.87347, 433.9791, 856.91333 ];
m1_4 = [ 252.77789, 420.93857, 838.33868 ];
m1_5 = [ 236.10527, 406.71243, 805.83411 ];
m2_1 = [ 354.6514, 461.47131, 810.47113 ];
m2_2 = [ 323.91965, 471.54459, 837.18304 ];
m2_3 = [ 289.70773, 472.93338, 845.51227 ];
m2_4 = [ 252.55437, 462.20703, 827.73413 ];
m2_5 = [ 237.63062, 442.59842, 792.58661 ];
m3_1 = [ 347.18051, 497.32794, 794.21545 ];
m3_2 = [ 323.71375, 510.78693, 822.89734 ];
m3_3 = [ 287.95007, 514.03876, 832.8432 ];
m3_4 = [ 251.94568, 499.6821, 818.96051 ];
m3_5 = [ 238.07593, 476.57538, 776.11658 ];
m4_1 = [ 342.39886, 525.78735, 776.37512 ];
m4_2 = [ 322.71704, 550.37683, 807.2923 ];
m4_3 = [ 284.51257, 549.69696, 822.16364 ];
m4_4 = [ 245.24339, 539.22327, 803.24414 ];
m4_5 = [ 238.00352, 507.22263, 760.30524 ];
m5_1 = [ 337.84744, 547.58301, 748.3476 ];
m5_2 = [ 323.07324, 579.12714, 779.57544 ];
m5_3 = [ 284.36349, 600.61273, 791.66931 ];
m5_4 = [ 242.84502, 573.34869, 772.87305 ];
m5_5 = [ 239.48238, 532.96143, 737.95685 ];
m6_1 = [ 343.68552, 561.8822, 716.70215 ];
m6_2 = [ 320.9787, 596.68811, 732.81891 ];
m6_3 = [ 287.44376, 609.18402, 748.54913 ];
m6_4 = [ 250.82326, 585.45685, 730.01233 ];
m6_5 = [ 241.52846, 548.89648, 711.6355 ];
m7_1 = [ 346.49258, 572.64832, 680.45886 ];
m7_2 = [ 322.8775, 599.43933, 690.47034 ];
m7_3 = [ 286.68451, 611.22833, 693.69623 ];
m7_4 = [ 258.4942, 586.58246, 687.50818 ];
m7_5 = [ 249.45985, 553.3764, 673.15729 ];
m8_1 = [ 349.63242, 573.29773, 644.07483 ];
m8_2 = [ 327.58649, 601.42102, 653.94299 ];
m8_3 = [ 291.32361, 610.70789, 658.89539 ];
m8_4 = [ 262.84415, 588.19733, 647.61121 ];
m8_5 = [ 249.68108, 557.64923, 638.48401 ];
mx = [
m1_1(1) m1_2(1) m1_3(1) m1_4(1) m1_5(1);
m2_1(1) m2_2(1) m2_3(1) m2_4(1) m2_5(1);
m3_1(1) m3_2(1) m3_3(1) m3_4(1) m3_5(1);
m4_1(1) m4_2(1) m4_3(1) m4_4(1) m4_5(1);
m5_1(1) m5_2(1) m5_3(1) m5_4(1) m5_5(1);
m6_1(1) m6_2(1) m6_3(1) m6_4(1) m6_5(1);
m7_1(1) m7_2(1) m7_3(1) m7_4(1) m7_5(1);
m8_1(1) m8_2(1) m8_3(1) m8_4(1) m8_5(1);
];
my = [
m1_1(2) m1_2(2) m1_3(2) m1_4(2) m1_5(2);
m2_1(2) m2_2(2) m2_3(2) m2_4(2) m2_5(2);
m3_1(2) m3_2(2) m3_3(2) m3_4(2) m3_5(2);
m4_1(2) m4_2(2) m4_3(2) m4_4(2) m4_5(2);
m5_1(2) m5_2(2) m5_3(2) m5_4(2) m5_5(2);
m6_1(2) m6_2(2) m6_3(2) m6_4(2) m6_5(2);
m7_1(2) m7_2(2) m7_3(2) m7_4(2) m7_5(2);
m8_1(2) m8_2(2) m8_3(2) m8_4(2) m8_5(2);
];
mz = [
m1_1(3) m1_2(3) m1_3(3) m1_4(3) m1_5(3);
m2_1(3) m2_2(3) m2_3(3) m2_4(3) m2_5(3);
m3_1(3) m3_2(3) m3_3(3) m3_4(3) m3_5(3);
m4_1(3) m4_2(3) m4_3(3) m4_4(3) m4_5(3);
m5_1(3) m5_2(3) m5_3(3) m5_4(3) m5_5(3);
m6_1(3) m6_2(3) m6_3(3) m6_4(3) m6_5(3);
m7_1(3) m7_2(3) m7_3(3) m7_4(3) m7_5(3);
m8_1(3) m8_2(3) m8_3(3) m8_4(3) m8_5(3);
];
T = delaunay(mx, my);
trisurf(T,mx,my,mz);
こんな感じであってますか?
4点で1面作るには4点が同一平面上にないと歪んでしまい、場合によってはまともに面が作れません。なので三角形で面を作成しています。
ところで「表面形状モデル」ということですが、形状データをファイル出力して別ソフトに読ませるなどの利用ですか?それともプロットまでのことを指していますか?
  2 件のコメント
Hernia Baby
Hernia Baby 2021 年 9 月 15 日
delaunay関数は初めて知りました
少しコンパクトにしたので、コメントにて補足しておきます
A = readmatrix('test.csv',"OutputType","double");
X_mat = reshape(A(1:3:end-2 ),[],5);
Y_mat = reshape(A(2:3:end-1 ),[],5);
Z_mat = reshape(A(3:3:end ),[],5);
T = delaunay(X_mat,Y_mat);
trisurf(T,X_mat,Y_mat,Z_mat);
知真 梶山
知真 梶山 2021 年 10 月 11 日
ありがとうございました。
解決しました。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!