【问题标题】:How would you continuously improve the mandelbrot fractal?您将如何不断改进曼德布罗分形?
【发布时间】:2012-12-03 23:15:27
【问题描述】:

我见过许多 mandelbrot 图像生成器绘制 mandelbrot 的低分辨率分形,然后不断改进分形。这是平铺算法吗?这是一个例子:http://neave.com/fractal/

更新:我发现这个关于递归细分和计算 mandelbrot:http://www.metabit.org/~rfigura/figura-fractal/math.html。也许可以使用 kd-tree 来细分图像?

更新 2:http://randomascii.wordpress.com/2011/08/13/faster-fractals-through-algebra/ 更新 3:http://www.fractalforums.com/programming/mandelbrot-exterior-optimization/15/

【问题讨论】:

标签: math fractals mandelbrot


【解决方案1】:

Fractal eXtreme 的作者和问题中链接的 randomascii 博客文章。

Fractal eXtreme 做了一些事情来提供逐渐改善的分形图像:

  1. 从中间开始,而不是从顶部开始。这是许多早期分形程序忽略的微不足道的变化。中心应该是用户最关心的区域。这可以从中心线开始,也可以螺旋形向外。螺旋出有更多开销,所以我只在计算密集型图像上使用它。
  2. 使用 8x8 块进行初始低分辨率传递(计算 64 个像素中的一个)。这给出了一个粗略的初始视图,该视图逐渐以 4x4、2x2 和 1x1 分辨率进行细化。请注意,每次传递的像素数是之前所有传递的三倍——不要重新计算原始点。随后的传球也从中心开始,因为这更重要。
  3. 多通道方法很适合猜测。如果两行中的四个像素具有相同的值,那么中间的像素可能具有相同的值,所以不要计算它们。这在某些图像上非常有效。最后进行清理以查找计算错误的像素是必要的,并且通常会发现一些错误,但在清理通过后我从未见过可见的错误,这可以提供 10 倍以上的加速。可以禁用此功能。可以在状态窗口中查看此功能的成功(猜测百分比)。
  4. 放大(双击放大)时,可以将之前计算的像素作为起点,这样只有四分之三的像素需要计算。当所需的精度提高但这些不连续性很少见时,这不起作用。

更复杂的算法绝对是可能的。例如,曲线跟随。

快速数学也有帮助。 FX 中的高精度例程是完全展开的汇编语言(由 C# 代码生成),使用 64 位乘法。

FX 还对两个最大灯泡内的点进行了几次检查,以避免计算它们。它还监视计算中的循环——如果出现完全相同的点,则计算将重复。

要查看实际情况,请访问http://www.cygnus-software.com/

【讨论】:

  • 在我看来,您的回答被低估了。对于您的第四点,您是在谈论Huvpička algorithm (used in Xaos)
  • 谢谢你这么说。我以前从未听说过这种称为 Huvpička 算法的技术。 FX 已经做了 18 年的变化,我认为我以前的分形程序也做了,所以将近 30 年?早在 Xaos 之前,虽然 Xaos 可能会以新的有趣的方式来做这件事。
  • 您有关于此的任何文档/博客文章吗?
  • @Zboson 我不认为 FX 文档明确涵盖了这一点 - 这是用户不需要知道的内部细节。 cygnus-software.com/docs/index.html 介绍了一些相关的优化。在计算缩放电影时,大量使用在进行 2 倍缩放时仅计算 3/4 的像素。此外,对于那些电影,中心的四分之一像素没有被存储,因为它们隐含在下一张图像中。同样的想法。
【解决方案2】:

我认为该网站并不像您认为的那么聪明。我认为缩放时发生的事情是这样的:

  • 获取上一张图像,使用标准插值方法将其放大。这为您提供了“模糊”放大的图像。多次单击放大按钮以查看最佳效果
  • 然后,在从中心点开始的同心圆中,以全分辨率重新计算新缩放级别的图像正方形。这会从中心向外逐渐“锐化”图像。因为您可能正在查看中心,所以您会立即看到改进。

你可以更清楚地看到它在做什么,通过放大,然后在对角线方向拖动图像,这样几乎所有的屏幕都没有绘制。当您释放拖动时,您将看到图像逐渐呈现为正方形,从新中心开始呈同心圆。

我还没有检查过,但我认为以不同的方式处理集合点并没有什么聪明的地方——只是因为一个完全集合的正方形在重新渲染之前和之后都是黑色的,你可以'看不出有什么区别。

【讨论】:

    【解决方案3】:

    老式的 Mandelbrot 渲染算法是从左上角开始计算像素,向右移动直到到达屏幕末尾,然后移动到下一行的开头,就像普通的打字机(视觉上)。

    链接算法只是以不同的顺序计算像素,当它计算一个时,它会迅速对某些相邻像素做出假设,然后再返回以正确重绘它们。当您看到 改进 时,将其视为显示渐进式 JPEG。如果放大该集合,某些像素值将保持不变(它们不需要重新计算),中间像素将被猜测、快速绘制并稍后重新计算。

    不断改进的 Mandelbrot 只是为了您的眼睛,它永远不会比可以检测“岛屿”的正确计算每像素算法更早完成。

    【讨论】:

    • 但是您如何确定该点是否在心形线内,即最后一个周期 2 灯泡?这是什么意思?
    • 它用相同的颜色填充像素?
    • 是的。试试 AakashM 的建议。快速放大场景,然后抓住屏幕向左或向右移动。在这种状态下没有绘制像素,当您释放鼠标按钮时,屏幕将重新绘制。
    • 是的,但是你如何做出假设。 Kd-tree,四叉树?
    • 在我看来,这是一个简单的最近邻像素加倍。没有魔法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多