こんにちは。
今回はOpenGL第二弾ということで、コッホ曲線を描いてみたいと思います。
コッホ曲線とは
下図のように、点Sと点Eを与えたときに、点Sと点Eの間を三等分してP1,P2,P3をもとめます。
その後、S,P1で同様の操作、P1,P2で同様の操作・・・ と繰り返すことで、曲線を求めていきます。
例えば、二回操作すると、以下のようになります。
ちなみに、最初が逆三角形の三辺スタートのものをコッホ雪片と呼び、以下のような図形になります。
実際にコードを書いてみる
実際に以下のようにコードを書いてみました。
再帰的に点を求めていくような感じになります。
from OpenGL.GL import * from OpenGL.GLUT import * import math def koch(n, xs, ys, xe, ye): # 終了の判断 if (n < 1): return else: n = n - 1; # 座標を求める x0 = xs + (xe - xs) / 3.0 y0 = ys + (ye - ys) / 3.0 x2 = xs + (xe - xs) * 2.0 / 3.0 y2 = ys + (ye - ys) * 2.0 / 3.0 x1 = 1.0 / 2.0 * (x2 - x0) - math.sqrt(3.0) / 2.0 * (y2 - y0) + x0 y1 = math.sqrt(3.0) / 2 * (x2 - x0) + 1.0 / 2.0 * (y2 - y0) + y0 # 線を消す glColor3d(1.0, 1.0, 1.0) glVertex2d(x0, y0) glVertex2d(x2, y2) # 線を描く glColor3d(0.0, 0.0, 1.0) glVertex2d(xs, ys) glVertex2d(x0, y0) glVertex2d(x0, y0) glVertex2d(x1, y1) glVertex2d(x1, y1) glVertex2d(x2, y2) glVertex2d(x2, y2) glVertex2d(xe, ye) # 次の点を求める koch(n,xs, ys, x0, y0) koch(n,x0, y0, x1, y1) koch(n,x1, y1, x2, y2) koch(n,x2, y2, xe, ye) def draw(): glClearColor(1.0, 1.0, 1.0, 1.0) glClear(GL_COLOR_BUFFER_BIT) glBegin(GL_LINES) # コッホ曲線、vは回数 v = 2 koch(v,-0.5, 0.5, 0.5, 0.5) koch(v,0.5, 0.5, 0.0, 0.5-math.sqrt(3)/2.0) koch(v,0.0, 0.5 - math.sqrt(3) / 2.0, -0.5, 0.5) glEnd(); glFlush() if __name__ == "__main__": glutInit(sys.argv) glutInitWindowSize(1000, 1000) glutCreateWindow("openGL test") glutDisplayFunc(draw) glutMainLoop()
上のコードだと、vの数字を変えると、コッホ曲線の次数が変わります。
例えば、v=3にすると、
v=4だと、
出力を見ると、うまくかけているように見えます。
ということで、今回はPythonでOpenGLを使って、コッホ曲線を描いてみました。
次回はまた、違うものを描くと思うので、興味のある方は見てください。