2012-12-25 204 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