
三次元で、ある座標からある座標に矢印を引きたいです。
8 views (last 30 days)
Show older comments
質問のように、三次元空間で矢印を引きたいと考えています。
座標は一点ではなく、複数ある場合、それぞれの座標の始点と終点を結ぶ直線矢印を引いて、まとめて表したいです。
こちらにあるデータは、始点と終点の座標データのみです。
X, Y, Z軸の範囲も自動で設定できるようなプログラムもあれば◎です。
よろしくお願いします。
0 Comments
Answers (1)
Akira Agata
on 21 May 2018
quiver3 関数を使う以下の方法では如何でしょうか。
p0 = [0,0,0; 1,0,0; 0,1,0; 1,1,0]; % 始点の座標
p1 = [0,0,1; 1,0,1; 0,1,1; 1,1,1]; % 終点の座標
v = p1 - p0; % ベクトル
figure
quiver3(p0(:,1),p0(:,2),p0(:,3),v(:,1),v(:,2),v(:,3),0)

11 Comments
Akira Agata
on 1 Jun 2018
Edited: Akira Agata
on 1 Jun 2018
各点のマーカーの色情報を保持しておいて、 scatter3 関数に引数として与えることで実現できます。例えば以下の例では、color という変数に初期状態での色情報 (ここでは初期状態における p の3列目の値) を保持しています。そのうえで、点の位置を更新した後、この変数を scatter3 関数の引数として与えることで、各点の位置が変わっても元の色で表示するようにしています。
% p: 始点の(x,y,z)座標×N個, v: 各始点に配置するベクトル
N = 50;
p = rand(N,3)*20;
p = sortrows(p,3,'descend'); % 3列目でソート
color = p(:,3);
v = ones(N,3)+rand(N,3);
markerSize = 30;
% 初期状態を表示
figure
quiver3(p(:,1),p(:,2),p(:,3),v(:,1),v(:,2),v(:,3),0)
hold on
scatter3(p(:,1),p(:,2),p(:,3),markerSize,color,'filled')
text(p(:,1),p(:,2),p(:,3),num2str((1:N)'))
view(-20,10)
title('Before')
h = colorbar;
h.Label.String = 'Initial value';
% 始点の位置を更新
p = rand(N,3)*20;
% 更新後の状態を表示(ただし各点の色は初期状態を維持)
figure
quiver3(p(:,1),p(:,2),p(:,3),v(:,1),v(:,2),v(:,3),0)
hold on
scatter3(p(:,1),p(:,2),p(:,3),markerSize,color,'filled')
text(p(:,1),p(:,2),p(:,3),num2str((1:N)'))
view(-20,10)
title('After')
h = colorbar;
h.Label.String = 'Initial value';


See Also
Categories
Find more on ベクトル場 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

