寄木

寄木を作ります。

寄木は次のような模様です。

これを描くためのパターンはいくつか考えられますが,ここでは次のものを基本パターンとします。

斜めの線が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] です。どちらでも結構です。

あとは,描き始めの位置と横と縦の描画数を適当に決めて描きましょう。