簡體   English   中英

規范化迭代計數不起作用。 我究竟做錯了什么?

[英]Normalized Iteration Count does not work. What am I doing wrong?

正如您從標題中看到的那樣,我正忙着編寫一個小程序,用於在 Java 中可視化分形。任何處理分形的人都會找到他/她尋找解決方案以消除這些愚蠢的“帶”的地步,當您只需根據逃逸所需的迭代次數為像素着色。 所以我搜索了一種更高級的着色算法,找到了“歸一化迭代計數”。 我使用的公式是:

float loc = (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);

Inte.net 上的每個人都對這個算法非常滿意,每個人都使用它,每個人都得到了很好的結果。 除了我。 我想,這個算法應該提供一個介於 0 和 1 之間的浮點數。但這並沒有發生。 我做了一些計算並得出結論,該算法僅適用於 c.abs() >= Math.E && c.abs() <= Math.exp(2) (即 Math.E * Math.E ). 在數字中,這意味着我輸入到該方程式中的值必須介於 2.718 和 7.389 之間。

但是當復數 c 的幅度大於 2 時,它被認為趨於無窮大。但是對於任何小於 Math.E 的輸入,我得到的值都大於 1。 對於任何大於 Math.exp(2) 的數字,它都會變成負數。 如果一個復數逃逸得非常快,就是這種情況。

所以請告訴我:我做錯了什么。 我很絕望。

謝謝。

編輯:

我錯了:我發布的代碼是正確的,我只是 1. 以錯誤的方式使用它,所以它沒有提供正確的 output。2. 必須將 mandelbrot/julia 算法的救助值設置為 10,否則我會再次有愚蠢的樂隊。

問題解決了!

正如您已經發現的那樣,您需要在平滑看起來正確之前增加救助半徑。

二是坐標可以具有的最小長度,這樣當您對其進行平方並添加初始值時,它不會導致更小的長度。 如果之前的長度是 2.0,然后將它平方,則長度為 4.0(指向任何方向),而 c 的任何值最多可以減少 2.0(通過恰好指向相反的方向) . 如果 c 比那個大,那么它會立即開始逃逸。

現在,為了估計迭代次數的小數部分,我們查看最終的 |z|。 如果 z 只是簡單地平方並且沒有添加 c,那么它的長度將在 2.0 和 4.0 之間(新值必須大於 2.0 才能退出,舊值必須小於 2.0 才能退出)早點出來)。

沒有 c,取 |z| 的比例 position 在 2 和 4 之間給我們迭代次數的小數部分。 如果|z| 接近 4 那么之前的長度一定已經接近 2,所以它已經接近於在之前的迭代中退出並且平滑的結果應該接近於之前的迭代計數來表示它。 如果它接近 2,則前一次迭代離退出更遠,因此平滑后的結果應該更接近新的迭代次數。

不幸的是 c 搞砸了。 c 越大,該簡單關系中的潛在誤差就越大。 即使舊長度接近 2.0,它也可能下降到 c 的影響使它看起來一定更小。

增加 bailout 會減輕添加 c 的影響。如果 bailout 為 64,則結果長度將介於 64 和 4096 之間,並且 c 的最大偏移量 2 對結果的影響按比例變小。

你已經遺漏了迭代值,試試這個:

float loc = <iteration_value> + (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);

iteration_value是公式中產生c的迭代次數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM