Main Content

ラインに沿ったオブジェクト グループの移動

この例では、変換を使用して、ラインに沿ってオブジェクトのグループをまとめて移動する方法を説明します。

正弦波をプロットし、軸の範囲モードを手動に設定することで、アニメーションのループ中にその範囲が再計算されないようにします。

x = linspace(-6,6,1000);
y = sin(x);
plot(x,y)
axis manual

変換オブジェクトを作成し、その親を現在の座標軸に設定します。ラインの先頭にマーカーとテキスト注釈をプロットします。その点の y 座標の値をテキストに変換するには、関数 num2str を使用します。2 つのオブジェクトの親を変換オブジェクトに設定することで、これら 2 つのオブジェクトをグループ化します。

ax = gca;
h = hgtransform('Parent',ax);
hold on
plot(x(1),y(1),'o','Parent',h);
hold off
t = text(x(1),y(1),num2str(y(1)),'Parent',h,...
    'VerticalAlignment','top','FontSize',14);

変換オブジェクトの Matrix プロパティを更新することで、マーカーおよびテキストをラインに沿って後続の各点に移動します。変換行列を決定するには、ライン上の次の点と最初の点の x 座標および y 座標を使用します。ラインに沿って移動する y 座標の値にテキストを更新していきます。ループを反復するたびに更新内容を画面に表示するには、drawnow を使用します。

for k = 2:length(x)
    m = makehgtform('translate',x(k)-x(1),y(k)-y(1),0);
    h.Matrix = m;
    t.String = num2str(y(k));
    drawnow
end

アニメーションでは、マーカーとテキストがラインに沿って一緒に移動する様子が表示されます。

データが大量にある場合は、アニメーションを高速化するために、drawnowではなく drawnow limitrate を使用することもできます。ただし、drawnow limitrate は画面に一部の更新結果を描画しないことがあります。

参考

| | | | |

関連するトピック