sierpinski镂垫程序(OpenGL C++ 3D版)

#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张图片

你可能感兴趣的:(C++,OpenGL)