見出し画像

刺し子模様をPythonで描く:斜眼を使う・紗綾形

 刺し子模様を手で描くとき,ものによっては斜眼用紙を使う。たとえば,麻の葉。基本パターンを作るのにこんな図を使った。

画像1

この背景が斜眼。正三角形になっている。この図はCinderellaで作った。
見出し画像は,斜紗綾形。これも背景を見てわかる通り斜眼だ。
 Cinderellaでは,標準的な作図機能として,方眼とどちらかを選べるようになっている。「正三角形」と書いたが,実際には平行四辺形だ。上の図でいうと,点Cの位置(座標)は,右へ2,斜め上に2で ( 2 , 2 ) と考える。

斜眼の考え方

 斜眼は,斜交座標系である。横軸と縦軸が斜めに交わっているもので,座標を次のようにとる。

画像2

これを,通常の直交座標系で表せばよいのだが,そのためには,ベクトルの知識を使う。高校で習ってはいるはずだが,忘れている人は多いだろう。現役高校生にはちょうどいい教材になる。まあ,さっと読み飛ばしても構わない。

 まず,通常の直交座標系で,ある点の位置をベクトルで表す方法を考えよう。これは教科書に載っている。 
 横軸方向の基本ベクトル(長さ1のベクトル)を ex,縦軸方向の基本ベクトルを ey とすると,点(3,2) は 3ex+2ey と表せる。(ex.eyはベクトル)

画像3


縦軸を斜めにしても同様に表せる。

画像4

そこで,基本ベクトル ex とey の成分を直交座標で表せば,斜交座標の点を直交座標に直せる。それが,次のプログラム。

def syagan(plist):
   ex = np.array([1, 0])
   ey = np.array([0.5, np.sqrt(3)/2])
   ret = []
   for i in range(len(plist)):
       p = plist[i]
       ret.append(list(p[0]*ex + p[1]*ey))
   return ret

斜眼には,もう一つ,横軸を斜めにしたものもある。

画像8

 この2つを使い分けられるように,引数に stype :1か2 を入れて,次のように定義してこれから使っていこう。

def syagan(stype,plist):
   if stype == 1:
       ex = np.array([1, 0])
       ey = np.array([0.5, np.sqrt(3)/2])
   else:
       ex = np.array([np.sqrt(3)/2, 0.5])
       ey = np.array([0, 1])
   ret = []
   for i in range(len(plist)):
       p = plist[i]
       ret.append(list(p[0]*ex + p[1]*ey))
   return ret

麻の葉

これを使って,麻の葉を描いたのが次のプログラムだ。座標の取り方を,直交座標系のときと比べてみよう。
なお,syagan の定義を追加し,basicpattern() の定義をこれに変えただけで他は同じである。(他は省略。図も同じなので省略)

# 斜眼への変換
def syagan(stype,plist):
   if stype == 1:
       ex = np.array([1, 0])
       ey = np.array([0.5, np.sqrt(3)/2])
   else:
       ex = np.array([np.sqrt(3)/2, 0.5])
       ey = np.array([0, 1])
   ret = []
   for i in range(len(plist)):
       p = plist[i]
       ret.append(list(p[0]*ex + p[1]*ey))
   return ret

# 基本パターンをorgを原点として描く
def basicpattern(org):
   A = [0, 0]
   B = [2, 0]
   C = [2, 2]
   D = [4, 0]
   E = [6, 0]
   F = [4, 2]
   G = [4, 4]
   H = [2, 4]
   K = [0, 4]
   L = [-2, 4]
   M = [0, 2]
   N = [0, 6]
   draw(org, syagan(1, [A, B, C, D, E, F, G, H, C, K, L, M, A, G]))
   draw(org, syagan(1, [E, L]))
   draw(org, syagan(1, [F, M]))
   draw(org, syagan(1, [C, N]))

紗綾形

紗綾形(さやがた)。

画像9

複雑に見えるが,基本パターンは一筆書きで描ける。

画像10

対称形なので,原点対称として座標を拾う。点は28個ある。
プログラムは,麻の葉と同じで,basicpattern(org) の定義と,描画設定を変えればよい。

def basicpattern(org):
   p1 = [-8, 1];
   p2 = [-1, 8];
   p3 = [-0, 7];
   p4 = [-1, 6];
   p5 = [-0, 5];
   p6 = [-1, 4];
   p7 = [-2, 5];
   p8 = [-3, 4];
   p9 = [4, -3];
   p10 = [5, -2];
   p11 = [4, -1];
   p12 = [5, 0];
   p13 = [6, -1];
   p14 = [7, 0];
   p15 = [8, -1];
   p16 = [1, -8];
   p17 = [0, -7];
   p18 = [1, -6];
   p19 = [0, -5];
   p20 = [1, -4];
   p21 = [2, -5];
   p22 = [3, -4];
   p23 = [-4, 3];
   p24 = [-5, 2];
   p25 = [-4, 1];
   p26 = [-5, 0];
   p27 = [-6, 1];
   p28 = [-7, 0];
   draw(org,[p1, p2, p3, p4, p5, p6, p7, p8, p9,p10,
              p11, p12, p13, p14, p15, p16, p17, p18, p19,p20,
              p21, p22, p23, p24, p25, p26, p27, p28,p1]
              )

描画面設定は,たとえば

plt.figure(figsize=(10, 10))
plt.axis([-0, 50, 0, 50])

とし,描画設定を

Shiftx = np.array([10, 0])
Shifty = np.array([0, 10])
Drawcolor = 'k'
drawpattern(10, 10)

とする。

斜紗綾形

紗綾形にも斜眼を用いた斜紗綾形というのがある。
次の図はCinderellaの斜眼を用いて作ったが,紙に描いてももちろんいい。

画像5

これが基本パターンで,つなぐと次のようになる。

画像6

座標のとり方を変えて syagan()で変換する。

# 基本パターンをorgを原点として描く
def basicpattern(org):
   p1 = [0, 0]
   p2 = [1, 0]
   p3 = [1, 1]
   p4 = [2, 1]
   p5 = [2, 2]
   p6 = [1, 2]
   p7 = [1, 3]
   p8 = [8, 3]
   p9 = [8, 2]
   p10 = [7, 2]
   p11 = [7, 1]
   p12 = [8, 1]
   p13 = [8, 0]
   p14 = [9, 0]
   p15 = [9, 7]
   p16 = [8, 7]
   p17 = [8, 6]
   p18 = [7, 6]
   p19 = [7, 5]
   p20 = [8, 5]
   p21 = [8, 4]
   p22 = [1, 4]
   p23 = [1, 5]
   p24 = [2, 5]
   p25 = [2, 6]
   p26 = [1, 6]
   p27 = [1, 7]
   p28 = [0, 7]
   plist = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, 
              p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, 
              p21, p22, p23, p24, p25, p26, p27, p28, p1]
   draw(org, syagan(1, plist))

画面設定の平行移動量を変える。

Shiftx = np.array([10, 0])
Shifty = np.array([15/2, 5*np.sqrt(3)/2])

斜眼のものは,斜交座標で取ったほうが簡単になる。ただし,ちょっと慣れる必要があるかもしれない。