はじめに
徒然なるままに研究室に居ると、隣で後輩が課題のコッホ曲線を描画するプログラムを書いていたので、自分も書いてみむとて書くなり。
コッホ曲線とは
コッホ曲線(コッホきょくせん、英: Koch curve)はフラクタル図形の一つ。スウェーデンの数学者ヘルゲ・フォン・コッホ (Helge von Koch) が考案した[1]。線分を3等分し、分割した2点を頂点とする正三角形の作図を無限に繰り返すことによって得られる図形である。 - コッホ曲線 - Wikipedia
書くなり
koch = lambda x: np.r_[x[:1],(x[:-1]+np.diff(x,1,0)@np.array([[[1/3,0],[0,1/3]],[[.5,.5/3**.5],[-.5/3**.5,.5]],[[2/3,0],[0,2/3]],[[1,0],[0,1]]])).T.reshape(2,-1).T]
つかいかた
最低2点の座標x,yを渡す。
ex)[[0, 0], [1, 0]]
import numpy as np
a = [[0, 0], [1, 0]]
koch(a)
# ---> array([[0., 0.], [0.33333333, 0.], [0.5, 0.28867513], [0.66666667, 0.], [1., 0.]])
動作確認
import numpy as np
import matplotlib.pyplot as plt
a = [[0, 0], [1, 0]]
for _ in range(5):
a = koch(a)
plt.plot(*a.T, lw=1)
plt.axis("equal")
plt.show()
簡単な解説
隣り合った頂点へのベクトルに1/3倍、1/$\sqrt{3}$倍+$\pi$/6回転、2/3倍、1倍の演算をそれぞれ施して、
それを それぞれの頂点座標に足し合わす操作をしています。