丸毘沙門
丸毘沙門は弧を組み合わせて描きます。
弧は円の一部なので,中心と半径,そして描き始めと描き終わりの位置(角)を決めれば描けます。
中心と半径は求めやすいのですが,描き始めと描き終わりが問題です。
きちんとやるには数学を使うので,ちょっと復習しておきます。
数学の苦手なひとは,読み飛ばして,(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) の場合です。