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

38 views (last 30 days)
知真 梶山
知真 梶山 on 26 Aug 2021
Commented: 知真 梶山 on 11 Oct 2021
m1_1,m1_2,...,m8_4,m8_5(計40点)それぞれのxyz座標データがあります。これらの点群を三次元空間にプロットし、隣接する点を繋ぐことで表面形状モデルを作製するためにはどうすれば良いでしょうか。
  2 Comments
Hernia Baby
Hernia Baby on 27 Aug 2021
すみません、これってどのような表面形状が正解なのでしょうか?
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])
知真 梶山
知真 梶山 on 27 Aug 2021
回答ありがとうございます。
それぞれの三次元データは8✕5行列の格子状に配置にされています。
具体的には、m1_1からm1_5までが一行目、m2_1からm2_5までが二行目...といった形です。
膝関節上面の周辺皮膚にマーカーを貼付して得た座標データで、膝関節上面の皮膚表面形状モデルを作製したいです。

Sign in to comment.

Accepted Answer

源樹 上林
源樹 上林 on 14 Sep 2021
座標データと言うことですが、説明を聞く限り各変数は格子状に並んでいるようなのでそのままイメージ図の通り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 Comments
Hernia Baby
Hernia Baby on 15 Sep 2021
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);
知真 梶山
知真 梶山 on 11 Oct 2021
ありがとうございました。
解決しました。

Sign in to comment.

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!