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

3 ビュー (過去 30 日間)
Hernia Baby
Hernia Baby 2022 年 2 月 17 日
コメント済み: Hernia Baby 2022 年 2 月 18 日
【背景】
 現在、円同士をぶつけて軌道を変える反射のアニメーションを作成中です。
 演算自体はうまくいったのですが、グラフィックスがうまくいきません。
 マーカーサイズの設定が問題のようです。以下に例を示します。
【例題】
 半径 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 ファイル上はうまくいってるように見えます。
 ほかの方法があれば、教えていただけると幸いです。

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 2 月 18 日
% 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 件のコメント
Hernia Baby
Hernia Baby 2022 年 2 月 18 日
んー、やっぱり円を作るのがよさそうですね
自分も 公式のヒント を見てたのですが、circle作るのは計算コストがネックかなと考えてました…viscirclesはグラフと併用できるのかが課題ですかね
---------
MATLAB芸の練習としてブロック崩しのようなものを今回は考えていました
ご提案通り、円を作る入れ子関数を作成して動作させようと思います
ありがとうございました!

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

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeグラフィックス パフォーマンス についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!