2012-10-20 87 views
1

我是一個相當新的C++編程,爲了提高我試圖做一個mandelbrot集CONSOL應用程序。我已經完成了它的工作:圖像生成,我可以放大/縮小,並且很容易移動。我的問題,不過,是當我開始放大就進了圖像的邊緣,邊緣會開始變得「​​切斷」MandelbrotSet zoom

圖片縮小:

http://i.imgur.com/Fy70o.png

形象放大一點 - 你可以看到過去的「圓」的一半已經被砍掉了:

http://i.imgur.com/1nlVP.png

最後,在一個時間放大,整個最後一個「圈」已被完全砍斷:

http://i.imgur.com/lao8j.png

如果我不停地放大,那麼更大的圓圈的邊緣將開始被砍傷了。 我完全不明白爲什麼會發生這種情況,但我的猜測是我的縮放方法有點怪罪。

這裏是該算法計算功能的源代碼(如果我猜的錯誤):

int fractalCalc(double x0, double y0, double zoom) 
{ 
    double x = 0; 
    double y = 0; 

    int iteration = 0; 
    int max_iteration = 1000; //1000 

    double xtemp; 
    while (x*x + y*y < 2*2 && iteration < max_iteration) //x*x + y*y < 2*2 && iteration < max_iteration 
    { 
     xtemp = x*x - y*y + x0; 
     y = 2*x*y + y0; 
     y /= zoom; 
     x = xtemp; 
     x /= zoom; 
     iteration++; 
    } 


    return iteration; 
} 

對於整個源代碼,去(因爲我的預測是最有可能是錯誤的): http://pastebin.com/WhbS0WYE

歡迎任何建議和/或協助。先謝謝你!

回答

3

我還沒有仔細研究數學,但我懷疑這是由於您處理變焦的方式。我建議而不是在代碼中處理實際Mandelbrot深度計算。

取而代之,使用縮放選擇一個「視口」,從中選取樣本。計算出你想要採樣的座標,然後將你的fractalCalc函數寫入只需計算一個特定點的深度。該功能不需要知道你正在顯示的內容。

除了其他任何事情之外,這種問題的分離(視口vs分形部分)將使得更易於推理和調試。這也意味着你每次迭代的計算量會更少,這應該會導致浮點數不準確。

+0

嗯。我現在開始看看'y/= zoom'是怎麼樣的和'x/=縮放;'在代碼中會導致問題。我忘了它實際上增加了'x'和'y'值,並再次在循環中運行增加的值(我有時會這樣做)。感謝您的幫助! –