计算机图形学实验报告-绘制镂空三角形{谢尔宾斯基三角形(Sierpinski Triangle)}
实验目的掌握图形学的基本原理掌握二维图形的表示与绘制方法。能力要求能够进行二维图形绘制算法设计以及基于C与OpenGl的软件开发并完成规范的实验报告。源代码#include GL/glut.h #include stdlib.h #include time.h #include stdlib.h #includeWindows.h /* 初始化 */ //GLfloat v[3][2] { {-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15} }; GLfloat v[3][2] { {-1.0, -1.00},{1.0,-1.0},{0.0,0.73}}; int gCount 4;//迭代四次 /* specify one triangle */ void triangle(GLfloat* a, GLfloat* b, GLfloat* c) { glVertex2fv(a);//接受一个包含两个浮点数的数组这两个浮点数分别代表顶点的x和y坐标。 glVertex2fv(b); glVertex2fv(c); } //用递归切割三角形 void divide_triangle(GLfloat* a, GLfloat* b, GLfloat* c, int m) { GLfloat v0[2], v1[2], v2[2]; int j; if (m 0) { for (j 0; j 2; j) { v0[j] (a[j] b[j]) / 2; } for (j 0; j 2; j) { v1[j] (a[j] c[j]) / 2; } for (j 0; j 2; j) { v2[j] (b[j] c[j]) / 2; } divide_triangle(a, v0, v1, m - 1); divide_triangle(c, v1, v2, m - 1); divide_triangle(b, v2, v0, m - 1); } else { triangle(a, b, c); /*在递归结束时绘制三角形*/ } } //设置绘图环境设置了一些基本的图形属性和投影方式 void init() { /* attributes属性 */ glClearColor(1.0, 1.0, 1.0, 1.0); /* white background */ glColor3f(1.0, 0.0, 0.0); /* draw in red */ //正交投影 glMatrixMode(GL_PROJECTION);//设置当前的矩阵模式为投影矩阵projection glLoadIdentity();//将当前矩阵重置为单位矩阵。 gluOrtho2D(-1.5, 1.5, -1.5,1.5);//投影边界 glMatrixMode(GL_MODELVIEW);//在设置完投影矩阵后通常会切换回模型视图矩阵以便进行场景中物体的变换操作。 } void display() { glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲区。这个调用清除了屏幕通常用于在新的一帧开始时清除前一帧的内容。 glBegin(GL_TRIANGLES);//开始一个新图形的顶点定义。GL_TRIANGLES 表示接下来的顶点将被用来绘制三角形。 divide_triangle(v[0], v[1], v[2], gCount); glEnd();//结束顶点定义。这个调用标志了 glBegin 开始的顶点序列的结束。 glutSwapBuffers();//在双缓冲模式下交换前后缓冲区。这个调用将后缓冲区的内容显示到屏幕上同时清空前缓冲区为下一帧做准备。这可以减少屏幕撕裂和闪烁。 } int main(int argc, char* argv[]) { //感觉前面的一且都像是声明 glutInit(argc, argv);//初始化GLUT库 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DOUBLE);//初始化GLUT显示模式单缓冲全彩双缓冲 glutInitWindowSize(640, 480);// 设置窗口的初始大小 glutInitWindowPosition(200, 200);//窗口初始位置 glutCreateWindow(sierpinski gasket); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }运行结果