pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

pythonでOpenGL コッホ曲線

こんにちは。
今回はOpenGL第二弾ということで、コッホ曲線を描いてみたいと思います。

コッホ曲線とは

下図のように、点Sと点Eを与えたときに、点Sと点Eの間を三等分してP1,P2,P3をもとめます。
その後、S,P1で同様の操作、P1,P2で同様の操作・・・ と繰り返すことで、曲線を求めていきます。
f:id:SaidaTaisei:20200505233012p:plain



例えば、二回操作すると、以下のようになります。

f:id:SaidaTaisei:20200505233406p:plain


ちなみに、最初が逆三角形の三辺スタートのものをコッホ雪片と呼び、以下のような図形になります。

f:id:SaidaTaisei:20200505235223p:plain


実際にコードを書いてみる

実際に以下のようにコードを書いてみました。

再帰的に点を求めていくような感じになります。

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にすると、

f:id:SaidaTaisei:20200506000441p:plain



v=4だと、

f:id:SaidaTaisei:20200506000904p:plain

出力を見ると、うまくかけているように見えます。



ということで、今回はPythonOpenGLを使って、コッホ曲線を描いてみました。

次回はまた、違うものを描くと思うので、興味のある方は見てください。