JavaScript曼得尔布集分形算法运算过程
今天无意间在折腾JavaScript曼得尔布集分形算法搞随机艺术图顺带来讲解一下,用一个具体的例子来追踪 JavaScript 曼德尔布罗集分形算法的算术过程。 选取一个复数 c
并跟踪迭代过程中的 z
值。
1. 选择一个复数 c:
假设选择 c = 0.3 + 0.4i
。 记住,i
代表虚数单位 (√-1)。
2. 初始化 z:
迭代开始时,z
被初始化为 0 + 0i
(即 z = {re: 0, im: 0}
)
3. 迭代过程 (使用复数运算):
将进行几次迭代,以观察 z
的值是如何变化的。 记住复数的加法和乘法规则:
- (a + bi) + (c + di) = (a + c) + (b + d)i
- (a + bi) * (c + di) = (ac - bd) + (ad + bc)i
迭代 1:
z_1 = z_0² + c = (0 + 0i)² + (0.3 + 0.4i) = 0.3 + 0.4i
迭代 2:
z_2 = z_1² + c = (0.3 + 0.4i)² + (0.3 + 0.4i)
首先计算
(0.3 + 0.4i)²
:(0.3 + 0.4i) * (0.3 + 0.4i) = (0.3*0.3 - 0.4*0.4) + (0.3*0.4 + 0.4*0.3)i = -0.07 + 0.24i
然后加上
c
:z_2 = -0.07 + 0.24i + 0.3 + 0.4i = 0.23 + 0.64i
迭代 3:
z_3 = z_2² + c = (0.23 + 0.64i)² + (0.3 + 0.4i)
首先计算
(0.23 + 0.64i)²
:(0.23 + 0.64i) * (0.23 + 0.64i) = (0.23*0.23 - 0.64*0.64) + (0.23*0.64 + 0.64*0.23)i = -0.3477 + 0.2944i
然后加上
c
:z_3 = -0.3477 + 0.2944i + 0.3 + 0.4i = -0.0477 + 0.6944i
- 迭代 4、5...等等: 这个过程会继续下去。
4. 模的计算:
在每次迭代之后,需要计算 z
的模(绝对值):|z| = √(z.re² + z.im²)
|z_1| = √(0.3² + 0.4²) = √0.25 = 0.5
|z_2| = √(0.23² + 0.64²) ≈ √0.4605 ≈ 0.6787
|z_3| = √((-0.0477)² + 0.6944²) ≈ √0.4866 ≈ 0.6976
5. 发散判断:
如果在任何迭代中,|z|
超过 2,则 c
不属于曼德尔布罗集,并且迭代过程停止。 如果迭代次数达到预设的最大迭代次数,仍然没有超过 2,则 c
属于曼德尔布罗集。
可以确定一个给定的复数 c
是否属于曼德尔布罗集,以及它距离集合边界的远近(通过迭代次数来表示)。 这个过程在计算机程序中被大量重复执行,以生成曼德尔布罗集的图像。 每次迭代都基于上一次迭代的结果进行计算。 这就是曼德尔布罗集分形算法的算术基础。