📜  使用图形在C C++中设置的Julia Fractal(1)

📅  最后修改于: 2023-12-03 15:06:55.711000             🧑  作者: Mango

使用图形在C/C++中设置的Julia Fractal

Julia Fractal是一种基于复数的非线性分形图形,可以通过重复使用简单的数学公式生成。在这篇介绍中,我们将介绍如何使用C/C++编写一个简单的程序来绘制Julia Fractal。

需求

在开始之前,我们需要确保已经安装了以下组件:

  • C/C++ 编译器
  • 图形库(如 OpenGL 或 SDL)

如果您没有安装这些组件,可以通过以下方式安装:

在 Ubuntu 上安装 C/C++ 编译器

sudo apt-get update
sudo apt-get install build-essential

在 Ubuntu 上安装 OpenGL

sudo apt-get update
sudo apt-get install freeglut3-dev

在 Ubuntu 上安装 SDL

sudo apt-get update
sudo apt-get install libsdl2-dev
实现

接下来,我们将编写一个 C/C++ 程序,以生成并绘制Julia Fractal。

1. 定义Julia Fractal公式

首先,我们需要定义Julia Fractal的公式。可以使用以下公式:

$z_{n+1} = z_n^2 + c$

其中 $z_n$ 和 $c$ 都是复数,$z_0$ 是初始值。

对于Julia Fractal,使用一个特定的 $c$ 值来生成图像。通常,$c$ 的值落在复平面上,通常在 $(0,1)$ 之间取值会生成有趣的形状。

2. 实现程序

我们将使用 OpenGL 来绘制图像,因此需要创建一个窗口并设置OpenGL环境。

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Julia Fractal");
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glutMainLoop();
    return 0;
}

在窗口中,我们将使用公式 $z_{n+1} = z_n^2 + c$ 来计算每个像素点的颜色。我们将按顺序为每个像素点调用以下函数:

void draw_pixel(int x, int y, float r, float g, float b) {
    glColor3f(r, g, b);
    glBegin(GL_POINTS);
    glVertex2f(x, y);
    glEnd();
}

该函数在 (x, y) 坐标处绘制一个点,颜色由 (r, g, b) 给出。

然后,我们需要一个函数用于计算 $z_{n+1}$ 的值:

complex_t julia(complex_t c, complex_t z) {
    double zx = z.real;
    double zy = z.imaginary;

    double cx = c.real;
    double cy = c.imaginary;

    double new_zx = (zx * zx) - (zy * zy) + cx;
    double new_zy = (2 * zx * zy) + cy;

    return {new_zx, new_zy};
}

最后,我们将为每个像素点的坐标调用draw_pixel()函数,并提供从julia()函数获取的颜色。

void render() {
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            float xn = (float)x / (float)width;
            float yn = (float)y / (float)height;

            complex_t c = {0.7885, 0.131};
            complex_t z = {(xn - 0.5) * 2 * zoom, (yn - 0.5) * 2 * zoom};
            bool is_inside = true;
            int iterations = 0;

            while (is_inside && iterations < max_iterations) {
                z = julia(c, z);
                if (z.real > 5 || z.imaginary > 5) {
                    is_inside = false;
                }
                iterations += 1;
            }

            if (is_inside) {
                draw_pixel(x, y, 1.0, 1.0, 1.0);
            } else {
                float ratio = (float)iterations / (float)max_iterations;
                draw_pixel(x, y, ratio, ratio * ratio, ratio * ratio * ratio);
            }
        }
    }
    glutSwapBuffers();
}

在上面的代码中,我们设置了 $c = (0.7885, 0.131)$,以生成较小的Julia Fractal。变量 zoom 控制缩放级别,max_iterations 定义了相关性能和细节。我们正在使用 single-precision float 类型的复杂数字来进行计算。

最后,我们需要将render()函数与OpenGL事件循环绑定,并让我们的应用程序重绘我们的窗口。

void display_func() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    render();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Julia Fractal");
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glutDisplayFunc(display_func);
    glutMainLoop();
    return 0;
}
总结

通过使用C/C++和OpenGL,我们可以轻松地生成和绘制基于复数的Julia Fractal。这个程序不仅有助于您更好地理解Julia Fractal的工作原理和生成方式,而且还可以作为您的计算美术作品的基础。