分形Sierpinski用OpenGL代码实现
时间: 2024-05-07 21:23:05 浏览: 81
Sierpinski分形是一种经典的分形图形,可以使用OpenGL进行实现。下面是一个简单的OpenGL程序,用于绘制Sierpinski分形。
```c++
#include <GL/glut.h>
int n = 5; // Sierpinski分形的阶数
// 绘制Sierpinski分形
void drawSierpinski(int x1, int y1, int x2, int y2, int x3, int y3, int n)
{
if (n == 0)
{
glBegin(GL_TRIANGLES);
glVertex2i(x1, y1);
glVertex2i(x2, y2);
glVertex2i(x3, y3);
glEnd();
}
else
{
// 计算三角形的中点
int x12 = (x1 + x2) / 2;
int y12 = (y1 + y2) / 2;
int x23 = (x2 + x3) / 2;
int y23 = (y2 + y3) / 2;
int x31 = (x3 + x1) / 2;
int y31 = (y3 + y1) / 2;
// 绘制三个子三角形
drawSierpinski(x1, y1, x12, y12, x31, y31, n - 1);
drawSierpinski(x2, y2, x23, y23, x12, y12, n - 1);
drawSierpinski(x3, y3, x31, y31, x23, y23, n - 1);
}
}
// 绘制函数
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glLoadIdentity();
drawSierpinski(0, 200, 400, 200, 200, 400, n); // 初始三角形
glFlush();
}
// 初始化函数
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 400.0, 0.0, 400.0);
}
// 主函数
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("Sierpinski Fractal");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
在该程序中,`drawSierpinski()`函数用于绘制Sierpinski分形,它采用递归的方式进行绘制。在每一次递归中,函数将当前三角形分成三个子三角形,然后对每个子三角形递归执行绘制操作,直到达到指定的阶数。`display()`函数用于绘制整个窗口,在其中首先调用`drawSierpinski()`函数绘制初始三角形,然后将结果刷新到窗口中。`init()`函数用于初始化OpenGL环境,设置背景颜色和投影矩阵等。最后,在`main()`函数中创建窗口并注册回调函数,然后进入主循环等待用户交互。
阅读全文