MarkerSizeを座標の値と一致させたい

18 views (last 30 days)
Hernia Baby
Hernia Baby on 17 Feb 2022
Commented: Hernia Baby on 18 Feb 2022
【背景】
 現在、円同士をぶつけて軌道を変える反射のアニメーションを作成中です。
 演算自体はうまくいったのですが、グラフィックスがうまくいきません。
 マーカーサイズの設定が問題のようです。以下に例を示します。
【例題】
 半径 20 のマーカーを作成したいのですが、うまくいきません。
r = 40/2;
Xl = 100;
Yl = 100;
fig = figure;
ph = plot(0,0,'MarkerSize',2*r,'Marker','o','MarkerFaceColor','k');
grid on
xlim([-1 1].*Xl)
ylim([-1 1].*Yl)
pbaspect([1 1 1]);
 上記のように半径は20になっていません。
 figureのプロパティで 'Units' があるのでそこを設定するのかなと思っていますが、
 いまいちピンとこないため悩んでいます。
【補足】なぜPlotか
 コールバックでアニメーションを作っているからです。
 これは後にマウス等の操作と連携するために行っています。
 Plotは入れ子関数内で ph.XData / ph.YData の更新だけすればいいので楽だと思い選びました。
 現状はアスペクト比を合わせて、ph = axes('Unit', 'pixel')とすることで m ファイル上はうまくいってるように見えます。
 ほかの方法があれば、教えていただけると幸いです。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 18 Feb 2022
% MarkerSize — マーカー サイズ 6 (既定値) | 正の値
% マーカー サイズ。ポイント単位の正の値として指定します。1 ポイントは 1/72 インチです。
マーカーはグラフ内で特定の座標を目立たせる事が目的だから、グラフの表示サイズに左右されない画素単位の大きさで設定する仕様なのでしょう。グラフの表示サイズをdot by dotになるよう固定すればマーカのサイズとグラフの表示が一致するはずです。下図はグラフを拡大縮小表示してもマーカーの大きさが変わらない事を検証した結果です。
上記の様な縛りなくグラフ上に任意の円を描くには、円をプロットするのが妥当だと思います。
plot(10+5*cos(0:0.1:2*pi),10+5*sin(0:0.1:2*pi));
MATLABには、line関数はあってもcircle関数は無い様です。上記のようにplot関数1行で速く描けるから不要ですが。rectangle関数の「角丸機能」を使って円を描く裏技も下記に回答されていますね。またImage Processing Toolboxがあればviscircles関数が本質問の目的に最も適した方法ですね。Circle関数はちょっと用途が異なりますね。
  1 Comment
Hernia Baby
Hernia Baby on 18 Feb 2022
んー、やっぱり円を作るのがよさそうですね
自分も 公式のヒント を見てたのですが、circle作るのは計算コストがネックかなと考えてました…viscirclesはグラフと併用できるのかが課題ですかね
---------
MATLAB芸の練習としてブロック崩しのようなものを今回は考えていました
ご提案通り、円を作る入れ子関数を作成して動作させようと思います
ありがとうございました!

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!