見出し画像

刺し子模様をPythonで描く:籠目・二重籠目

次の図が籠目。見出し画像は二重籠目。

画像1

 刺し子模様をプログラムで描く楽しみは,基本パターン:最小のパターンをどう撮ればよいかを考えることだ。一種のパズルといえようか。
 籠目は正六角形が並んでいる。その間に三角形があるが,基本パターンをどうとればよいだろうか。
 二重籠目になると難しくなる。とりかたはいろいろあるだろうから,ともかく,それを重なりなく並べて全体ができればよい。基本パターンの形だけでなく,それをどう並べるかも考える必要がある。

少し考えてもらうことにしよう。

∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞

刺し子模様の本に載っている模様は,日本古来のものだけでもいろいろある。「亀甲」と名前のつくものでもいろいろあるし,この籠目も亀甲のバリエーションとも考えられる。

籠目

さて,籠目の基本パターンは正六角形ひとつ,でよいだろうか。斜眼を使って座標を拾って描いてみよう。

# 基本パターンをorgを原点として描く
def basicpattern(org):
   p1=[1, 0]
   p2=[0, 1]
   p3=[-1, 1]
   p4=[-1, 0]
   p5=[0, -1]
   p6=[1, -1]
   draw(org, syagan(2, [p1, p2, p3, p4, p5, p6, p1]))
# 横方向のシフト量,縦方向のシフト量,描画色を定義して描く
Shiftx = np.array([np.sqrt(3), 1])
Shifty = np.array([0, 2])

これ以外の,draw(),drawpattern(),syagan() などは今までに使ってきたものをそのまま使う。

二重籠目その1

では,二重籠目はどうか。これは結構難しい。たとえば次のようにとる。

画像2

# 基本パターンをorgを原点として描く
def basicpattern(org):
   p1=[-2, 5]
   p2=[-2, 4]
   p3=[-2, 3]
   p4=[-1, 3]
   p5=[0, 2]
   p6=[-2, 2]
   p7=[-2, 0]
   p8=[0, -2]
   p9=[2, -2]
   p10=[2, 0]
   p11=[2, 1]
   p12=[3, -2]
   p13=[3, -3]
   p14=[2, -3]
   p15=[1, -3]
   p16=[2, -4]
   draw(org, syagan(2, [p1, p2, p3, p4]))
   draw(org, syagan(2, [p2, p10]))
   draw(org, syagan(2, [p11, p9]))
   draw(org, syagan(2, [p5, p6, p7, p8, p12]))
   draw(org, syagan(2, [p8, p15, p13]))
   draw(org, syagan(2, [p15, p16, p14]))
# 横方向のシフト量,縦方向のシフト量,描画色を定義して描く
Shiftx = np.array([2.5*np.sqrt(3), 2.5])
Shifty = np.array([0, 5])

重なっていないかどうかは,drawpattern(2, 1),drawpattern(1, 2) のようにして2つだけ表示してみるとよい。

二重籠目その2

 籠目で正六角形に着目したために,二重籠目その1では,正六角形を基準に考えた。しかし,竹で組んだ籠をイメージして,その竹の方に着目したらどうだろう。

画像3

点の数が12個。p1からp4,p5からp8,・・と,それぞれ反時計回りにとっている。これで,6本の線を引けばよい。

def basicpattern(org):
   p1=[0, 0]
   p2=[0, 4]
   p3=[-1, 4]
   p4=[-1, 0]
   p5=[1, 0]
   p6=[-3, 0]
   p7=[-2, -1]
   p8=[2, -1]
   p9=[0, 1]
   p10=[4, -3]
   p11=[4, -2]
   p12=[0, 2]
   draw(org, syagan(2, [p1, p2]))
   draw(org, syagan(2, [p3, p4]))
   draw(org, syagan(2, [p5, p6]))
   draw(org, syagan(2, [p7, p8]))
   draw(org, syagan(2, [p9, p10]))
   draw(org, syagan(2, [p11, p12]))

こちらの方がすっきりしている。
ところで,反時計回りにとったのは意味がある。閉じた図形にすると色塗りができるのだ。

二重籠目カラー版

 刺し子の下絵としては色塗りをする必要はないが,デザインとしては色塗りができるといい。
 plt.plot(x,y) で,x , y の座標列で表された点を結んで曲線(折れ線)を描くのだが,閉じた図形の場合には,plt.fill(x,y) で色塗りができる。
 まず,色塗りした図形を描く関数 fillpoly() を追加しよう。draw() と同じ形式なので,draw() をコピーして,plt.plot(・・・) のところを plt.fill(・・・)に書き換えす。draw()の次に入れておくとよい。

# 閉じた領域を色塗りする 
def fillpoly(org, plist):
   x = []
   y = []
   for pt in plist:
       x.append(org[0]+pt[0])
       y.append(org[1]+pt[1])
   plt.fill(x, y, color=Fillcolor)

Fillcolor は Drawcolor と同じように定義する。

basicpattern() の draw(・・) の前に次の3行を追加する。

    fillpoly(org, syagan(2, [p1, p2, p3, p4, p1]))
    fillpoly(org, syagan(2, [p5, p6, p7, p8, p5]))
    fillpoly(org, syagan(2, [p9, p10, p11, p12, p9]))

線の色と塗る色を次のように設定しよう。色は好みで。

Drawcolor = '#AA8844'
Fillcolor = '#EED088'

次のように描ける。

画像4