多边形的扫描转换与区域填充算法

Assign

多边形的扫描转换与区域填充算法

为了完成这次算法作业, 需要C++ 图形编程. 我选择了OpenGL. 配置起来有点麻烦, 又遇到了一些Bug, 最后索性用了GL里面的一个库, glut.h 进行尝试.

Cheating Code

GLUT的学习

用的Clion, 配置了库, 但是可能有问题, 至少Glut是能正常使用的

随便找的一篇博客配置OpenGL

随便找到的一篇GLUT Tutorial

捣腾半天发现其实我需要的功能并不是很复杂, 也没用到太多glut.h更深入的东西. 了解了glut基本的结构以后还是比较容易看懂整体的流程的.

  • main()
1
2
3
4
5
6
7
8
9
10
11
12
13
glutInit(&argc, argv);// 初始化 glut

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置模式, 我现在只会选择单缓存还是双缓存, 或者深度缓存等等以及颜色
glutInitWindowSize(winX, winY);
glutCreateWindow("test");
myInit(); //设置背景之类的

glutDisplayFunc(display); //这个传入的display貌似也被当做各种窗口变动recall函数

glutMouseFunc(processMouse);
glutKeyboardFunc(processKeyboard);

glutMainLoop();
  • myInit()
1
2
3
4
5
6
7
8
9
10
glClearColor(255.0, 255.0, 255.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);

glPointSize(2.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, winX, 0, winY); // 类似于一个映射或投影之类的, 把最边界的地方所在的坐标确定, left, right, bottom, top, 这里这样就会让他变成常规的坐标系(原点在左下)

glFlush();
  • recall
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
void drawLine(int x1, int y1, int x2, int y2) {
glVertex2i(x1, y1);
glVertex2i(x2, y2);
}
void processKeyboard(unsigned char key, int _x, int _y) {
if(key == 27) exit(0);
else {
if(n >= 3) {
Filling f = Filling(n, x, y); //这个就是本文所作的填充算法
glBegin(GL_LINES);
f.fill(drawLine);
glEnd();
glFlush();
}
}
}
void processMouse(int button, int state, int _x, int _y) {
if(state == GLUT_DOWN) {
x[n] = _x; y[n++] = winY - _y;
glBegin(GL_POINTS);
for(int i = 0; i < n; i++) {
glVertex2i(x[i], y[i]);
}
glEnd();
glFlush();
}
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(255.0, 255.0, 255.0, 0.0);
glColor3f(0.0, 0.0, 0.0);

glBegin(GL_POINTS);
for(int i = 0; i < n; i++) {
glVertex2i(x[i], y[i]);
}
glEnd();
glFlush();
}

to be continue...

算法代码之后再说....

Comments