Buddhabrot 是什么:它和曼德博集合有什么关系,如何生成这种分形图
更新时间
Buddhabrot 是曼德博集合的一种渲染方式:它不按每个点的逃逸时间着色,而是统计所有“逃逸点”在迭代过程中经过的复平面位置,把轨迹落点累积成密度图。这样得到的图像会呈现坐佛状的轮廓。生成它的核心步骤是:在复平面随机采样、迭代、记录最终逃逸的点的完整轨迹、把轨迹点累加到直方图,再把密度映射为亮度或颜色。它适合愿意花时间调参和长时间渲染的分形爱好者;如果只想快速看到曼德博集合的形状,用常规逃逸时间着色会更快。
它和曼德博集合的关系
两者使用同一套迭代规则:
[ z_{n+1} = z_n^2 + c,\quad z_0 = 0 ]
对每个复数 (c),反复迭代。若 (|z_n|) 超过逃逸半径(通常取 2),就认为该点“逃逸”;若在迭代上限内始终不逃逸,就认为它属于曼德博集合(近似)。
区别在渲染方式:
| 维度 | 常规曼德博集合图 | Buddhabrot |
|---|---|---|
| 着色依据 | 每个点自身的逃逸时间 | 所有逃逸点轨迹经过各位置的次数 |
| 统计对象 | 像素对应的 (c) | 迭代过程中的 (z_n) |
| 视觉结果 | 集合边界清晰、色彩分层 | 云雾状密度图,出现坐佛轮廓 |
| 计算特点 | 每个像素独立计算 | 需要大量采样点累积直方图 |
关键点在于:Buddhabrot 只记录最终逃逸的点的轨迹,属于集合内部的点不贡献轨迹。因此图像亮的地方,是逃逸轨迹频繁经过的区域,而不是集合本身。
为什么会出现坐佛轮廓
坐佛形状不是人为设计的,而是轨迹密度分布的自然结果。逃逸点从复平面各处出发,在逃逸前会围绕某些区域反复盘旋,这些区域的轨迹落点更密集,累积后就形成明暗结构。由于曼德博集合在实轴附近具有对称性,图像通常左右对称;旋转、镜像、调整颜色映射后,会出现不同的视觉变体,但底层数据仍是同一类轨迹密度统计。
生成步骤
前提
- 能进行复数运算和随机数生成的编程环境(Python、C、Rust 等均可)。
- 接受较长渲染时间:采样数越大,图像越平滑,耗时也越长。
具体步骤
- 确定采样范围:在复平面上选取一个矩形区域,通常覆盖曼德博集合附近,例如实部约 ([-2, 1])、虚部约 ([-1.5, 1.5])。范围过大会稀释密度,范围过小会裁掉轮廓。
- 随机采样点:在该范围内均匀随机生成复数 (c)。
- 迭代并判断逃逸:对每个 (c) 从 (z_0 = 0) 开始迭代,设置迭代上限和逃逸半径。若在迭代上限内 (|z_n|) 超过逃逸半径,标记为逃逸点;否则丢弃。
- 记录轨迹:对逃逸点,把它迭代过程中经过的每个 (z_n) 都记录下来。注意记录的是 (z_n),不是 (c)。
- 累积直方图:把轨迹点映射到像素网格,对应格子的计数加一。所有采样点处理完后,得到一个二维计数矩阵。
- 映射颜色:对计数做归一化或对数变换,再映射到亮度或调色板。直接线性映射容易让少数高密度区域过曝,对数或幂次变换更常用。
- 验证结果:先跑少量采样(例如几万到几十万点),确认图像出现对称的云雾结构;再逐步增加采样数提升细节。
常见卡点与排查
- 图像几乎空白:采样范围可能偏离曼德博集合,或迭代上限太低导致几乎没有点逃逸。先缩小范围、提高迭代上限测试。
- 图像过曝、细节丢失:高密度区域计数远高于其他区域。改用对数缩放或对计数取平方根后再映射。
- 轮廓模糊、噪点多:采样数不足。Buddhabrot 依赖大量随机点累积,增加采样数通常比调颜色更有效。
- 左右不对称:检查是否只记录了部分轨迹,或采样范围在虚轴方向不对称。
关键参数怎么影响结果
| 参数 | 作用 | 调大后的典型影响 |
|---|---|---|
| 迭代上限 | 决定哪些点算“不逃逸” | 更多点被判定为集合内部而不贡献轨迹,轮廓更严格,计算更慢 |
| 采样数 | 随机点的数量 | 密度图更平滑、噪点更少,耗时近似线性增加 |
| 逃逸半径 | 判定逃逸的阈值 | 轨迹记录更长,图像结构可能变化,通常保持 2 附近 |
| 采样范围 | 随机点的分布区域 | 范围越大,单点密度越低,需要更多采样才能看清结构 |
实际调参时,建议固定逃逸半径,先确定采样范围和迭代上限,再逐步增加采样数观察图像收敛情况。
适用场景
Buddhabrot 更适合展示和探索分形渲染的统计思路,而不是快速查看曼德博集合边界。它计算量大、需要反复调参,适合有耐心做长时间渲染、愿意尝试不同颜色映射和采样策略的人。如果目标只是理解曼德博集合的逃逸时间结构,常规渲染更直接。