欢迎光临散文网 会员登陆 & 注册

Houdini学习笔记037_Mandelbrot Set(曼德勃罗集)

2022-09-28 12:09 作者:独孤嘌呤  | 我要投稿

今天的内容相对比较简单,我们来学习下面这个图案的绘制方法。

这是一个经典的分形图案,叫做Mandelbrot Set(曼德勃罗集),是由美国数学家Mandelbrot教授发现的。生成的方式来自于一个简单的迭代公式:z(n+1) = z(n)^2 + c。其中,z是一个复数(可表示为z = a + bi)。所有使得无限迭代后的结果能保持有限数值的复数z的集合(也称该迭代函数的Julia集)连通的c,构成曼德勃罗集(from百度百科)。

最简单的生成曼德勃罗集图案的算法是“escape time”(逃逸时间)算法。其基本思路是:对于平面中的初始位置(x, y),不断进行迭代。每次结果作为下次迭代的初始值。当满足某种条件时,视为“逃逸”发生,并记录下迭代的次数。对处于Mandelbrot集中的点来说,永远不可能发生“逃逸”。所以需要设定一个最大迭代次数,当达到这个迭代次数还没有发生“逃逸”的点,我们就认为它是曼德勃罗集中的点。

具体的算法步骤来源于下面这一段:

from Wikipedia

在Houdini中,我们可以创建一个grid(XY平面),设置其分段为1000×1000(该数值决定了最终图案的分辨率)。然后用Point Wrangle节点对每个点进行迭代计算,由于point wrangle是多线程处理的方式,计算速度还是可以的。

曼德勃罗集图案的X坐标范围在(-2.00, 0.47),Y坐标范围在(-1.12, 1.12)。因此平面的尺寸和中心位置可设置如下,确保最终图案能在平面范围内显示。

VEX代码相对也很简单,如下所示:

这里先自定义一个Mandelbrot函数,得到每个点的逃逸步数。逃逸条件为:x*x+y*y < 4。并设置最大迭代次数maxIteration,如果达到这个次数还未逃逸,迭代终止。因为不确定循环的步数,使用的是while语句。

最终返回的是逃逸发生时的迭代步数iter,如果未逃逸,iter = maxIteration

对于grid平面上的点,其坐标为(@P.x, @P.y)(z方向不考虑)。每个点都会返回一个逃逸步数,变量命名为escapeSteps,并将其赋予col属性。

用color节点进行着色,Color Type选择Ramp from Attribute,属性值Range范围从0到maxIteration。

当maxIteration的值越大时,得到的图案也会越精确。

如果想得到像素化风格的着色,color的着色对象Class可改为Primitive,同时VEX节点也要用Primitive Wrangle。 如下是250×250的grid平面得到的结果——

250×250 grid

今天的内容就到这里,感谢大家的阅读,国庆之后再见~

Houdini学习笔记037_Mandelbrot Set(曼德勃罗集)的评论 (共 条)

分享到微博请遵守国家法律