エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

わかりやすいコード

近く、グラフィックを使ったプログラムを書くつもりなので、それに先立ってサンプルを書いてみる。後ほどHaskellで再挑戦予定。
実は。カテゴリはOpenGLでなくて、GLUTが正しそうだけど、大目に見てください。

わたしが使っている環境はMac OS Xなので、LinuxやMS-Windowsではファイルパスとかが違うかも。

以下、コード。

#include <cstdlib>

#include <GLUT/glut.h>

struct Point
{
    int x;
    int y;
    int vx;
    int vy;
};

static const int Interval = 200;

static Point p1     = {  10,  10,  8, -2 };
static Point p2     = { 310, 230, -6,  4 };
static int   width  = 320;
static int   height = 240;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3d(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glVertex2i(p1.x, p1.y);
    glVertex2i(p2.x, p2.y);
    glEnd();

    glFlush();
}

void resize(int w, int h)
{
    glViewport(0, 0, w, h);
    width  = w;
    height = h;
    glLoadIdentity();
    glOrtho(-0.5, w - 0.5, h - 0.5, -0.5, -1.0, 1.0);
}

void keyboard(unsigned char key, int, int)
{
    switch(key)
    {
    case 'q':
    case 'Q':
    case '?033':
        std::exit(0);
        break;

    default:
        break;
    }
}

void timer(int)
{
    p1.x += p1.vx; if((p1.x < 0) || (width  < p1.x)) { p1.vx = -p1.vx; }
    p1.y += p1.vy; if((p1.y < 0) || (height < p1.y)) { p1.vy = -p1.vy; }
    p2.x += p2.vx; if((p2.x < 0) || (width  < p2.x)) { p2.vx = -p2.vx; }
    p2.y += p2.vy; if((p2.y < 0) || (height < p2.y)) { p2.vy = -p2.vy; }

    glColor3d(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glVertex2i(p1.x, p1.y);
    glVertex2i(p2.x, p2.y);
    glEnd();

    glFlush();

    glutTimerFunc(Interval, timer, 0);
}

int main(int argc, char* argv[])
{
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
	glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);

	glutCreateWindow(argv[0]);

	glutDisplayFunc(display);
    glutReshapeFunc(resize);
    glutKeyboardFunc(keyboard);
    glutTimerFunc(Interval, timer, 0);

    glClearColor(1.0, 1.0, 1.0, 1.0);

	glutMainLoop();

	return 0;
}

コンパイルはこんな感じ。

g++ -framework OpenGL -framework GLUT -framework Foundation program.cpp