/* exercise07.c */ /* compile: cc -o exercise06 exercise06.c -g -O2 -Wall -lglfw -lGLU -lGL -lX11 -lXrandr -lm */ #include #include #include #include /* 円を描画する */ void circle(double x, double y, double r) { int const N = 24; /* 円周を 24分割して線分で描画することにする */ int i; glBegin(GL_LINE_LOOP); for (i = 0; i < N; i++) glVertex2d(x + cos(2 * M_PI * i / N) * r, y + sin(2 * M_PI * i / N) * r); glEnd(); } int main(void) { double restitution = 0.9; /* はねかえり係数 */ int width = 640, height = 400; /* ウィンドウのサイズ */ int n; // long double x = 200.0, y = 200.0; /* ボールの中心位置 */ // long double vx = 5.0, vy = 5.0; /* ボールの移動速度 */ //long double r = 10.0; /* ボールの半径 */ long double g = 9.8; /* 重力加速度 */ long double dt = 0.1; /* 時間刻み */ long double Ball_x[10], Ball_y[10]; /* ボールの中心位置 */ long double Ball_vx[10],Ball_vy[10]; /* ボールの移動速度 */ long double Ball_r[10]; /* ボールの半径 */ Ball_x[0]=200.; Ball_y[0]=200.; Ball_vx[0]=5.0; Ball_vy[0]=5.0; Ball_r[0]=10.00; /* ボール1の初期値 */ Ball_x[1]=200.; Ball_y[1]=200.; Ball_vx[1]=5.0; Ball_vy[1]=5.0; Ball_r[1]=8.00; /* ボール2の初期値 */ Ball_x[2]=200.; Ball_y[2]=200.; Ball_vx[2]=5.0; Ball_vy[2]=5.0; Ball_r[2]=6.00; /* ボール3の初期値 */ Ball_x[3]=200.; Ball_y[3]=200.; Ball_vx[3]=5.0; Ball_vy[3]=5.0; Ball_r[3]=4.00; /* ボール4の初期値 */ Ball_x[4]=200.; Ball_y[4]=200.; Ball_vx[4]=5.0; Ball_vy[4]=5.0; Ball_r[4]=2.00; /* ボール5の初期値 */ /* グラフィック環境を初期化して、ウィンドウを開く */ glfwInit(); glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, GLFW_WINDOW); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* 投影以外の座標変換は行わない */ for (;;) { /* Esc が押されるかウィンドウが閉じられたらおしまい */ if (glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED)) break; glfwGetWindowSize(&width, &height); /* 現在のウィンドウサイズを取得する */ glViewport(0, 0, width, height); /* ウィンドウ全面をビューポートにする */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, 0, height, -1.0, 1.0); /* この範囲の空間をビューポートに投影する */ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); /* バックバッファを黒で塗り潰す */ for(n=0; n<5; n++){ /* ウィンドウのサイズが変更されても、ボールがウィンドウ外に出ていかないようにする */ Ball_x[n] = fminl(Ball_x[n], width - Ball_r[n]); Ball_y[n] = fminl(Ball_y[n], height -Ball_r[n]); /* ボールを移動 */ Ball_x[n] += Ball_vx[n]; Ball_y[n] += Ball_vy[n]; /* ボール加速 */ Ball_vy[n] -= g*dt; /* ウィンドウの上下左右の端にぶつかったらバウンド */ if (Ball_x[n] <= Ball_r[n] || Ball_x[n] >= width - Ball_r[n]) Ball_vx[n] = -restitution*Ball_vx[n]; if (Ball_y[n] <= Ball_r[n] || Ball_y[n] >= height - Ball_r[n]) Ball_vy[n] = -restitution*Ball_vy[n]; glColor3d(1.0, 1.0, 1.0); circle(Ball_x[n], Ball_y[n], Ball_r[n]); /* ボールを描く */ } glfwSwapBuffers(); /* フロントバッファとバックバッファを入れ替える */ usleep(40 * 1000); /* 40ミリ秒くらい時間待ち */ } glfwTerminate(); /* ウィンドウを閉じる */ return 0; }