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スロットに書かれています。