刺し子模様をPythonで描く:基本2・青海波
プログラム全体の構造は「基本1:麻の葉」に書いたものと同じ。
今回は折れ線ではなく弧で描く。そのため,下請け関数として,弧を描く drawarc() を作る。
弧は円の一部。たとえば,次の弧は,半径2の円の,60°のところから120°のところまで描けばよい。
円周上の点は,三角関数 sin と cos を用いて表せる。たとえば,60°のところは
つまり,半径 r の円周上の点は,角を t とすると, x = r cos(t) , y = r sin(t) と表せるので,これをそのまま方程式として(媒介変数表示)plot() でグラフを描けば円が描ける。はじめとおわりの角を指定すれば弧になる。st を描き始め,en を描き終わりとしよう。
# 弧を描く 引数は 中心,半径,描き始めと描き終わりの角
def drawarc(center, r, st, en):
t = np.linspace(st, en, 100)
x = r*np.cos(t) + center[0]
y = r*np.sin(t) + center[1]
plt.plot(x, y, lw=1, color=Drawcolor)
これを使って,ある刺し子の本に載っていたのが次のような模様を描く。青海波(せいがいは)と呼ばれている模様だ。
弧を3つ描いたのが基本パターンだ。
外側の弧は半円。半径を2として描く。drawarc(org+[2, 1], 2, 0, 3.14)
半円の描き終わりは弧度法でπなので3.14 とした。もちろん,np.pi としてよいのだが,このあとと形式をそろえた。つまり,内側の2つは重なりを考えると半円より少し出るように描く。この「少し出る」は,計算で出すのは面倒なので,試行錯誤で値を決めるわけだ。
# 基本パターンをorgを原点として描く
def basicpattern(org):
drawarc(org+[2, 1], 2, 0, 3.14)
drawarc(org+[2, 1], 1.5, -0.05, 3.19)
drawarc(org+[2, 1], 1, -0.3, 3.42)
これで画面設定を
plt.figure(figsize=(8, 6))
plt.axis([15, 35, 0, 15])
とし,描画設定( 横方向のシフト量,縦方向のシフト量,描画色)を
Shiftx = np.array([4, 0])
Shifty = np.array([2, 2])
Drawcolor = 'blue'
drawpattern(9, 8)
として描いたのが先ほどの図だ。
これはこれでよいとして,ネットで「青海波」を検索してみると,少し形が違う。弧が4つのものが多い。しかし刺し子では刺す手間の関係か,弧は2本か3本だ。
上のように,外側の弧を半円にしておくと,平行移動量を決めやすい。半円でないと,これまた計算するのは面倒なので,試行錯誤ということになる。
たとえば,
drawarc(org+[2, 1], 2, 0.26, 2.88)
drawarc(org+[2, 1], 1.5, 0.3, 2.86)
drawarc(org+[2, 1], 1, 0.25, 2.92 )
として,平行移動量を
Shiftx = np.array([3.9, 0])
Shifty = np.array([2, 1.5])
とすると,次のようになる。
今度は,同心円の半径をわずかに変え,それに合わせて,開始角と終了角も調整した。外側の弧は同じなので,平行移動量も同じだ。
drawarc(org+[2, 1], 2, 0.26, 2.88)
drawarc(org+[2, 1], 1.4, 0.3, 2.86)
drawarc(org+[2, 1], 0.8, 0.25, 2.98 )
このように,わずかに数値を変えることでいろいろなパターンを簡単に作ることができるのがコンピュータの強みだ。
刺し子のためには線を太くするのは意味がなく,弧も4つでは刺すのが手間だ。しかし,模様として描くのであれば,線を太く,弧を4つにすることもできる。それが見出し画像だ。
プログラム全体を載せておこう。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.axis([15, 35, 0, 15])
plt.xticks([]) # 目盛を非表示にする
plt.yticks([])
# 横方向にm,縦方向にn個のパターンを描く
def drawpattern(m, n):
for x in range(m):
for y in range(n):
org = x*Shiftx + y*Shifty
basicpattern(org)
# 弧を描く 引数は 中心,半径,描き始めと描き終わりの角
def drawarc(center, r, st, en):
t = np.linspace(st, en, 100)
x = r * np.cos(t)+center[0]
y = r * np.sin(t)+center[1]
plt.plot(x, y, lw=1, color=Drawcolor)
# 基本パターンをorgを原点として描く
def basicpattern(org):
drawarc(org+[2, 1], 2, 0.26, 2.88)
drawarc(org+[2, 1], 1.5, 0.3, 2.86)
drawarc(org+[2, 1], 1, 0.25, 2.92 )
# 横方向のシフト量,縦方向のシフト量,描画色を定義して描く
Shiftx = np.array([3.9, 0])
Shifty = np.array([2, 1.5])
Drawcolor = 'blue'
drawpattern(9, 8)
#plt.savefig("seigaiha.png")
plt.show()
以上が円弧を使った描画の基本。刺し子模様は線分と円弧の組み合わせになっているものが多い。
次回は,麻の葉で使っている斜眼について考えてみよう。