#include <iostream>
#include <gl/glut.h>
#include <time.h>
#include <stdlib.h>
typedef struct{GLfloat x,y,z; } Point3;
void init(){
glClearColor(1.0, 1.0, 1.0, 1.0);//设置系统状态变量-清屏颜色(白色)
glColor3f(1.0, 0.0, 0.0);//设置系统状态变量-绘制颜色(红色)
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //此函数暂时不理解
glOrtho(-500.0, 500.0, -500.0, 500.0, -500.0, 500.0);//定义视图
glMatrixMode(GL_MODELVIEW); //“在程序设计过程中,往往不能跟踪当前的矩阵模式,
//所以为了避免这种情况的发生,在比较复杂的程序里,总是要及时切换回模型空间”
//--2006.2,清华大学出版社,《交互式计算机图形学-基于OpenGl的自顶向下方法》,Edward Angel 著,吴文国 译
}
void triangle(Point3 a, Point3 b, Point3 c){
glBegin(GL_POLYGON);
glVertex3f(a.x, a.y, a.z);
glVertex3f(b.x, b.y, b.z);
glVertex3f(c.x, c.y, c.z);
glEnd();
}
void devide_triangle(Point3 a, Point3 b, Point3 c,int k){
Point3 ab, ac, bc;;
if(k > 0){
ab.x = (a.x + b.x) / 2;
ab.y = (a.y + b.y) / 2;
ab.z = (a.z + b.z) / 2;
ac.x = (a.x + c.x) / 2;
ac.y = (a.y + c.y) / 2;
ac.z = (a.z + c.z) / 2;
bc.x = (b.x + c.x) / 2;
bc.y = (b.y + c.y) / 2;
bc.z = (b.z + c.z) / 2;
devide_triangle(a, ab, ac, k-1);
devide_triangle(b, ab, bc, k-1);
devide_triangle(c, ac, bc, k-1);
}
else
triangle(a, b, c);
}
void tetrahedron(int n){
Point3 v[4] = {{0.0, 0.0, 0.0}, {250.0, 500.0, 100.0}, {500.0, 250.0, 250.0},
(250.0, 100.0, 250.0)};
glColor3f(1.0, 0.0, 0.0);
devide_triangle(v[0], v[1], v[2], n);
glColor3f(0.0, 1.0, 0.0);
devide_triangle(v[0], v[1], v[3], n);
glColor3f(0.0, 0.0, 1.0);
devide_triangle(v[0], v[2], v[3], n);
glColor3f(0.0, 0.0, 0.0);
devide_triangle(v[1], v[2], v[3], n);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
tetrahedron(5);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);//在窗口系统和OpenGl之间建立一种交互方式
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//单缓存,非索引
//(按照我的理解,非索引也就是RGB颜色模式)
glutInitWindowSize (500,500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
//glutReshapeFunc(reshape);
glEnable(GL_DEPTH_TEST);// 激活z-buffer隐藏面消除算法
glutMainLoop();
return 0;
}
运行效果:
![sierpinski镂垫程序(OpenGL C++ 3D版)_第1张图片](http://img.e-com-net.com/image/info5/856a95049c3c461d9a44bbabb8c90bf0.jpg)