花の曲線を描く

1.正葉曲線

はなびらを表現するのに基本になるのが正葉曲線です。バラ曲線ともいいます。

正葉曲線を表す式は、極座標における極方程式 r=sin(nθ) が基本ですが、nを分数にして

の形にします。nとkの値によってさまざまな図ができます。次の表はn,kが1から5までの組み合わせです。

k=1の場合は、θは0から2πまでの範囲で描けますが、kの値が2以上になるとθの範囲を広げる必要がでてきます。

これらをシミュレートするものを作ってみましょう。次のような画面構成です。

3つのスライダーを作って、n,kの値と描画範囲を設定できるようにします。n,kは整数にしますので、床関数 floor を使って

k=floor((F.x-C.x)*4+0.1)+1;

のようにします。0.1は誤差を吸収するためのものです。磁石ツールをONにしておくと、方眼の交点のところでちょうど吸い付くようにマッチするようになりますが、このとき誤差のために整数にならないことがあるためです。

実際の描画はデカルト座標系なので

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

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

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

として、fxとfyの媒介変数表示にして描きます。媒介変数なので、plot関数を用いればよいのです。

plot([fx(#),fy(#)],start->0,stop->th*pi,steps->200);

のようにします。thはスライダで設定した値です。また,steps の値によって曲線をなめらかに描くことができます。

ところで、極方程式 r=sin(nθ) で表される曲線は、nが偶数のときは2n枚の葉、nが奇数のときはn枚の葉が描かれますね。なぜこの違いができるのでしょうか。それは、上のシミュレータだけではちょっとわかりにくいでしょう。θの値の変化につれて、図がどのように描かれていくのかを理解しないとその理由はわかりません。そのようなものを作って、正葉曲線について少しつっこんで考えてみましょう。

題して、動的正葉曲線です。こちらに用意しました

2.sinをm乗にする

正葉曲線のカーブの具合は、sinθ の値の変化と関係しています。0付近よりも π/2 付近の方が増加・ 減少の具合が緩やかなのです。そのため、先端が丸くなります。では、このカーブの具合を変えるとどうなるでしょう。

だんだん細くなっていきますが、カーブの様子は余り変わりません。m乗すると太さが変わる、という感じです。

sinをm乗するとどうなるかを、直交座標系でのグラフの様子と合わせてシミュレートするものをつくりました。こちらにあります

なお、直交座標系でのsinの値の変化と極座標系での葉の描かれ方の関係をまだつかんでいない人は、動的正葉曲線を先に見るとよいでしょう。

3.フーリエ級数型にする

三角関数の和

で表される級数をフーリエ級数といいます。

このうち、sinの項だけの和にしたものはフーリエ正弦級数といいます。

ここでは、このフーリエ正弦級数の形を、正葉曲線に適用します。項をひとつ増やすと、花びらの先に波型ができます。

次の図はその一例です。

正葉曲線のツールにスライダを追加して、sinの項を3つまで追加できるようにします。

4. 折れ線にする

正葉曲線で同じ形の葉が何枚も描かれる理由は、sin(nθ)が周期関数だからです。では、他の周期関数を使ったらどうなるでしょう。

cos(nθ)では同じことなので、三角関数ではないものです。「葉の曲線を描く」で使ったノコギリ波はどうでしょう。そのままでは左右対称な葉にはなりませんので、同じ発想で、折れ線を使うことにしましょう。

折れ線のグラフは次のようになります。(xがθになっています)

これで葉(はなびら)を描きますが、極座標系では一周が2πですので、2πでちょうど極に戻るように、θの係数を調整します。

また、sについては、CindyScriptではmod関数を使います。CindyScriptでの定義式は

r(x):=(-1)^mod(floor(n/pi*x),2)*(n/pi*x-floor(n/pi*x))+mod(floor(n/pi*x),2);

となります。

三角関数の場合とことなり、はなびらの先端がとがった形になります。ガーベラやひまわりがこの形に近いでしょう。

このシミュレータはこちらにあります

5.先端に切れ目をいれる

ガーベラのようなはなびらでは、先端に切れ目というか、先端が欠けた形になっているものがあります。右側の折れ線の山のところを反転させると、そのような花びらができます。

こんなしかけになっています。

ulim=0.8;

h(x):=if(x<ulim,0,ulim-x);

r0(x):=(-1)^mod(floor(n/pi*x),2)*(n/pi*x-floor(n/pi*x))+mod(floor(n/pi*x),2);

r(x):=r0(x)+2*h(r0(x));

< 戻る >