不依赖y值的三维分形表面程序
时间: 2024-05-14 21:12:59 浏览: 13
以下是一个不依赖于y值的三维分形表面程序示例:
```
#include <cmath>
#include <iostream>
#include <vector>
const int WIDTH = 800;
const int HEIGHT = 800;
struct Point {
float x, y, z;
Point(float x, float y, float z) : x(x), y(y), z(z) {}
};
std::vector<Point> points{{-1, -1, -1}, {-1, 1, -1}, {1, 1, -1}, {1, -1, -1}, {-1, -1, 1}, {-1, 1, 1}, {1, 1, 1}, {1, -1, 1}};
void drawTriangle(Point p1, Point p2, Point p3) {
glBegin(GL_TRIANGLES);
glVertex3f(p1.x, p1.y, p1.z);
glVertex3f(p2.x, p2.y, p2.z);
glVertex3f(p3.x, p3.y, p3.z);
glEnd();
}
void divideTriangle(Point p1, Point p2, Point p3, int depth) {
if (depth == 0) {
drawTriangle(p1, p2, p3);
return;
}
Point p12{(p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2};
Point p23{(p2.x + p3.x) / 2, (p2.y + p3.y) / 2, (p2.z + p3.z) / 2};
Point p31{(p3.x + p1.x) / 2, (p3.y + p1.y) / 2, (p3.z + p1.z) / 2};
divideTriangle(p1, p12, p31, depth - 1);
divideTriangle(p2, p23, p12, depth - 1);
divideTriangle(p3, p31, p23, depth - 1);
divideTriangle(p12, p23, p31, depth - 1);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, static_cast<float>(WIDTH) / HEIGHT, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
divideTriangle(points[0], points[1], points[2], 4);
divideTriangle(points[0], points[3], points[2], 4);
divideTriangle(points[0], points[4], points[1], 4);
divideTriangle(points[3], points[7], points[2], 4);
divideTriangle(points[4], points[5], points[1], 4);
divideTriangle(points[4], points[7], points[6], 4);
divideTriangle(points[4], points[7], points[3], 4);
divideTriangle(points[1], points[6], points[2], 4);
glFlush();
glutSwapBuffers();
}
void reshape(int width, int height) {
glViewport(0, 0, static_cast<GLsizei>(width), static_cast<GLsizei>(height));
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("Fractal Surface");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glutMainLoop();
return 0;
}
```
这个程序使用OpenGL绘制了一个基于Sierpinski三角形的三维分形表面。它使用递归方法将每个三角形分成四个更小的三角形,并在递归达到一定深度时绘制每个三角形。这个方法可以用于创建各种各样的三维分形表面。