post on 16 Oct 2019 about 2100words require 8min
CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
使用鼠标回调函数,捕获屏幕窗口内点的坐标。
所用机器型号为 VAIO Z Flip 2016
Windows 下运行bezier.exe
,或 Linux 下运行bezier.out
,得到如下结果。
bezier.c
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
#include <math.h>
#include <GL/gl.h>
#include <GL/glut.h>
GLfloat p[4][2];
int cnt = 0;
void mouse(int button, int state, int x, int y)
{
if (state == GLUT_DOWN)
{
if (cnt < 4)
{
glBegin(GL_POINTS);
glVertex2i(x, 500 - y);
glEnd();
p[cnt][0] = x;
p[cnt][1] = 500 - y;
}
else if (cnt == 4)
{
glPointSize(1);
for (int i = 1; i < 4; ++i)
{
glBegin(GL_LINES);
glVertex2f(p[i - 1][0], p[i - 1][1]);
glVertex2f(p[i][0], p[i][1]);
glEnd();
}
}
else if (cnt == 5)
{
glPointSize(1);
for (GLfloat t = 0; t < 1; t += 0.001)
{
glBegin(GL_POINTS);
glVertex2f(
p[0][0] * pow(1 - t, 3) + 3 * p[1][0] * t * pow(1 - t, 2) + 3 * p[2][0] * t * t * (1 - t) + p[3][0] * pow(t, 3),
p[0][1] * pow(1 - t, 3) + 3 * p[1][1] * t * pow(1 - t, 2) + 3 * p[2][1] * t * t * (1 - t) + p[3][1] * pow(t, 3));
glEnd();
}
}
else
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(5);
cnt = -1;
}
++cnt;
glFlush();
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(0, 0);
glutInitWindowSize(500, 500);
glutCreateWindow("17341163_吴坎_CG_HW4");
glClearColor(0, 0, 0, 0);
glPointSize(5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0, 500, 0, 500);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
1
2
gcc bezier.c -o bezier.out -lGL -lGLU -lglut -lm
./bezier.out
Related posts