#include #include #include /* 全体で使う変数 */ double p[2]; /* 点の位置.[2] は (x,y) 座標. */ double v[2]; /* 点の速度ベクトル.[2] は (x,y) 成分. */ int mx, my; /* マウスが押された座標 */ /* 絵の描画関数 */ void display(){ glClear(GL_COLOR_BUFFER_BIT); /* ウィンドウをクリアする */ glPointSize(10); /* 点の大きさ (単位はピクセル) */ glColor3f(1, 1, 1); /* 色の設定. 光の3原色(赤, 緑, 青) */ /* 点を描く */ glBegin(GL_POINTS); glVertex2d(p[0], p[1]); glEnd(); glutSwapBuffers(); /* 描き終わったら画面を更新する */ } /* 自動的に繰り返し呼ばれる関数 */ void idle(){ /* 微小時間 */ float dt = 0.01; /* 重力場による加速度 */ float a[2]; a[0] = 0; a[1] = 9.8; /* 速度による位置の変更 */ p[0] += dt*v[0]; p[1] += dt*v[1]; /* 加速度による速度の変更 */ v[0] += dt*a[0]; v[1] += dt*a[1]; glutPostRedisplay(); /* 点の再描画を要求する */ } /* マウスボタンが押された・離されたときに呼ばれる関数 */ void mouse(int button, int state, int x, int y){ /* 引数はボタン, 状態, x座標, y座標 */ if(state == GLUT_DOWN && button == GLUT_LEFT){ /* 左ボタンが押された */ /* 押された座標を覚える */ mx = x; my = y; } else if(state == GLUT_UP && button == GLUT_LEFT){ /* 左ボタンが離された */ /* 押された座標から離された座標へのベクトルに比例して初速を設定 */ v[0] = 0.2*(double)(x - mx); v[1] = 0.2*(double)(y - my); /* 押された位置を初期位置へ設定 */ p[0] = (double)mx; p[1] = (double)my; } } /* ウィンドウのサイズが変わった時に呼ばれる関数 */ void reshape(int w, int h){ /*引数はサイズの幅と高さ */ glViewport(0, 0, w, h); /* スクリーンの大きさを決める */ glLoadIdentity(); /*座標変換行列の初期化 */ glOrtho(0, w, h, 0, -1, 1); /* スクリーンと座標系の対応を指定する */ } /* この関数が最初に実行される */ int main(int argc, char** argv){ glutInit(&argc, argv); /* glut を初期化 */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /* 使用するバッファの設定 */ glutInitWindowSize(500, 500); /* ウィンドウの大きさ */ glutCreateWindow("Electron"); /* ウィンドウのタイトル */ glutReshapeFunc(reshape); /* 画面更新用の関数を登録 */ glutDisplayFunc(display); /* ウインドウのサイズ変更時の関数を登録 */ glutMouseFunc(mouse); /* マウス用関数を登録 */ glutIdleFunc(idle); /* イベントが無いときの処理関数を登録 */ glutMainLoop(); /* メインループを開始 */ return 0; }