c - 低分辨率曼德尔布罗分形……分辨率不够高?

标签 c fractals mandelbrot

好吧,这是一个我遇到问题的奇怪问题(顺便说一句,用 gcc 编译)

下面是命令提示符的 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");
        }
    }
}

感谢您到目前为止,感谢您的帮助!

最佳答案

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

每次迭代后,您需要将 (x,y) 坐标添加到平方值上。请参阅Wikipedia .

编辑:一些小的更改和 voila .

关于c - 低分辨率曼德尔布罗分形……分辨率不够高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029538/

相关文章:

android - 为 Android 上的 MediaStreamer2 控制台应用程序提供 JVM

java - 曼德尔布罗特集 : Stripes Appearing in Deeper Zooms (>1E14) (Java)

c - 为什么八进制序列 '\0101' 不等于十进制的 65?

c++ - 在opengl中创建一个分形树

java - 中点位移地形伪影

algorithm - 产生异常模式的中点位移二维算法

objective-c - 如何缩放 mandelbrot 集

C 从 FILE* 中读取带空格的格式化行

c - 杀死 fork 的子进程会杀死 SIGCHLD 处理程序中的父进程