A01 アステロイド
軌跡とアニメーションの例です。
アステロイド曲線そのものは,媒介表示 x=cos(t)^3 , y=sin(t)^3 で描けますが,ここでやろうとしているのは,動円と定円の半径比が 1:4 のときの内サイクロイドとしてのアステロイドです。
Cinderellaでは,必要な幾何要素は作図ツールで作図し,それらをCindyscriptでコントロールすることになります。
動円の半径を1とすれば,アステロイドでは定円の半径は4になりますが,GeoGebraの例と同様にこれをスライダで設定することにします。すると,一般の内サイクロイドにも対応できます。
スライダは作図ツールで線分をとり,その上に点をのせます。線分がAB,点がCだとすると
r=ceil(|A,C|/|A,B|*8)+1;
で1〜9の整数値が取得できます。
スライダ上の点Cの下に値を表示するには
drawtext(C-[0.2,0.6],"r="+r);
とします。[0.2,0.6] は適当な値です。文字を大きくするには
drawtext(C-[0.2,0.6],"r="+r,size->16);
のように,size 修飾子(オプション)をつけます。フォントサイズです。
Shift+Enter でスクリプトを実行します。
次に,原点中心の円を「半径つき円を加える」で適当に作図します。
この円の識別子をC0とすると(識別子はインスペクタの「要素の情報」か,表示メニューの「式による表示」で見ることができます)
C0.radius=r;
で半径をrにすることができます。
次に動円です。「固定した半径の円を加える」ツールで半径1として作図するのがよいでしょう。中心はスクリプトでコントロールするので適当でよいです。
もうひとつ,定円上に点をとります。
これで要素は揃いました。あとはスクリプトです。
まず,動点Fの位置から角度を求めます。
th=F.angle;
この角 th を用いると,動円の中心Eの座標は
E.xy=E.xy=(r-1)*[cos(th),sin(th)];
となります。
次に,軌跡を描く点ですが,これは作図ツールではとりません。このあと,点Fを円周上をドラッグしていくことを考えると,始点が重なったときにFだけを選択するのが難しくなるためです。軌跡を描く点はスクリプトで描きます。
draw(E.xy+[cos(-(r-1)*th),sin(-(r-1)*th)]);
小さな緑の点が表示されます。
点Fをドラッグすると円Eも動き,緑の点が回転していくように見えます。
最後に,点の軌跡を描きます。点の位置は th で表されているわけですから,これを媒介変数とした形の式で描きます。定義域を0からth とすれば,始点から現在地までが描かれます。
ここまでのスクリプトをまとめると次のようになります。
r=ceil(|A,C|/|A,B|*8)+1;
drawtext(C-[0.2,0.6],"r="+r,size->16);
C0.radius=r;
th=F.angle;
E.xy=(r-1)*[cos(th),sin(th)];
draw(E.xy+[cos(-(r-1)*th),sin(-(r-1)*th)]);
plot((r-1)*[cos(t),sin(t)]+[cos(-(r-1)*t),sin(-(r-1)*t)],start->0,stop->th);
Shift+Enter でスクリプトを実行します。
次に,これをアニメーションにするには,GeoGebraのようにスライダーを作って自動で動かすのではなく,コンピュータの内部時計を利用して th を動かします。
まず,Simulation Start スロットに
resetclock();
を書きます。内部時計の現在の時刻を0にします。
次に,Timer Tick スロットに
th=seconds();
を書きます。内部時計から時刻を取得します。
Timer Tickスロットにスクリプトを書くと,画面左下にアニメーションのコントローラができます。
先ほどは点Fの位置で th を取得していたので,Drawスロットの
th=F.angle;
を消して,
F.xy=r*[cos(th),sin(th)];
に書き換えます。
さらに,点EとFの初期位置を Initialization スロットで決めます。
r=ceil(|A,C|/|A,B|*8)+1;
E.xy=[r-1,0];
F.xy=[r,0];
1行目がDrawスロットの記述と重複しますが,これがないとrが決まりません。
Web上で動かせるものをこちらに用意しました。コントローラがはっきりしませんが,左側が PLAY,右側が STOP です。
このページの下からダウンロードすることもできます。