三次元で、ある座標か​らある座標に矢印を引​きたいです。

7 ビュー (過去 30 日間)
Haru Kame
Haru Kame 2018 年 5 月 19 日
コメント済み: Haru Kame 2018 年 6 月 4 日
質問のように、三次元空間で矢印を引きたいと考えています。
座標は一点ではなく、複数ある場合、それぞれの座標の始点と終点を結ぶ直線矢印を引いて、まとめて表したいです。
こちらにあるデータは、始点と終点の座標データのみです。
X, Y, Z軸の範囲も自動で設定できるようなプログラムもあれば◎です。
よろしくお願いします。

回答 (1 件)

Akira Agata
Akira Agata 2018 年 5 月 21 日
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 件のコメント
Akira Agata
Akira Agata 2018 年 6 月 1 日
編集済み: Akira Agata 2018 年 6 月 1 日
各点のマーカーの色情報を保持しておいて、 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';
Haru Kame
Haru Kame 2018 年 6 月 4 日
ご返信ありがとうございます。
現在、全ての座標がはじめの色を維持するような図を考えております。 試行錯誤しておりますので、不明な点がありましたら再度ご質問させて頂きます。
その途中で少し気になったことがありましたので、ご質問させて頂きます。 ベクトルを図示し、オブジェクトを回転させたところ、添付図のように角度によって矢印が見えづらくなっていることに気づきました。 ある角度からは、矢印が棒に見えてしまい、改善したいと考えております。
矢印の太さを変更しても変わりなく、どうやら矢印が扁平の表示であることが原因のようです。
よろしくお願いいたします。

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

カテゴリ

Help Center および File Exchangeベクトル場 についてさらに検索

Community Treasure Hunt

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

Start Hunting!