2012-12-25 202 views
2

好的,这是一个奇怪的,我遇到问题(用gcc btw编译)低分辨率Mandelbrot分形不...足够高的分辨率?

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

谢谢如果你有这么多,感谢你的帮助!

回答

3

你只是递归地平方pos,直到其数量超过限制。这不会产生分形;它会产生一个单位圈。

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

编辑:几个小小的变化和voila

+0

啊,你绝对正确!我想知道为什么发生这样一个奇怪而一致的问题!我忘了实际迭代等式lol的Z(n)+ C部分。感谢您的意见,也许这样一个简单的问题回避了我由于睡眠不足:D你摇滚 – Parad0x13

+0

这不是太多练习,但'std :: complex'将开发时间缩短到~10分钟:https://ideone.com/Zn7QVn – Potatoswatter

+0

哈,你的权利!但我想为受虐狂手动开发它。如果您对此感兴趣,可以参考源代码支持的缩放功能和迭代操作 http://pastebin.com/K1f5Xruc – Parad0x13

0

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

+0

即使在4.0f,它仍然会产生椭圆。我将escape值设置为9999.0f或1.0f等荒谬的值,并得到相同的结果。这很奇怪,因为3.0f-6.0f的转义值应该会产生相当好的结果 – Parad0x13

+0

哦,我不知道。我使用4.0f。对不起,我无法帮助不擅长C++。 – Bytemain

+0

没有probs,potatoswatter明白了:D谢谢你! – Parad0x13