見出し画像

刺し子模様をPythonで描く:基本2・青海波

プログラム全体の構造は「基本1:麻の葉」に書いたものと同じ。
今回は折れ線ではなく弧で描く。そのため,下請け関数として,弧を描く drawarc() を作る。
弧は円の一部。たとえば,次の弧は,半径2の円の,60°のところから120°のところまで描けばよい。

画像5

円周上の点は,三角関数 sin  と cos を用いて表せる。たとえば,60°のところは

画像6

つまり,半径 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)

これを使って,ある刺し子の本に載っていたのが次のような模様を描く。青海波(せいがいは)と呼ばれている模様だ。

画像1

弧を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)

画像2

これで画面設定を
   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])

とすると,次のようになる。

画像3

今度は,同心円の半径をわずかに変え,それに合わせて,開始角と終了角も調整した。外側の弧は同じなので,平行移動量も同じだ。

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つでは刺すのが手間だ。しかし,模様として描くのであれば,線を太く,弧を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()


以上が円弧を使った描画の基本。刺し子模様は線分と円弧の組み合わせになっているものが多い。

次回は,麻の葉で使っている斜眼について考えてみよう。