パソコン日記

気づいたこと まとめてみる

ライフゲームをPythonで作ってみる(OpenGLで格子)

これまでの記事でライフゲームOpenGLpythonでのプログラムをご紹介いたしました。

1-compinfo.hatenablog.com

1-compinfo.hatenablog.com

今回はライフゲームをアニメーションで表示するためにOpenGLを使って格子を表示します。 プログラムを次のように作ってみました。

from OpenGL.GL import *
from OpenGL.GLUT import *
import sys

def display():
    width  = glutGet(GLUT_WINDOW_WIDTH)  #ウィンドウの横の長さを取得
    height = glutGet(GLUT_WINDOW_HEIGHT) #ウィンドウの縦の長さを取得
    xnum = 10 #横のセルの数
    ynum = 10 #縦のセルの数

    glClear(GL_COLOR_BUFFER_BIT) #ウィンドウの塗りつぶし。maskに塗りつぶすバッファの指定
    glColor3d(0.0,1.0,0.0) #線の色
    glBegin(GL_LINES) #描画する図形タイプの指定
    #縦の線
    for i in range(1,xnum):
        x = -1.0 + 2.0/xnum * i #横の長さは-1.0~1.0で2.0
        glVertex2d(x,1.0)
        glVertex2d(x,-1.0)
    #横の線
    for i in range(1,ynum):
        y = -1.0 + 2.0/ynum * i #縦の長さは-1.0~1.0で2.0
        glVertex2d(-1.0,y)
        glVertex2d(1.0,y)
    glEnd()
    glFlush() #まだ実行されていないOpenGLの命令を実行

def init():
    glClearColor(0.0, 0.0, 0.0, 1.0) #glClear(GL_COLOR_BUFFER_BIT)でウィンドウを塗りつぶす際の色を指定

def main():
    glutInit(sys.argv) #GLUTおよびOpenGL環境の初期化
    glutInitDisplayMode(GLUT_RGBA) #ディスプレイの表示モード(RGBAモード)
    glutCreateWindow("test") #ウィンドウを開く
    glutDisplayFunc(display) #引数の関数を再描画のときに実行
    init()
    glutMainLoop() #プログラムのループ
    return 0

if __name__ == "__main__":
    main()

実行すると次のようになります。

f:id:lxxv:20170722233527p:plain

描画について書いてあるのは主にdisplay関数です。

def display():
    width  = glutGet(GLUT_WINDOW_WIDTH)  #ウィンドウの横の長さを取得
    height = glutGet(GLUT_WINDOW_HEIGHT) #ウィンドウの縦の長さを取得
    xnum = 10 #横のセルの数
    ynum = 10 #縦のセルの数

    glClear(GL_COLOR_BUFFER_BIT) #ウィンドウの塗りつぶし。maskに塗りつぶすバッファの指定
    glColor3d(0.0,1.0,0.0) #線の色
    glBegin(GL_LINES) #描画する図形タイプの指定
    #縦の線
    for i in range(1,xnum):
        x = -1.0 + 2.0/xnum * i #横の長さは-1.0~1.0で2.0
        glVertex2d(x,1.0)
        glVertex2d(x,-1.0)
    #横の線
    for i in range(1,ynum):
        y = -1.0 + 2.0/ynum * i #縦の長さは-1.0~1.0で2.0
        glVertex2d(-1.0,y)
        glVertex2d(1.0,y)
    glEnd()
    glFlush() #まだ実行されていないOpenGLの命令を実行

xnumとynumで指定された数だけ格子ができます。 このプログラムは端まで線が描かれて見た目がわるいので、次のようにdisplay関数を 書き換えました。

def display():
    width  = glutGet(GLUT_WINDOW_WIDTH)  #ウィンドウの横の長さを取得
    height = glutGet(GLUT_WINDOW_HEIGHT) #ウィンドウの縦の長さを取得
    xnum = 10 #横のセルの数
    ynum = 10 #縦のセルの数

    glClear(GL_COLOR_BUFFER_BIT) #ウィンドウの塗りつぶし。maskに塗りつぶすバッファの指定
    glColor3d(0.0,1.0,0.0) #線の色
    glBegin(GL_LINES) #描画する図形タイプの指定
    #縦の線
    for i in range(1,xnum+2):
        x = -1.0 + 2.0/(xnum+2) * i #横の長さは-1.0~1.0で2.0
        glVertex2d(x,1.0-2.0/(ynum+2))
        glVertex2d(x,-1.0+2.0/(ynum+2))
    #横の線
    for i in range(1,ynum+2):
        y = -1.0 + 2.0/(ynum+2) * i #縦の長さは-1.0~1.0で2.0
        glVertex2d(-1.0+2.0/(xnum+2),y)
        glVertex2d(1.0-2.0/(xnum+2),y)
    glEnd()
    glFlush() #まだ実行されていないOpenGLの命令を実行

これを実行すると次のようになります。 f:id:lxxv:20170722233805p:plain

さっきよりも見た目がきれいになりました。