B01 インボリュート曲線

円周上にまき付けられた糸を緩むことなくほどいていくときの曲線(円の伸開線)です。

これがはじめの状態で 少しほどいたところ


まずこの図を描きましょう。

はじめの図は,円と,半径ABの作図です。円を描いてから,円周上に点をとります。

次の図ですが,緑の点はCindyscriptで描いています。点をとってもよいのですが,すると初期状態で点Bと重なってしまい,点Bを動かそうとしたときにうまく選択できません。(式による表示を出して選択することは可能)

そこで,次のスクリプトで図を描きます。

r=C0.radius;

z1=complex(B.xy);

th=B.angle;

p=[r*cos(th)+r*th*sin(th),r*sin(th)-r*th*cos(th)];

draw(p);

draw([B,p]);

1行目:円の半径を取得しています。

2行目:点Bが表す複素数をz1とします。

3行目:動径ABが表す角度を取得します。

4行目:糸の先の点の座標です。

5行目:点pを表示します.

6行目:線分を表示します。

これで,点Bをドラッグしていくと糸がほどかれていきます。

次に軌跡を描くのですが,これは媒介変数表示を用いてplot()で描きます。上のスクリプトのpがそのまま媒介変数表示になっているので

plot([r*cos(t)+r*t*sin(t),r*sin(t)+r*t*cos(t)],start->0,stop->th);

を追加します。

さて,これでだいたいはいいのですが,点Bの位置で取得した角は360度までです。

GeoGebraのページ(まだ開いていない人はこちら)でも,GeoGebraでは360までしか取得できないので,円周上の点を駆動点とする代わりに,半直線の上に駆動点を作成しています。

しかし,Cinderellaでは,角を測る作図ツールでとれば一般角で取得できるのでそのようにしましょう。

そのために,x軸上に半径ACをとり,角を測るツールで∠CABを測ります。

ちょっと図がごちゃごちゃしていますが,角を表す識別子はα0なので,これを利用します。

角の表示は不要なので,インスペクタで非表示にします。

スクリプトの,thの取得部分を書換えますが,その前に,やっておくことがあります。

BとCが始点で一致すると,前述のように駆動点Bだけを選択しにくくなります。

これを解決するために,インスペクタを用いて,点Cの大きさを小さくし,ピンで留めておきます。ラベルも非表示にしておきましょう。(ついでに半径の線分のラベルも)

では,スクリプトを書換えます。

th=α0;

こんどは2周目もちゃんと描けます。

次にこれをアニメーションにします。

Simulation Start スロットに reset clock() を書きます。

Timer Tick スロットに th=seconds() を書きます。画面左下にコントローラができます。

Draw スロットの th=α0 の代わりに B.xy=r*[cos(th),sin(th)]; を書きます。

Shift+Enter でスクリプトを実行します。

これで,プレイボタンを押すとアニメーションが始まります。

ストップボタンを押したら,Shift+Enter でもう一度スクリプトを実行し,点Bを元に戻します。

アニメーションはこちらにあります

また,このページの下からダウンロードして使うこともできます。