OpenGLでシェルピンスキーのギャスケット

プログラミングで図形ってどうやって書くの?的なことを聞かれたので、それらしいのをやってみました。

OpenGLの準備*1

GLUTを使います。まずはwindows用のGLUTを持ってきます。
Nate Robins - OpenGL - GLUT for Win32
ヘッダファイルを「追加のインクルードディレクトリ」に追加、libファイルを「追加のライブラリディレクトリ」に追加、dllファイルは実行ファイルと同じ場所に置くかSystem32へ。多分これで動くはずです。

シェルピンスキーのギャスケット

#include <glut.h>
#include <stdio.h>

struct Pos {
	GLdouble x, y;
};

void triangle(int n, Pos a, Pos b, Pos c) {
	//頂点(a,b,c)を線で結ぶよ!
	glBegin(GL_LINE_LOOP);
	glVertex2d(a.x, a.y);
	glVertex2d(b.x, b.y);
	glVertex2d(c.x, c.y);
	glEnd();

	if (n < 1) {
		return;
	} else {
		Pos d, e, f;
		//頂点(a,b,c)の中点を取得
		d.x = (a.x + b.x)/2, d.y = (a.y + b.y)/2;
		e.x = (b.x + c.x)/2, e.y = (b.y + c.y)/2;
		f.x = (a.x + c.x)/2, f.y = (a.y + c.y)/2;
		triangle(n-1, a, d, f);
		triangle(n-1, d, b, e);
		triangle(n-1, f, e, c);
	}
}

void display(void) {
	Pos a, b, c;
	//画面中央が(0,0)
	a.x = -0.9, a.y = -0.9;
	b.x = 0.0, b.y = 0.9;
	c.x = 0.9, c.y = -0.9;
	triangle(5, a, b, c);
	glFlush();//更新
}

int main(int argc, char *argv[]) {
	glutInit(&argc, argv);//初期化
	glutInitDisplayMode(GLUT_RGBA);//表示モード設定
	glutCreateWindow("GLTest");//ウィンドウ生成
	glClear(GL_COLOR_BUFFER_BIT);//塗りつぶし
	glutDisplayFunc(display);//描画関数へのポインタ
	glutMainLoop();
	return 0;
}

実行結果

f:id:yashihei:20130529171913j:plain

再帰で短くかけました。再帰を使ったプログラミングは、楽しいです。

*1:VisualStudioでやってます