正如您从标题中看到的那样,我正忙于编写一个用Java可视化分形的程序。任何处理分形的人都会到达他/她寻找解决方案以获得这些愚蠢的“乐队”的地步,当你只是通过迭代所需的迭代次数为一个像素着色时。 所以我搜索了一个更高级的着色算法,找到了“标准化的迭代计数”。我正在使用的公式是:
float loc = (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);
互联网上的每个人都对这个算法感到高兴,每个人都使用它,每个人都会得到很好的结果。除了我。我想,这个算法应该提供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.以错误的方式使用它,因此它没有提供正确的输出。 2.必须将mandelbrot / julia算法的救助价值设定为10,否则我会再次遇到愚蠢的乐队。
问题解决了!
答案 0 :(得分:1)
正如您已经发现的那样,在平滑看起来正确之前,您需要增加救助半径。
两个是坐标可以具有的最小长度,这样当你对它进行平方并添加初始值时,它不会导致较小的长度。如果前一个长度是2.0,你将它平方,你的长度为4.0(指向任何方向),并且c的任何值可以减少的最大值是2.0(通过指向正好相反的方向) 。如果c大于那么它就会立即开始逃脱。
现在,为了估计迭代次数的小数部分,我们看一下最终的| z |。如果z只是平方并且没有加到它上面,那么它的长度将介于2.0和4.0之间(新值必须大于2.0才能挽救,并且旧值必须小于2.0才能保释早些时候)。
没有c,取| z |在2和4之间的比例位置给出了迭代次数的一小部分。如果| z |接近4然后前一个长度必须接近2,所以它已经接近在前一次迭代中拯救,平滑的结果应该接近前一个迭代计数来表示。如果它接近2,则前一次迭代进一步挽救,因此平滑后的结果应该更接近新的迭代次数。
不幸的是,混乱了。 c越大,该简单关系中的潜在误差越大。即使旧的长度几乎达到2.0,它也可能落地,因此c的影响使它看起来一定要小一些。
增加救助可以减轻加入c的影响。如果救助是64,则结果长度将介于64和4096之间,而c的最大偏差2对结果的影响相对较小。
答案 1 :(得分:0)
你遗漏了迭代值,试试这个:
float loc = <iteration_value> + (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);
iteration_value
是在公式中产生c
的迭代次数。