動的にグラフを描画する

点が動きながらグラフを描いていくというツールの作り方です。

時間とともに変化していくのですから、コンピュータの内部時計を使います。そのための関数と環境がCindyScriptには用意されています。

環境というのは、内部時計にアクセスしたりするコードを書かなくてもすむように、すでに用意されているものです。それが、Timer Tickスロットです。

このスロットに t=seconds(); と書くと、内部時計を参照してその時刻がtに代入されます。このとき、絶対的な時刻ではなく、resetclock()関数を実行してから経過した時間が取得されるのです。resetclock() は、SimulationStart  スロットに書いておきます。

こうすると、Cinderellaの画面の左下にコントロールボタンが現れます。

Timer Tickスロットには次のようなコードを書いておきます。

===========================================================================

t=v*seconds();

if(t<tstop,

  P.x=fx(t);

  P.y=fy(t);

  plotrose(0,t);

  Q.x=2.5+t/2;

  Q.y=r(t);

  plot(r(2*(#-2.5)),start->2.5,stop->2.5+t/2);

  ,

  plotrose(0,tstop);

  plot(r(2*(#-2.5)),start->2.5,stop->2.5+tstop/2);

);

if(t>tstop,drawtext([0.1,-2.3],"描画終了 STOPボタンを押してください",color->[1,0,0],size->16););

===========================================================================

画面のプレイボタンを押すと、Simulation Startスロットに書いた resetclock() が実行された後、このスロットのコードが実行されます。

まず1行目で時刻を取得します。このスロットはおよそ1ミリ秒ごとに実行され、seconds()によって時刻が刻々と代入されるのです。

係数vによって実行の速度を調整しています。

tstop は描画を終了するtの値です。それ以前であれば if 分の前半を実行します。点Pと点Qの位置を関数値で決め、plotrose(0,t)で0からt、つまりその時のtの値までグラフを描画します。これにより、点P,Qのあるところまでグラフが描かれるのです。

時刻が tstopを超えたら、if 文の後半を実行します。tstopまで描画します。時刻はどんどんすぎていきますが、描画されるのはtstopまでです。

なお、plotroseは自作した、正葉曲線を描画する関数、plotはCindyScriptに用意されている、グラフを描く関数です。

そのほか、必要は初期設定は Initializationスロットに書き、スライダの位置からパラメータを取得するコードは Draw スロットに書きます。

「正葉曲線を動的に描く」ページで使っているツールの全コードをつぎに掲載しておきます。

==== Initialization ======================

n=2;

k=1;

m=0;

v=0.5;

tstop=2*pi;

r(t):=sin(n*t/k)+m;

fx(t):=r(t)*cos(t);

fy(t):=r(t)*sin(t);

reset():=(

  P.x=fx(0);

  P.y=fy(0);

  Q.xy=[2.5,r(0)];

);

reset();

// バラ曲線 fx,fy をsからeまで描く

plotrose(s,e):=(

  nn=500;

  p1=[fx(s),fy(s)];

  repeat(nn,t,

    p2=[fx(s+(e-s)*t/nn),fy(s+(e-s)*t/nn)];

    draw(p1,p2);

    p1=p2;

  );

);

==== Draw ============================

n=floor((C.x-A.x)*4+0.01)+1;

k=floor((R.x-N.x)*4+0.01)+1;

m=U.x-S.x;

v=P0.x-Y.x;

drawtext([C.x+0.05,C.y+0.1],"n="+n,size->16);

drawtext([R.x+0.05,R.y+0.1],"k="+k,size->16);

drawtext([U.x+0.05,U.y+0.1],"m="+m,size->16);

drawtext([2.5+pi/2-0.05,-0.2],"π",size->16);

drawtext([2.5+pi-0.1,-0.2],"2π",size->16);

==== Timer TIck =========================

t=v*seconds();

if(t<tstop,

  P.x=fx(t);

  P.y=fy(t);

  plotrose(0,t);

  Q.x=2.5+t/2;

  Q.y=r(t);

  plot(r(2*(#-2.5)),start->2.5,stop->2.5+t/2);

  ,

  plotrose(0,tstop);

  plot(r(2*(#-2.5)),start->2.5,stop->2.5+tstop/2);

);

if(t>tstop,drawtext([0.1,-2.3],"描画終了 STOPボタンを押してください",color->[1,0,0],size->16););

==== Simulation Start ======================

resetclock();

====================================

戻る