第9回 インタラクティブにグラフを動かす

シンデレラの図形描画(幾何)CindyScriptを使うと、インタラクティブにグラフを動かすソフトが簡単にできます。たとえば、係数を変化させてそれとともにグラフを変化させる。逆はちょっと難しくなりますが、グラフを動かして、対応する式を変化させることもできます。ここでは、係数を変化させてグラフを動かすものを作ってみましょう。

係数を変化させる方法はいくつかありますが、ここでは「スライダー」を作ります。

音楽編集で使うミキサーはご存知でしょうか。レバーをぐーと引いて音量を上げたり絞ったり。あれがスライダーです。

(1) 画面下のツールから「座標軸を描く」と「グリッドを描く」をクリックします。

(2) 「線分を追加する」ツールボタンを選んで(クリックし)、適当な場所に線分を引きますが、x軸に平行か、y軸に平行にして端点の座標が整数になるようにするとよいでしょう。端点をぴったり格子点(座標が整数の点)に合わせるには、画面下の「スナップ」ツール(磁石アイコン)をクリックして有効にしておくとよいでしょう。こうすれば、格子点の近くに点をドラッグしたとき、びたっと引き寄せられます。最初の点は合わせにくいので、とりあえず線分を描いておいて、「要素を動かす」モードにして(ツールボタンを押して)格子点に合わせればよいでしょう。

次の図は、x座標が5の点から11の点まで線分を引いたものです。これがスライダー。

今度はこの上にレバーとなる点を乗せます。

(3) 「点を追加する」ツールボタンを選んでスライダ上に点を取ります。点Cがとれましたね。

これでスライダは完成。次はCindyScriptです。

「スクリプト」メニューからCindyScriptを選んでスクリプトエディタを開きます。

2次関数を定義しますが、今度は係数も可変にするので、係数をcaとでもしておきましょう。単にaだと、線分の名称aとバッティングしてしまいますので、2文字にしましょう。つまり、caとxの2変数の関数を定義することになります。

----------------------------------------------------------------------------------------------------------

f(ca,x):=ca*x^2;

----------------------------------------------------------------------------------------------------------

このcaをスライダで変化させればいいわけです。そのために、スライダ上の点Cのx座標から点Cの位置を計算して、それをcaの値としましょう。

スクリプトの意味ですが、2行目はわかりますね。C.xは点Cのx座標です。点Cと点Aの位置関係からcaを決めています。

3行目がグラフを描く関数。xの代わりに実行変数#をつかうのがポイントです。

4行目は式の表示。drawtext()は文字表示の関数。書式は、drawtext(座標,文字列) です。(5,4)が表示位置。"y"に続いて、+ca でcaの値も表示できます。文字列はダブルクウォートでくくります。caは変数なのでくくりません。また、xの指数の2は、unicodeの00B2です。入力のしかたがわからない場合は ^2 でもいいでしょう。

これで、「要素を動かす」モードにして、スライダ上の点Cを動かしてみましょう。

こだわる人は、caが1のときの y=1x² が気に入らないとか、caが-1 のときの y=-1x² が気に入らないとか言うでしょうね。そういう場合は、「条件判断」を使って表示を変えていけばいいのです。

もし ca=1 ならばy=x² にする。そうでなくて

もし ca=-1 ならば y=-x² にする。そうでなければ y=cax² にする。

という論理です。

この、「もし AならばB、そうでなければC」というのは、if() 関数で実行します。()のなかに処理を書きます。

ただし、注意が一つ。「等しい」は「==」で表します。「=」だと代入を意味することになります。

BASIC言語では(Visual Basic , VBAなど)「代入」も「等しい」も「=」ですが、C言語、Java、Mathematica などは、「等しい」は「==」でなければなりません。

したがって、式の表示部分は次のようにします。

---------------------------------------------------------------------------------------

if(ca==1,fx="y=x²",

     if(ca==-1,fx="y=-x²",fx="y="+ca+"x²")

  );

drawtext((5,4),fx);

---------------------------------------------------------------------------------------

if()関数で表示する文字列を作ってそれをfxに代入し、drawtext()で表示します。

ところが、じっさいにやってみるとうまくいきません。というのは、コンピュータの計算原理に伴う誤差のためです。

そこで、「だいたい等しい」という「~=」をつかいます。チルダと等号です。

---------------------------------------------------------------------------------------

if(ca~=1,fx="y=x²",

     if(ca~=-1,fx="y=-x²",fx="y="+ca+"x²")

  );

drawtext((5,4),fx);

---------------------------------------------------------------------------------------

さて、これでも、ca=0のときは y=0x² と表示されてしまいます。これも条件分岐で修正すればいいですが、あえてそのままでもいいかもしれません。2次関数は係数が0のときは放物線にならない、ということで。「いや、やはり y=0 にしたい」という人は、条件分岐を追加してやってみましょう。