java - 标准化迭代计数不起作用。我究竟做错了什么?

标签 java colors iteration fractals mandelbrot

从标题中可以看出,我正忙于编写一个小程序,用于在 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,否则我会再次遇到愚蠢的乐队。

问题解决了!

最佳答案

正如您已经发现的那样,您需要在平滑看起来正确之前增加救助半径。

二是坐标可以具有的最小长度,这样当您对它进行平方并添加初始值时,它不会导致更小的长度。如果之前的长度是 2.0,然后将其平方,则长度为 4.0(指向任何方向),并且 c 的任何值最多可以将其减少 2.0(指向正好相反的方向) .如果 c 大于那个,那么它会立即开始逃跑。

现在,为了估计迭代次数的小数部分,我们查看最终的 |z|。如果 z 只是被平方并且没有添加 c,那么它的长度将在 2.0 和 4.0 之间(新值必须大于 2.0 才能保释,旧值必须小于 2.0 才能保释)早点出来)。

没有 c,取 |z| 在 2 和 4 之间的比例位置给了我们迭代次数的小数部分。如果|z|接近 4 那么前一个长度一定接近 2,所以它在前一次迭代中已经接近脱离,平滑结果应该接近前一次迭代计数来表示。如果它接近 2,那么前一次迭代离救助更远,因此平滑的结果应该更接近新的迭代次数。

不幸的是 c 搞砸了。 c 越大,这种简单关系中的潜在误差就越大。即使旧的长度接近 2.0,它也可能下降到 c 的影响使它看起来一定更小。

增加救助会减轻增加 c 的影响。如果救助是 64,那么结果长度将在 64 和 4096 之间,并且 c 的最大偏移量 2 对结果的影响成比例地较小。

关于java - 标准化迭代计数不起作用。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016881/

相关文章:

JAVA_HOME 未出现且 MAVEN_HOME 设置不正确

java - 从 arraylist 中提取子类的所有实例

python - tkinter 在 python 中渲染错误的 RGB 阴影

python - 去除字符串中N个连续重复的字符

java - for 循环和 ArrayList<Integer>

java - itext 7 concat pdf并发送到回复

java - 使用 BeanUtils 设置列表索引属性

vb.net - 将 html 或 rgb 颜色转换为 system.drawing.brush

algorithm - 计算人类如何感知不同颜色之间的相似性

Python在列表理解中使用枚举