필터 지우기
필터 지우기

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

조회 수: 13 (최근 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!