葉の曲線を描く

1.シンプルな葉の曲線

葉の曲線を式で表すことを考えます。まず、シンプルな曲線

を描いてみます。指数m,nの値によって曲線が変わります。m,nは実数です。

指数 m,n の値をインタラクティブに変えながら曲線の様子を調べることのできるツールを作りましょう。

0から1までの範囲で描画するため、拡大ツールを使って画面のスケールを調整しておきます。

指数 m,n はスライダで変えるようにします。線分を引いておいて、その上に点を置きます。次のような画面構成です。

「下半分も描く」ボタンは、文字入力ツールで作成します。始めは単なる文字列です。これをボタンとして働かせるために、インスペクタを開いて、「ボタンとして使う」にチェックを入れます。これだけですと、ボタンを押したとき ON/OFF のスイッチのようになるので、次の「押すだけのボタン」にもチェックを入れます。また、クリックするたびに「下半分も描く」と「下半分を消す」に表示を切り替えるために、フラグを使います。ここでは、drawflag という名前にして、スクリプトの欄に drawflag=!drawflag と書いておきます。これでボタンを押すたびに、drawflagの値が ture と false に交互に切り替わります。

では、スクリプトエディタを開いてスクリプトを書きましょう。始めに曲線の式と、ボタンの初期状態をInitializationスロットに書いておき、あとはDrawスロットに書きます。

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

f(x):=x^m*(1-x)^n;

drawflag=false;

Text0.val="下半分も描く";

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

m=(E.x-A.x)*5;

n=(F.x-C.x)*5;

drawtext([0.1,0.6],"$y=x^m(1-x)^n$ のグラフ",size->20);

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

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

drawtext([-0.05,-0.07],"O",size->16);

drawtext([1-0.02,-0.07],"1",size->16);

if(drawflag,

   Text0.val="下半分を消す",

   Text0.val="下半分も描く";

   );

plot(f(#),start->0,stop->1);

if(drawflag,plot(-f(#),start->0,stop->1));

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

Draw スロットで、mとnをスライダの位置から読み取りますが、EとFがスライダ上の点、AとCがスライダの左の点です。スライダを作るときの手順によってこの名前は変わります。

2.ぎざぎざをつける

葉にぎざぎざをつけます。ぎざぎざの曲線には、次の「のこぎり波」を使いましょう。

方程式は y=x-[x] です。[x] はxを超えない最大の整数で、[ ] はガウス記号とも呼ばれます。

CindyScriptでは、床関数の floor を用います。

y=x-[x] は実際には次のような不連続な線です。これを上のノコギリのようにするには、グラフを描く plot 関数に connect->true というオプションをつけます。

これで葉にぎざぎざをつけますが、葉の膨らみ具合に応じてぎざぎざの程度も変わるように、葉の曲線とノコギリ波を単に足すのではなく、次のような式にします。

pは縦方向の倍率、qは歯の数です。0から1までの範囲で描きます。

次のようなスクリプトです。

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

m=2;

n=1;

p=3;

q=10;

f(x):=x^m*(1-x)^n;

g(x):=p*(x-floor(x*q)/q);

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

m=(E.x-A.x)*5;

n=(F.x-C.x)*5;

p=(M.x-G.x)*10;

q=floor((N.x-K.x)*7+8);

drawtext([0.1,0.6],"$y=x^m(1-x)^n$ と",size->20);

drawtext([0.1,0.4],"$y=p(x-[x*q]/q)$ の合成",size->20);

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

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

drawtext([M.x,M.y+0.05],"p="+p,size->16);

drawtext([N.x,N.y+0.05],"q="+q,size->16);

drawtext([-0.05,-0.07],"O",size->16);

drawtext([1-0.02,-0.07],"1",size->16);

plot(f(#)*(1+g(#)),start->0,stop->1,connect->true);

plot(-(f(#)*(1+g(#))),start->0,stop->1,connect->true);

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

3.カージオイドを描く

カージオイド(心臓形)は、ハスやフキの葉に似た形です。

方程式は極方程式でよく表されますが、媒介変数表示でも

と表されます。

これに2つの係数をつけてみます。

スクリプトは「1.シンプルな葉の曲線」で作ったものを少し直すだけです。ただ、画面のスケールは変えておきます。

媒介変数表示なので

fx(t):=(n*cos(t)+1)*cos(t);

fy(t):=m*(n*cos(t)+1)*sin(t);

で定義をおこない、

plot([fx(#),fy(#)],start->0,stop->2*pi+0.1);

で表示します。係数によって次のようになります。

< 戻る >