sakiko.cdy を作る

このページでは,sasiko.cdy がどのように作られているかを解説します。

模様を描く手順は

(1) ひとつのパターンを描く。

(2) (1) を関数化する

(3) パターンをコピーするために,平行移動量を計算する

(4) 平行移動を繰り返して描画する

(5) 変数を用意して全体を関数化する。

となります。

(1) ひとつのパターンを描く

Cindyscriptには,線分を描いたり,曲線を描くための「関数」が用意されています。

ここでいう「関数」は「ある働きをするもの」という意味です。

学校の数学で学んだ「関数」も,実は「ある働きをする」ものです。

たとえば, y=2x+1 という1次関数は,あるxの値に対して,「xを2倍して1を足す」という働きをします。

数学では,関数を f(x)=2x+1 とも書きました。そして,xが3のときの値を求めようと思ったら f(3) とするのでした。

Cindyscript でも関数を f(x) のように定義して,使うときは f(3) のようにして使います。

Cindyscript にはあらかじめ用意されている関数があります。次に使う draw(・・)という関数は,線分を描く関数で,・・には線分の両端の座標を書きます。

ここでは,簡単な「檜垣」を例に作っていきます。

檜垣の基本パターンは,3本の線分で描けます。

    draw([[0,0],[2,2]]);

    draw([[0,0],[3,-3]]);

   draw([[1,-1],[2,0]]);

とすれば基本パターンが描けます。

なお,背景はインスペクタで白にしておきました。

(2) パターンを関数化する。

パターンを関数化するには,適当な名前を決めて,全体を()でくくります。

functionname():=( 処理 )

で関数が定義できます。

(1) のスクリプト全体を()でくくって名前を付けます。名前は drawpat とでもしましょう。

drawpat():=(

        draw([[0,0],[2,2]]);

        draw([[0,0],[3,-3]]);

       draw([[1,-1],[2,0]]);

   );

これで関数の定義ができたので

drawpat();

とすると基本パターンが描かれます。

(3) パターンを平行移動して描く

基本パターンを平行移動します。このとき,一つ一つの点を平行移動するのではなく,座標軸の平行移動を使います。座標軸ごと平行移動してしまうのです。

ただし,座標軸ごと平行移動して描画したら,その座標軸を元に戻しておかなければなりません。

そうしないと,つぎに座標を指定したときに,思わぬところに行ってしまいます。

Cindyscriptでは,そのために gave() と grestore() という関数が用意されています。

gsave() 現在の画面の状態(座標軸の位置など)を記憶する

grestore() 画面の状態を記憶した状態に戻す

では,元のパターンと,それを[2,0]だけ平行移動した図の2つを描いてみましょう。

座標軸の平行移動は translate(移動量)です。

    drawpat();

    gsave();

    translate([2,0]);

    drawpat();

    grestore();

(4) 横1列分を描く

横1列にたとえば10個のパターンを描きます。

(3)の     translate([2,0]);  drawpat(); を10回繰り返せば平行移動しながら描いていくので,最後に grestore() で戻せばよいでしょう。

繰り返しは repeat(回数,内容) とします。

gsave();

repeat(10,

translate([2,0]);

drawpat();

);

grestore();

画面に表示しきれていませんが10個描かれています。

最初のパターンが描かれていませんが,これは平行移動してから描画しているからです。

gsave();

repeat(10,

drawpat();

translate([2,0]);

);

grestore();

とすれば,最初のパターンを描いてから平行移動します。

(5) 縦方向にも移動する。

縦方向にも移動します。同じように translate() で移動すればよいですね。

縦方向に移動したら,横一列分を描くようにします。

移動量は,変数 Shiftx と Shifty にしておきます。

また,原点からスタートではなく,描き始めの位置を決められるようにしましょう。

描き始めの位置を Start とします。

        Shiftx=[2,0];

        Shifty=[0,4];

        Start=[-20,-12];

repeat(10,s,

gsave();

translate(Start+(s-1)*Shifty);

repeat(10,

drawpat();

translate(Shiftx);

);

grestore();

);

ここで,繰り返し数の10 の次の s は,何回目かを表す変数です。

次に,このスクリプト(繰り返し部分)を関数化します。横と縦の描画する数を引数として与えることにしましょう。

    makemoyou(xn,yn):=(

repeat(yn,s,

gsave();

translate(Start+(s-1)*Shifty);

repeat(xn,

drawpat();

translate(Shiftx);

);

grestore();

);

    );

この関数は,描く模様によって変える必要はないので,Initialization スロットに書きます。

なお,sakiko.cdy には,弧を描く関数

    // 弧を描く center:中心 r:半径 st,en:描き始めと描き終わりの角

    arc(center,r,st,en):=(

plot([r*cos(#)+center_1,r*sin(#)+center_2],start->st,stop->en,steps->200);

    );

もInitializaitonスロットに書かれています。

「描画手順をプログラムする」に戻る