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

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

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

介绍

Julia Fractal 是一种分形图形,具有无限细节和自相似特性,是计算机图形学中的经典案例。在 C/C++ 中,我们可以使用图形库来实现生成 Julia Fractal 图形的功能。本文将介绍如何在 C/C++ 中使用图形库生成 Julia Fractal 图形。

准备

首先,我们需要选择一个图形库来进行开发。常用的图形库包括:

选择哪种图形库主要取决于个人偏好和项目需求。

本文将以使用 SDL2.0 图形库为例进行开发。在使用 SDL2.0 前,需要先下载安装 SDL2.0 并配置好环境。

实现
1. 显示窗口

首先,我们需要创建一个窗口用于显示生成的 Julia Fractal 图形。在 SDL2.0 中,可以使用如下代码来创建一个窗口:

#include <SDL2/SDL.h>

int main(int argc, char* argv[]) {
    SDL_Window* window = NULL;
    
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        return -1;
    }
    
    window = SDL_CreateWindow("Julia Fractal", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
    
    if (window == NULL) {
        printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
        return -1;
    }
    
    SDL_Delay(3000);            // 保持窗口显示 3s
    SDL_DestroyWindow(window);  // 销毁窗口
    SDL_Quit();                 // 退出 SDL
    return 0;
}

其中,SDL_INIT_VIDEO 表示初始化 SDL2.0 的视频功能。SDL_CreateWindow 函数用于创建一个窗口,需要传入窗口名,窗口位置坐标,窗口大小等参数。最后需要使用 SDL_DestroyWindow 来销毁窗口。

2. 生成 Julia Fractal

Julia Fractal 的公式为:$z_{n+1} = {z_n}^2 + c$,其中 $c = a + bi$ 为常数,$a, b$ 分别表示实部和虚部。当 $z_0 = 0$ 时,迭代计算 $z_{n+1}$,如果 $|z_n| > 2$,则表示 $z$ 发散;如果迭代次数达到了设定的最大值但 $|z_n| \leq 2$,则表示 $z$ 收敛。我们可以使用下面的代码来计算 Julia Fractal:

const int WIDTH = 640;
const int HEIGHT = 480;
const int MAX_ITER = 100;

int main(int argc, char* argv[]) {
    SDL_Surface* screen = NULL;
    SDL_Window* window = NULL;
    int i, j, k;
    double x, y, zx, zy, zx2, zy2;

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        return -1;
    }
    
    window = SDL_CreateWindow("Julia Fractal", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
    screen = SDL_GetWindowSurface(window);
    
    for (i = 0; i < WIDTH; ++i) {
        for (j = 0; j < HEIGHT; ++j) {
            x = 1.5 * (i - WIDTH / 2) / (0.5 * WIDTH);
            y = (j - HEIGHT / 2) / (0.5 * HEIGHT);
            zx = x;
            zy = y;
            for (k = 0; k < MAX_ITER; ++k) {
                zx2 = zx * zx;
                zy2 = zy * zy;
                if (zx2 + zy2 > 4) {
                    break;
                }
                zy = 2 * zx * zy + 0.01;
                zx = zx2 - zy2 - 0.835;
            }
            if (k == MAX_ITER) {
                putpixel(screen, i, j, SDL_MapRGB(screen->format, 0, 0, 0));
            } else {
                putpixel(screen, i, j, SDL_MapRGB(screen->format, k % 32 * 8, k % 16 * 16, k % 8 * 32));
            }
        }
    }
    
    SDL_UpdateWindowSurface(window);
    SDL_Delay(5000);            // 保持窗口显示 5s
    SDL_DestroyWindow(window);  // 销毁窗口
    SDL_Quit();                 // 退出 SDL
    return 0;
}

其中,i, j 分别表示像素点的坐标,通过公式 $x = 1.5 * (i - WIDTH / 2) / (0.5 * WIDTH)$ 计算出 x 轴上的坐标,$y = (j - HEIGHT / 2) / (0.5 * HEIGHT)$ 计算出 y 轴上的坐标。随后,根据公式 $z_{n+1} = {z_n}^2 + c$ 计算 $z_{n+1}$ 直到满足条件时退出迭代,并根据最终迭代次数给像素点上色。

3. 总结

使用 SDL2.0 图形库生成 Julia Fractal 图形的流程如下:

  1. 创建窗口
  2. 根据公式计算 Julia Fractal 并对每个像素点上色
  3. 更新窗口,持续显示
  4. 销毁窗口,退出 SDL2.0
参考文献
  1. SDL2.0官网
  2. Julia Fractal - 维基百科