1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
#include <stdlib.h>
#include <GL/glut.h>
#include <oneapi/tbb.h>
#include "balls.h"
using namespace std;
enum {
WIDTH = 800,
HEIGHT = 600,
KEY_QUIT = 'q',
CIRCLE_SEGS = 32,
FPS = 60,
MS_PER_S = 1000,
FRAME_TIME_MS = MS_PER_S / FPS,
};
void keyboard(unsigned char key, int x, int y);
void display(void);
void drawBg(void);
void drawCircle(double radius, Point p);
void reshape(int w, int h);
void animate(int v);
const static Rectangle bounds = {{-1.5, -1.0}, {1.5, 1.0}};
static Ball ball = {{0.25, 0.25}, {0.25, 0.25}, 0.200, 0.25};
int
main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("Balls");
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(FRAME_TIME_MS, animate, 0);
glutMainLoop();
return 1;
}
void
keyboard(unsigned char key, int x, int y) {
if (key == KEY_QUIT)
glutDestroyWindow(glutGetWindow());
}
void
display(void) {
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
drawBg();
drawCircle(ball.r, ball.p);
glutSwapBuffers();
}
void
drawBg(void) {
glColor3f(1, 1, 1);
glBegin(GL_QUADS);
glVertex2f(bounds.min.x, bounds.min.y);
glVertex2f(bounds.max.x, bounds.min.y);
glVertex2f(bounds.max.x, bounds.max.y);
glVertex2f(bounds.min.x, bounds.max.y);
glEnd();
}
void
drawCircle(double radius, Point p) {
int i;
double theta, x, y;
glColor3f(0.1, 0.6, 0.8);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(p.x, p.y);
for (i = 0; i <= CIRCLE_SEGS; i++) {
theta = 2.0 * M_PI * i / CIRCLE_SEGS;
x = radius * cosf(theta);
y = radius * sinf(theta);
glVertex2f(x+p.x, y+p.y);
}
glEnd();
}
void
reshape(int w, int h) {
double ratio;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
ratio = (double) w / (double) h;
if (ratio >= 1.0)
glOrtho(-ratio, ratio, -1, 1, -1, 1);
else
glOrtho(-1, 1, -1.0/ratio, 1.0/ratio, -1, 1);
glMatrixMode(GL_MODELVIEW);
}
void
animate(int v) {
ball.p = ptAddVec(ball.p, ball.v);
collideWall(&ball, bounds);
display();
glutTimerFunc(FRAME_TIME_MS, animate, 0);
}
|