【问题标题】:Low resolution Mandelbrot fractal not... high enough resolution?低分辨率 Mandelbrot 分形不是......分辨率足够高?
【发布时间】:2012-12-11 08:37:32
【问题描述】:

好的,我遇到了一个奇怪的问题(用 gcc btw 编译)

以下是用于命令提示符的 Mandelbrot 分形生成器的源代码。我以前做过这个,我想对自己进行速度测试,看看我能以多快的速度生成在命令提示符下实际生成 Mandelbrot 分形所需的代码。我经常这样做是为了测试自己的乐趣

无论如何,我遇到了一个新问题,但我无法弄清楚问题是什么。当分形渲染时,无论我设置多少次迭代或什么 escapeValue,它总是会显示为椭圆形!它不应该那样做。

对于所有 mandelbrot/cpp 极客,您能帮我找出为什么我没有得到更多的“mandelbrot”形状吗?

#include <stdio.h>
#include <math.h>

#define DOSWidth 80
#define DOSHeight 25

int iterations = 1024;
float escapeValue = 3.0f;

struct ivar {
    ivar(float _x, float _i) {
        x = _x;
        i = _i;
    }
    void log() {printf("(%g%c%gi)", x, (i<0)?'-':'+', fabs(i));}
    float magnitude() {return sqrtf(x*x+i*i);}
    ivar square() {return ivar(x, i)*ivar(x, i);}

    ivar operator + (ivar v) {return ivar(x+v.x, i+v.i);};
    ivar operator - (ivar v) {return ivar(x-v.x, i-v.i);};
    ivar operator * (ivar v) {return ivar(x*v.x-(i*v.i), x*v.i+i*v.x);};

    float x, i;
};

struct rect {
    rect(float _x, float _y, float _width, float _height) {
        x = _x;y = _y;width = _width;height = _height;
    }

    void setCenter(float cx, float cy) {
        x = cx-width/2.0f;
        y = cy-width/2.0f;
    }

    void log() {printf("(%f, %f, %f, %f)", x, y, width, height);}

    float x, y;
    float width, height;
};

int main() {
    rect region = rect(0, 0, 2.5f, 2.0f);
    region.setCenter(0, 0);
    float xSize = region.width / (float)DOSWidth;
    float ySize = region.height / (float)DOSHeight;
    for(int y=0;y<DOSHeight;y++) {
        for(int x=0;x<DOSWidth;x++) {
            ivar pos = ivar(x*xSize+region.x, y*ySize+region.y);
            bool escapes = false;
            for(int i=0;i<iterations;i++) {
                if(pos.magnitude() > escapeValue) {
                    escapes = true;
                    break;
                }
                pos = pos.square();
            }
            if(escapes)printf(" ");
            else printf("X");
        }
    }
}

感谢您的帮助,感谢您的帮助!

【问题讨论】:

    标签: c fractals mandelbrot


    【解决方案1】:

    您只是递归地平方 pos 直到其大小超过限制。那不会产生分形;它会产生一个单位圆。

    您需要在每次迭代后将 (x,y) 坐标添加到平方值。见Wikipedia

    编辑:一些小改动和voila

    【讨论】:

    • 啊,你完全正确!我想知道为什么会发生这样一个奇怪而一致的问题!我忘了实际迭代方程的 Z(n)+C 部分哈哈。感谢您的意见,也许这样一个简单的问题因为睡眠不足而避开了我:D 你摇滚
    • 练习不多,但是std::complex 将开发时间缩短到了大约 10 分钟:ideone.com/Zn7QVn
    • 哈,你的权利!但我想为受虐狂手动开发它。如果您对这里有兴趣,这里还有一个支持缩放功能和迭代操作的源的 pastebin pastebin.com/K1f5Xruc
    • 你先生,摇滚。摇滚铁杆
    • @Parad0x13 如果你有兴趣,这就是我最终得到的。在 ideone 时间限制内以 80x32 分辨率显示 20 个屏幕。 ideone.com/jBo5tX
    【解决方案2】:

    您的转义值太低,应该是 4.00f。

    【讨论】:

    • 即使在 4.0f 它仍然会产生椭圆形。我将转义值设置为荒谬的值,例如 9999.0f 或 1.0f 并得到相同的结果。这很奇怪,因为 3.0f-6.0f 的转义值应该会产生相当好的结果
    • 哦,我不知道。我用4.0f。对不起,我不能不擅长 C++。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多