醉曼德尔布罗特实施

Drunk Mandelbrot implementation

我编写了一个程序,用于绘制 Mandelbrot 分形。可惜,它好像喝醉了。这是输出:

相关函数:

void drawMandelbrot(float x, float y, float width, float height, float delta) {
    for (float currentX = -2; currentX < 2; currentX += delta) {
        for (float currentY = -2; currentY < 2; currentY += delta) {
            Complex z(0, 0);
            Complex c(currentX, currentY);
            int iterations = 0;

            do {
                z = z * z + c;
                ++iterations;
            }
            while (z.getAbsoluteValue() <= 2 && iterations < MANDELBROT_ITERATION_LIMIT);

            ALLEGRO_COLOR pixelColor;
            float pixelX = (currentX + 2) / 4 * width;
            float pixelY = (currentY + 2) / 4 * width;

            if (z.getAbsoluteValue() <= 2) {
                pixelColor = blackColor;
                // Commented because you might not want this much junk in your terminal
                //std::cout << "Stayed small! " << z.toString() << std::endl;
            } else {
                pixelColor = al_color_hsv(iterations / MANDELBROT_ITERATION_LIMIT, 1.0f, 1.0f);
                // idem
                //std::cout << "Blew up! " << z.toString() << std::endl;
            }
            al_draw_pixel(pixelX, pixelY, pixelColor);
        }
    }
}

我相信Complex::operator...方法是正确的,我怀疑上面的函数有逻辑错误。检查上述(注释)std::cout 语句的输出时,输出中复数的绝对值确实小于 2,但图像看起来不像绘制的 mandelbrot 集。

哪里条件不对?


mcve 包含在编辑历史记录中。

您计算的复数模数不正确。

float Complex::getAbsoluteValue() const {
    return sqrt(real * real + imaginary + imaginary);
}

您已经删除了 post 的这一部分,但它应该说

float Complex::getAbsoluteValue() const {
    return sqrt(real * real + imaginary * imaginary);
}