丸毘沙門

丸毘沙門は弧を組み合わせて描きます。

弧は円の一部なので,中心と半径,そして描き始めと描き終わりの位置(角)を決めれば描けます。

中心と半径は求めやすいのですが,描き始めと描き終わりが問題です。

きちんとやるには数学を使うので,ちょっと復習しておきます。

数学の苦手なひとは,読み飛ばして,(4)スクリプトの全体 を打ち込んでやってみても構いません。

(1) 三角関数の復習

高校で誰もが学ぶ三角関数ですが,ここで簡単に復習しておきましょう。

円周上の点Pの位置が,x軸からθ(シータ)の角をなすところにあるとします。

Pからx軸に垂線を下すと直角三角形ができ,高さと斜辺の比が sinθ,底辺と斜辺の比が cosθ なので,cosθ=x/r, sinθ=y/r となります。

したがって,Pの座標は x=r cosθ,y=r sinθ と表せます。

   

Pが上図とは違う位置のときも,cosθ=x/r, sinθ=y/r と定義して(三角関数の定義), x=r cosθ,y=r sinθ と表すことにします。

また,角のとりかたとして,弧度法を使い,180°をπであらわします。(πは円周率)

(2) 丸毘沙門の弧を描く

丸毘沙門の基本図形の作図をみてみましょう。

この図で,まず弧KLを描くのですが,Lの位置がどのような角度にあるかをまず調べましょう。

まず,直線ACがx軸となる角はπ/6(30°)です。

次に,ALとACのなす角を求めましょう。

LからACに垂線LMを下しますと,cos∠LAM=AM/AL となります。

AL=LCなので(両方とも小さい円の半径)△ALCは二等辺三角形ですから,MはACの中点です。

大きい方の円の半径をR1,小さい方の円の半径をR2とすると,AL=R2,AM=R1/2 です。

このことから cos∠LAMが2つの円の半径から計算できることになります。

cos の値から逆に角を求めるには,cos の逆関数 arccos を用います。角をthとすると th=arccos(R1/(2*R2)) になります。

これで,Lの位置を表す角th が求められます。あとはこのthを使って,他の角も表せますね。

ではスクリプトを書きましょう。大きい方の円の半径が5,小さい方が3の場合です。

θは日本語入力で入れるのですが,それは面倒なので th で表すことにします。

    R1=5;

    R2=3.5;

    th=arccos(R1/R2/2);

これでACとALのなす角thが求められますので弧が描けます。

弧は arc(中心,半径,書き始め,描き終わり) という関数を使います。

    arc([0,0],R2,th+pi/6,5*pi/6-th);

とすれば弧KLが描けます。

他の弧も同様に描きます。

arc([0,0],R2,th+5*pi/6,3*pi/2-th);

arc([0,0],R2,th+3*pi/2,13*pi/6-th);

arc([R1*cos(pi/6),R1*sin(pi/6)],R2,7*pi/6-th,7*pi/6+th);

arc([R1*cos(5*pi/6),R1*sin(5*pi/6)],R2,-pi/6-th,-pi/6+th);

arc([0,-R1],R2,pi/2-th,pi/2+th);

これで基本パターンが描けますので,これをdrawpat() の中身にします。

(3) 平行移動量を計算する

まず横への平行移動ですが,真横ではなく右斜め上,点Cの位置とします。

        Shiftx=[R1*cos(pi/6),R1*sin(pi/6)];

です。

次に上ですが,今度は左斜め上,点Gの位置です。

        Shifty=[R1*cos(5*pi/6),R1*sin(5*pi/6)];

これで,始めの位置と回数を適当に設定して描くことができます。

(4) スクリプトの全体

以上をまとめて書くと,つぎのようになります。

    R1=5;

    R2=3.5;

    th=arccos(R1/R2/2);

    // 基本パターンを定義する

    drawpat():=(

arc([0,0],R2,th+pi/6,5*pi/6-th);

arc([0,0],R2,th+5*pi/6,3*pi/2-th);

arc([0,0],R2,th+3*pi/2,13*pi/6-th);

arc([R1*cos(pi/6),R1*sin(pi/6)],R2,7*pi/6-th,7*pi/6+th);

arc([R1*cos(5*pi/6),R1*sin(5*pi/6)],R2,-pi/6-th,-pi/6+th);

arc([0,-R1],R2,pi/2-th,pi/2+th);

    );

    Shiftx=[R1*cos(pi/6),R1*sin(pi/6)];  // 1行分描くための横への平行移動量

    Shifty=[R1*cos(5*pi/6),R1*sin(5*pi/6)];  // 上への平行移動量

    Start=[0,-6*R1]; //描き始めの位置

(5) 2円の半径比を変える。

2つの円の半径は変数に代入しているので,この値を変えるだけでパターンの太さを瞬時に変えることができます。

次の図は 10:7 (R1=5,R2=3.5)

次は 5:4 (R1=5,R2=4) の場合です。