寄木
寄木を作ります。
寄木は次のような模様です。
これを描くためのパターンはいくつか考えられますが,ここでは次のものを基本パターンとします。
斜めの線が3つ欠けているように見えますがこれでよいのです。これを並べると,きちんとつながります。
(1) 線分を一つと,それを平行移動したものを描く。
線分は draw([p1,p2]) で描くことができます。p1とp2 が端点の座標です。
たとえば
draw([[0,0],[0,2]]);
draw([[1,0.5],[1,2.5]]);
で次のように線分を2本描くことができます。
ここで,右側の線分は,左側の線分を右上に平行移動したものになっています。平行移動量は右へ1,上へ0.5です。
そこで,この平行移動量を変数に代入して(文字で表して),左側の座標に加えて描画すれば右側の線分が描けます。
あとのために,左側の座標も変数にしておきましょう。
s1=[[0,0],[0,2]];
sh1=[[1,0.5],[1,0.5]];
s2=s1+sh1;
draw(s1);
draw(s2);
s1 の s は segment(線分)のsです。shはシフト(shift)のshです。
こうしておくと,もう1本ずらしたものを描くならば
s3=s2+sh1;
draw(s3);
とすればよいわけです。これで縦の線3本が引けました。
座標を直接書くよりもタイプ量は少なくなる上,やっていることの意味がわかりやすくなります。
ちょっと比較してみましょう。
すべて座標で書くと
draw([[0,0],[0,2]]);
draw([[1,0.5],[1,2.5]]);
draw([[2,1],[2,3]]);
変数を使って平行移動を利用すると
s1=[[0,0],[0,2]];
sh1=[[1,0.5],[1,0.5]];
s2=s1+sh1;
s3=s2+sh1;
draw(s1);
draw(s2);
draw(s3);
変数を使う方が行数は多いですね。しかし,あとでまとめて線分を描く方法をやりますので,draw() をたくさん書かなくても済むようになります。
いずれか,わかりやすい方でやればよいで
(2) パターンを描く
同様にして斜めの線も描きますが,s1,s2・・ と線分を表す座標が定義できたのですから,これをまとめて描画することを考えましょう。
線分は全部で9本あります。これを「リスト」にします。リストは,次のようにものを集めて(リストアップ)[ ] の中に入れたものです。
このリストに対して処理をしてまとめて描きます。
seg=[s1,s2,s3,s4,s5,s6,s7,s8,s9];
forall(seg,draw(#));
とすると,9本の線分が描けます。
forall() というのは,seg というリストのそれぞれの要素に対してある処理(ここでは draw(#) )をする関数です。
それぞれの要素が # で表されます。 color->[0,0,0] で色を黒にします。
9本の線分の定義とともにはじめから書くと次のようになります。これをdrawpat() の中身にします。
drawpat():=(
s1=[[0,0],[0,2]];
sh1=[[1,0.5],[1,0.5]];
s2=s1+sh1;
s3=s2+sh1;
s4=[[0,2],[2,3]];
sh2=[[-1,0.5],[-1,0.5]];
s5=s4+sh2;
s6=s5+sh2;
s7=[[0,2],[-2,3]];
sh3=[[0,-1],[0,-1]];
s8=s7+sh3;
s9=s8+sh3;
seg=[s1,s2,s3,s4,s5,s6,s7,s8,s9];
forall(seg,draw(#));
);
drawpat(); の先頭の // を削除して実行すると基本パターンが描かれます。
※ 変数や平行移動,リストなどがわかりにくい場合は,draw()で9本書いてももちろん結構です。
(3) パターンを平行移動して描く
横に並べるには,横方向に4だけ平行移動するので,
Shiftx=[4,0];
です。
縦に並べるときはちょっとずらしますので
Shifty=[-2,3];
とします。左上です。右上にするなら [2,3] です。どちらでも結構です。
あとは,描き始めの位置と横と縦の描画数を適当に決めて描きましょう。
< 描画手順をプログラムするに戻る >