分形场景 (Fractal)
简介

分形(Fractal)是 MathArt 中最核心、最强大的场景之一,让您能够探索和创造令人惊叹的数学艺术作品。分形是一种具有自相似性的几何图形——无论放大多少倍,都能看到与整体相似的图案结构。这种"无限嵌套"的特性,使得分形成为数学与艺术交汇处最迷人的领域之一。
本场景基于 GPU Fragment Shader 实现高性能渲染,支持 10 种内置分形公式、10 种专业着色算法、3 种渐变调色板模式,以及扰动算法(Perturbation)驱动的超高精度深度缩放。从经典的 Mandelbrot 集到独特的 Spiral Septagon,每一种公式都蕴含着深刻的数学之美。
说明:
Symmetry Chaos为独立场景链路,不属于本页分形公式面板。若要调优网页风格的对称混沌图像(如 Mercedes/Shield/Sunflower),请在SymmetryChaos_*场景中使用其专属参数与运行时设置入口。
核心能力:
- GPU 高性能渲染:纯 GPU Fragment Shader 渲染,支持三种渲染策略(猜测/多次/单次),实时交互探索
- 10 种内置公式:涵盖幂函数族、牛顿族、有理函数族、超越函数族,从经典到高级一应俱全
- 10 种着色算法:包括平滑着色、分解着色、距离估算、轨道陷阱等专业算法
- 扰动算法深度缩放:基于 DoubleDouble 双精度浮点的参考轨道计算,支持 Ultra 级精度,可缩放至 10⁻⁸ 量级
- 三重调色板系统:手动调色板、IQ 余弦调色板、曲线调色板,配合 RGB/HSV 色彩空间插值
- 完整动画支持:参数振荡动画、缩放关键帧动画、渐变偏移动画,支持时间线编排
数学背景
什么是分形?
分形一词由数学家 Benoît B. Mandelbrot 于 1975 年在其著作 Les Objets Fractals 中首次提出,源自拉丁语 fractus(破碎的)。分形最显著的特征是自相似性:整体的结构在任意尺度上都以相似的形式重复出现。
在复动力系统(Complex Dynamical Systems)中,分形通过迭代映射产生。将复平面上的每个点作为初始值,反复应用同一个映射函数,根据迭代行为的差异,复平面被划分为不同的区域:
- 逃逸集(Escape Set):迭代后趋向无穷的点集合,构成分形的外部区域
- 收敛集(Convergent Set):迭代后收敛到有限值(不动点或周期轨道)的点集合,构成分形的内部区域
- 朱利亚集(Julia Set):逃逸集与收敛集之间的边界,具有无限复杂的分形结构
Mandelbrot 集与 Julia 集
Mandelbrot 集是复动力系统研究中最著名的对象,由 Benoît Mandelbrot 于 1980 年首次用计算机绘制。其迭代公式为:
其中 为迭代变量, 为复平面上的参数点, 为幂次(经典值为 2)。Mandelbrot 集研究的是参数空间:对于每个参数 ,判断从 开始的迭代是否逃逸。
Julia 集与 Mandelbrot 集密切相关,由法国数学家 Gaston Julia 和 Pierre Fatou 在 1918-1919 年间独立研究。Julia 集使用相同的迭代公式,但研究的是动力空间:参数 固定,对于不同的初始值 ,判断迭代是否逃逸。
Mandelbrot 集与 Julia 集之间存在深刻的对偶关系:Mandelbrot 集中的每个点 都对应一个 Julia 集。当 位于 Mandelbrot 集内部时,对应的 Julia 集是连通的;当 位于 Mandelbrot 集外部时,对应的 Julia 集是完全不连通的(Cantor 尘)。
Newton 分形
Newton 分形基于牛顿求根算法(Newton's Method)。对于方程 ,牛顿迭代为:
其中 为松弛系数(Relaxation Factor),默认值为 1。不同的初始值会收敛到方程的不同根,而收敛边界的划分产生了美丽的分形图案。与逃逸型分形不同,Newton 分形使用收敛判断而非逃逸判断。
历史背景
分形理论的发展贯穿了 20 世纪的数学史:
- 1918-1919:Gaston Julia 和 Pierre Fatou 独立研究了复迭代函数的动力学行为,奠定了 Julia 集的理论基础
- 1920s-1970s:分形理论长期处于数学界的边缘,因为其复杂结构难以用传统方法研究
- 1975:Benoît Mandelbrot 提出分形(Fractal)概念,并在 1980 年用计算机首次绘制了 Mandelbrot 集
- 1980s:计算机图形学的发展使得分形可视化成为可能,分形艺术开始兴起
- 2000s:扰动算法(Perturbation Theory)的引入使得深度缩放(Deep Zoom)成为现实,Karl Runmo 等人实现了 10⁻¹⁰⁰⁰ 量级的缩放
界面概览
所有控制项位于右侧的属性面板中,分为六个主要部分:
- Geometry(几何):选择分形公式、变体、调整公式参数、视图控制和渲染设置
- Camera(相机):控制观察视角
- Formulas(公式):显示数学公式和标注
- Appearance(外观):调整背景颜色、渐变调色板、着色算法和着色参数
- Parameters(参数):定义方程中使用的自定义常量(高级用法)
- Animation(动画):时间线与动画控制
配置指南
1. Geometry(几何设置)

几何设置是分形场景的核心,决定了分形的基本形态、数学特性和渲染方式。
公式选择
系统提供 10 种内置分形公式,按核族(Kernel Family)分类如下:
幂函数族(POWER)
Mandelbrot(曼德博集)
- 最经典的分形图形,展现了复平面上的无限细节
- 迭代公式:
- 参数:幂次(power)、逃逸半径(bailout)、起始点(start_point)
- 支持变体:Mandelbrot / Julia
- 支持扰动算法:是
- 终止策略:逃逸(Escape)
Julia(朱利亚集)
- 与 Mandelbrot 密切相关,每个 Julia 集都对应 Mandelbrot 集中的一个点
- 迭代公式:,其中 为固定的 Julia 种子值
- 参数:幂次(power)、逃逸半径(bailout)、起始点(start_point)、Julia 种子(julia_seed)
- 支持扰动算法:是
- 终止策略:逃逸(Escape)
Mandelbrot 和 Julia 共享同一迭代公式,区别在于参数 的角色:Mandelbrot 中 是复平面上的变量,Julia 中 是固定常数。
牛顿族(NEWTON_GENERIC)
Newton(牛顿分形)
- 基于牛顿求根算法,展现数学方程求根过程的美丽图案
- 迭代公式:
- 参数:指数(exponent,支持复数)、松弛系数(relaxation)
- 支持扰动算法:是
- 终止策略:收敛(Convergence)
- 注意:Newton 分形使用收敛判断而非逃逸判断,着色参数设置与其他分形不同
Nova(新星分形)
- Newton 分形的变体,在牛顿迭代中引入额外的 项
- 迭代公式:
- 参数:指数(exponent,支持复数)、松弛系数(relaxation)、起始值(start_value)
- 支持变体:Mandelbrot / Julia
- 支持扰动算法:是
- 终止策略:收敛(Convergence)
有理函数族(RATIONAL)
Phoenix(凤凰分形)
- 具有火焰般的外观,色彩层次丰富
- 使用前一次迭代的值参与计算,产生独特的反馈效果
- 参数:指数 1(exponent1)、指数 2(exponent2)、扭曲(distortion)
- 不支持扰动算法,深度缩放时精度受限
- 终止策略:逃逸(Escape)
Magnet I & II(磁铁分形)
- 包含 Magnet I 和 Magnet II 两种,形状如同磁铁吸引
- 基于有理函数迭代,兼具逃逸和收敛特性
- 参数:扰动(perturbation)、参数(parameter)、收敛阈值(convergent_bailout)
- 不支持扰动算法
- 终止策略:混合(Hybrid),需同时设置逃逸和收敛阈值
Lambda(Lambda 分形)
- 展现参数空间的复杂结构
- 基于复数逻辑斯蒂映射:
- 参数:Lambda 系数(lambda)
- 不支持扰动算法
- 终止策略:逃逸(Escape)
Spiral Septagon(螺旋七边形)
- 具有螺旋和七边形特征的独特分形
- 基于有理函数迭代,需要奇点保护参数
- 参数:Phi、指数(exponent)、奇点保护阈值(singularity_guard)
- 不支持扰动算法
- 终止策略:逃逸(Escape)
- 注意:奇点保护阈值防止数值计算异常,建议不要修改默认值
超越函数族(TRANSCENDENTAL)
Complex Sin(复数正弦)
- 基于复数正弦函数的分形
- 迭代公式:
- 产生独特的超越函数分形图案
- 不支持扰动算法
- 终止策略:逃逸(Escape)
[截图占位: 展示不同公式的分形效果对比]
变体选择
某些分形公式支持 Mandelbrot 和 Julia 两种变体:
- Mandelbrot 变体:在复平面上探索参数空间,每个点对应一个 Julia 集
- Julia 变体:使用固定的 Julia 种子值,展现该种子对应的 Julia 集图案
当公式同时支持两种变体时,您可以在"变体"下拉菜单中切换。目前支持双变体的公式包括:Mandelbrot、Nova。
切换变体时,系统会自动同步公式参数。从 Mandelbrot 切换到 Julia 时,当前的 Julia 常数将被激活为迭代参数。
公式参数
每个分形公式都有其特定的参数,这些参数直接影响分形的形态。参数面板根据公式元数据动态生成,支持以下参数类型:
- 整数参数:如幂次(power)、对称度数等,使用步进输入框
- 浮点参数:如逃逸半径(bailout)、松弛系数(relaxation)等,使用数值输入框
- 复数参数:如 Julia 种子(julia_seed)、指数(exponent)等,拆分为实部(Re)和虚部(Im)两个输入框
- 布尔参数:使用开关切换
通用参数说明
| 参数 | 含义 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| power | 幂次 | 整数/复数 | 2 | 控制分形的基本形态,p=2 为经典形态 |
| bailout | 逃逸半径 | 浮点 | 4.0 | 判断点是否逃逸的阈值 |
| start_point | 起始点 | 复数 | (0, 0) | 迭代起始点 |
| julia_seed | Julia 种子 | 复数 | 因公式而异 | 定义 Julia 集的形态 |
| relaxation | 松弛系数 | 浮点 | 1.0 | Newton/Nova 的收敛速度控制 |
| exponent | 指数 | 复数 | 因公式而异 | Newton/Nova 的方程幂次 |
| convergent_bailout | 收敛阈值 | 浮点 | 1e-6 | Magnet 的收敛判断阈值 |
技巧:在 Mandelbrot 集中点击某个点,可以快速将该点设置为 Julia 种子,这是探索 Julia 集最直观的方式。
视图控制
- Center X/Y(中心位置):定义视图的中心坐标,支持高精度显示(DoubleDouble 双精度),适合深度缩放
- Zoom(缩放):控制视图的放大倍数,数值越大看到的细节越多,可通过鼠标滚轮快速调整
- Rotation(旋转):控制视图的旋转角度(弧度),可创建旋转动画效果
注意:深度缩放(Zoom > 100)时需要启用扰动算法以保持精度。中心坐标使用 DoubleDouble 双精度表示,可精确到 10⁻³⁰ 量级。
渲染设置
渲染方法(Render Method)
MathArt 提供三种渲染方法,平衡质量和性能:
| 渲染方法 | 英文名 | 特点 | 适用场景 |
|---|---|---|---|
| 猜测渲染 | Guessing | 使用智能算法预测细节,速度最快 | 快速预览、参数探索 |
| 多次渲染 | Multi Pass | 先低分辨率后逐步提高,平衡响应与质量 | 交互式探索 |
| 单次渲染 | One Pass | 一次性全分辨率渲染,质量最高 | 最终输出 |
建议:在探索阶段使用 Guessing 或 Multi Pass,最终输出时切换到 One Pass 获得最佳质量。
扰动精度(Perturbation Precision)
扰动算法是一种高级渲染技术,允许超高精度的分形渲染。当缩放级别超过阈值时,系统会自动启用扰动算法:
| 精度级别 | 阈值 | 说明 |
|---|---|---|
| Low | 1.0e-2 | 快速渲染,精度较低,适合快速预览 |
| Medium | 1.0e-4 | 平衡精度和速度,适合大多数情况 |
| High | 1.0e-6 | 高精度渲染,适合中等深度缩放 |
| Ultra | 1.0e-8 | 最高精度,适合深度缩放,但需要更多计算资源 |
扰动算法支持情况:
| 公式 | 支持扰动 | 原因 |
|---|---|---|
| Mandelbrot | ✅ | 整数幂次,满足扰动条件 |
| Julia | ✅ | 整数幂次,满足扰动条件 |
| Newton | ✅ | 满足扰动条件 |
| Nova | ✅ | 满足扰动条件 |
| Phoenix | ❌ | 迭代依赖前一次值,不满足扰动条件 |
| Magnet I/II | ❌ | 有理函数迭代,不满足扰动条件 |
| Lambda | ❌ | 不满足扰动条件 |
| Complex Sin | ❌ | 超越函数,不满足扰动条件 |
| Spiral Septagon | ❌ | 有理函数,不满足扰动条件 |
2. Camera(相机控制)
调整观察视角和相机参数。分形场景始终为 2D 渲染,相机控制主要用于旋转和倾斜观察。
- Phi(俯仰角):相机的垂直角度,范围 0 到 π,默认 π/2(水平观察)
- Theta(偏航角):相机的水平角度,范围 0 到 2π,默认 0
- Gamma(滚转角):相机的旋转角度,范围 0 到 2π,默认 0
分形通常使用正上方俯视(Phi = 0 或 π)或水平观察(Phi = π/2)。结合时间线系统可以创建相机旋转动画。
3. Formulas(公式显示)
在场景中显示数学公式和方程,非常适合制作教学视频或展示分形的数学美感。
主方程显示
- Show Main Equation(显示主方程):开启/关闭主方程显示
- 系统会根据当前公式和参数自动生成公式文本
- 主方程位置:
- X:水平位置坐标
- Y:垂直位置坐标
- Scale:公式缩放比例
- Color:公式颜色
自定义公式
可以添加多个自定义公式到场景中:
- 添加公式:点击 "Add Formula" 按钮添加新公式
- 公式内容:LaTeX 格式、X/Y 位置、缩放比例、颜色
- 删除公式:点击公式右上角的删除按钮移除
4. Appearance(外观设置)
外观设置让您完全掌控分形的视觉表现,从颜色到着色算法,打造独一无二的艺术作品。

背景颜色
- Background Color:设置渲染背景颜色
- 分形通常使用黑色或深色背景以突出细节
渐变调色板
渐变(颜色映射)是分形艺术的核心,决定了分形的色彩表现。MathArt 提供三种渐变模式:
手动调色板模式(Manual)

手动调色板让您精确控制每个颜色节点:
- 颜色节点:最多支持 25 个颜色节点
- 添加颜色:点击调色板下方的 "+" 按钮添加新颜色
- 删除颜色:双击某个颜色节点可以删除它(至少保留 2 个颜色)
- 调整颜色:点击颜色块打开颜色选择器
- 调整位置:拖动颜色节点改变其在渐变中的位置
- 随机生成:点击随机按钮生成随机调色板
- 反转:点击反转按钮反转颜色顺序
随机调色板策略:
| 策略 | 英文名 | 特点 |
|---|---|---|
| 单色 | Monochromatic | 基于单一色调的变化 |
| 类似色 | Analogous | 使用相邻色调 |
| 互补色 | Complementary | 使用对比色调 |
| 分裂互补色 | Split Complementary | 使用分裂互补色调 |
技巧:使用对比强烈的颜色可以突出分形细节;相邻颜色选择相近色调可创造平滑过渡;冷暖色调对比往往效果惊艳。
余弦调色板模式(Cosine)

余弦调色板使用 IQ(Inigo Quilez)提出的数学公式生成平滑的渐变效果:
| 参数 | 含义 | 作用 |
|---|---|---|
| Bias (A) | 基础颜色值 | 控制颜色通道的基准值 |
| Amplitude (B) | 颜色变化幅度 | 控制颜色通道的变化范围 |
| Frequency (C) | 颜色变化频率 | 控制颜色循环的次数 |
| Phase (D) | 颜色变化起始相位 | 控制颜色循环的起始位置 |
每个参数都可以分别调整红、绿、蓝三个颜色通道。
余弦调色板特别适合创造彩虹般平滑的色彩过渡效果。调整频率可以控制颜色循环的密度,使用随机按钮可以快速生成美观的调色板。
曲线调色板模式(Curve)

曲线调色板提供最灵活的颜色控制方式,通过可编辑的贝塞尔曲线分别控制 R/G/B 三个通道:
- 添加控制点:在曲线上单击空白区域添加新控制点
- 删除控制点:双击控制点删除它(至少保留 2 个点)
- 移动控制点:拖动控制点调整曲线形状
- 通道切换:分别编辑红、绿、蓝三个颜色通道
使用 S 形曲线可以创造平滑的颜色过渡;为不同通道设置不同的曲线形状可以创造独特的色彩效果。
调色板空间
选择颜色插值的色彩空间:
- RGB:在 RGB 色彩空间中插值,颜色过渡直接
- HSV:在 HSV 色彩空间中插值,颜色过渡更自然和谐
HSV 空间通常能产生更和谐的色彩过渡效果,推荐用于大多数情况。
着色算法
着色算法决定了如何将迭代结果映射到颜色。MathArt 提供 10 种专业的着色算法,分为索引型(INDEX)和直接型(DIRECT)两大类:
[截图占位: 展示不同着色算法的效果对比]
内部着色(Inside Coloring)
内部着色应用于分形集合内部的点(未逃逸/收敛的点):
| 算法 | 英文名 | 输出类型 | 说明 |
|---|---|---|---|
| 无 | None | INDEX | 使用固定颜色填充内部 |
| 基础 | Basic | INDEX | 基于迭代次数的简单着色,支持多种度量方式 |
| 平滑 Mandelbrot | Smooth Mandelbrot | INDEX | 产生平滑的颜色过渡,消除色带 |
| 分解 | Decomposition | INDEX | 基于角度的着色,展现复数的相位信息 |
| 二进制分解 | Binary Decomposition | INDEX | 基于符号的二值化着色 |
| 距离估算 | Distance Estimator | INDEX | 基于到集合边界的距离着色 |
| 直接域 | Direct Domain | DIRECT | 直接使用复数值作为颜色 |
| 直接轨道陷阱 | Direct Orbit Trap | DIRECT | 基于轨道陷阱的着色 |
| 直接归一化 Z | Direct Normalized Z | DIRECT | 归一化后的复数值着色 |
| 轨道陷阱索引 | Orbit Trap (Index) | INDEX | 基于轨道陷阱的索引着色 |
外部着色(Outside Coloring)
外部着色应用于分形集合外部的点(逃逸的点),提供与内部着色相同的算法选择,但通常使用不同的参数设置。
对于 Mandelbrot/Julia 集,外部着色通常比内部着色更重要。Smooth Mandelbrot 是最常用的外部着色算法,能产生平滑的色彩过渡。
着色参数
每种着色算法都有其特定的参数,分为通用参数和算法特定参数:
通用参数
颜色密度(Color Density)
- 控制颜色变化的频率
- 较大的值会产生更多的颜色循环
- 建议范围:0.1 - 10.0
传递函数(Transfer Function)
控制迭代值到颜色索引的映射方式:
| 传递函数 | 英文名 | 数学表达 | 效果 |
|---|---|---|---|
| 无 | None | 直接使用原始值 | |
| 线性 | Linear | 线性映射 | |
| 平方 | SQR | 增强高值区域 | |
| 平方根 | SQRT | 增强低值区域 | |
| 立方 | CUBE | 强烈增强高值区域 | |
| 立方根 | CUBEROOT | 强烈增强低值区域 | |
| 对数 | LOG | 压缩高值区域,展现更多细节 | |
| 指数 | EXP | 扩展高值区域 | |
| 正弦 | SIN | 产生周期性变化 | |
| 反正切 | ARCTAN | 平滑过渡 |
技巧:使用 LOG 传递函数可以展现更多细节;SQR 和 CUBE 适合突出分形的主要结构;SQRT 和 CUBEROOT 适合展现细微的细节。
渐变偏移(Gradient Offset)
- 调整颜色在渐变中的起始位置
- 用于微调颜色分布
重复渐变(Repeat Gradient)
- 勾选:颜色循环重复
- 不勾选:超出范围部分使用固定颜色
固定颜色(Solid Color)
- 当不重复渐变时,超出范围部分使用的颜色
算法特定参数
Basic 着色
- 度量(Metric):选择用于着色的度量方式
- ITERATION:迭代次数
- REAL:实部值
- IMAGINARY:虚部值
- SUM:实部和虚部的和
Smooth Mandelbrot 着色
- 指数(Exponent):通常与分形的幂次相同,支持复数值
- 幂次(Power):影响平滑度
- 逃逸半径(Bailout):应与分形设置中的逃逸半径一致
Binary Decomposition 着色
- 分解类型(Decomposition Type):
- TYPE_1:基于实部符号
- TYPE_2:基于虚部符号
Distance Estimator 着色
- 幂次(Power):应与分形的幂次一致
Direct Domain 着色
- 缩放(Scale):颜色缩放因子
- 伽马(Gamma):伽马校正值
- 饱和度(Saturation):颜色饱和度
Direct Orbit Trap 着色
- 陷阱形状(Trap Shape):点、环、十字
- 陷阱半径(Trap Radius):陷阱大小
- 陷阱中心(Trap Center):陷阱位置
- 旋转(Rotation):陷阱旋转角度
- 纵横比(Aspect Ratio):陷阱形状比例
- 阈值(Threshold):陷阱激活阈值
- 混合因子(Mix Factor):渐变混合比例
- 合并不透明度(Merge Opacity):轨道合并透明度
5. Parameters(参数)
定义方程中使用的自定义常量,属于高级用法。大多数情况下,公式参数面板已经提供了所有必要的参数控制。
动画和时间线
分形场景支持强大的动画功能,让您创建动态的分形艺术作品。
参数振荡动画
参数振荡动画通过 FractalParameterAnimator 实现,可以让参数在指定范围内做周期性正弦振荡。
工作原理
- 为每个参数指定振荡的步长(step)、范围(min, max)和边沿缓动(edge easing)
- 参数值在 [min, max] 范围内做正弦振荡:
value = mid + amp * sin(phase) - 振荡速度由步长和步长缩放因子(step scale)共同控制
- 边沿缓动确保参数接近范围边界时减速,避免突变
可动画化的参数
所有公式参数均支持动画化,包括:
- 视图参数:Center X/Y、Zoom、Rotation
- 迭代参数:Iterations、Bailout
- Julia 参数:Julia Cx/Cy
- 公式特定参数:根据公式类型动态决定
参数模式
动画器支持四种参数模式:
- SCALAR:标量参数,如迭代次数、逃逸半径
- COMPLEX_FULL:复数参数,实部和虚部同时振荡
- COMPLEX_REAL:复数参数,仅实部振荡
- COMPLEX_IMAG:复数参数,仅虚部振荡
缩放动画
创建令人惊叹的缩放动画,这是分形场景最具特色的动画类型:
特点:
- 支持高精度坐标,可以创建深度缩放动画
- 使用对数插值,缩放变化更自然
- 支持缩放感知的中心点移动
创建缩放动画:
- 添加缩放动画片段
- 设置起始和结束的缩放级别
- 设置目标中心位置
- 调整动画曲线控制缩放速度
技巧:使用指数缩放曲线可以创造更自然的缩放效果;深度缩放时建议启用高精度扰动算法。
渐变动画
渐变动画让颜色随时间变化:
- 调色板偏移(Palette Offset):整体偏移调色板位置
- 内部渐变偏移(Inside Gradient Offset):偏移内部着色的渐变
- 外部渐变偏移(Outside Gradient Offset):偏移外部着色的渐变
配置方法
通过 JSON 配置文件中的 timeline 数组定义动画序列:
{
"timeline": [
{
"type": "wait",
"duration": 5,
"label": "Wait",
"easing": "SINE_IN_OUT"
}
]
}[截图占位: 展示时间线面板和动画设置]
性能与最佳实践
推荐配置
| 目标 | 迭代次数 | 渲染方法 | 扰动精度 | 着色算法 |
|---|---|---|---|---|
| 快速探索 | 100-300 | Guessing | Low/Medium | Basic |
| 交互式调整 | 300-500 | Multi Pass | Medium/High | Smooth Mandelbrot |
| 高质量输出 | 500-2000 | One Pass | High/Ultra | Smooth Mandelbrot / DE |
| 深度缩放 | 1000+ | One Pass | Ultra | Smooth Mandelbrot |
性能优化技巧
- 迭代次数:
- 探索时使用较低值(100-300),找到满意构图后再提高
- 迭代次数与渲染时间近似线性关系
- 渲染方法:
- 交互时使用 Multi Pass,输出时使用 One Pass
- Guessing 最快但可能丢失细节
- 着色算法:
- Basic 着色渲染最快
- Direct 系列算法需要额外计算,渲染稍慢
- Distance Estimator 需要导数计算,渲染最慢
- 扰动算法:
- 仅在深度缩放时自动启用
- 更高的精度级别需要更多计算资源和内存
- 不支持扰动的公式在深度缩放时会出现精度损失
- 调色板:
- 手动调色板和余弦调色板渲染效率相同
- Gradient LUT 在 CPU 端预计算,对渲染性能影响极小
常见问题
分形看起来很模糊
问题:渲染结果模糊,细节不清晰
原因:迭代次数不足或缩放级别过高导致精度损失
解决方案:
- 增加迭代次数(建议 300 以上)
- 使用扰动算法提高精度(High 或 Ultra)
- 检查渲染方法设置,One Pass 质量最高
- 确认逃逸半径设置合理(通常为 4.0)
颜色出现明显色带
问题:分形颜色出现条纹状色带,不够平滑
原因:着色算法或传递函数选择不当
解决方案:
- 使用 Smooth Mandelbrot 着色算法替代 Basic
- 选择 LOG 或 SQRT 传递函数
- 使用 HSV 调色板空间
- 尝试余弦或曲线调色板模式
渲染速度太慢
问题:分形渲染耗时过长
原因:参数设置过高或渲染方法不当
解决方案:
- 降低迭代次数
- 使用 Guessing 或 Multi Pass 渲染方法
- 简化着色算法(Basic 最快)
- 降低扰动精度(如果不需要深度缩放)
- 关闭扰动算法(浅层缩放时不需要)
深度缩放出现像素化
问题:深度缩放后画面出现方块状像素
原因:浮点精度不足,标准双精度浮点在缩放超过 10¹³ 倍后精度耗尽
解决方案:
- 确保使用支持扰动的公式(Mandelbrot、Julia、Newton、Nova)
- 设置扰动精度为 High 或 Ultra
- 对于不支持扰动的公式,深度缩放精度受限是数学上的固有限制
如何找到有趣的分形细节
建议:
- 从 Mandelbrot 集开始探索
- 缩放到边界区域——最丰富的细节总在边界上
- 寻找螺旋、海马、象鼻等经典结构
- 使用不同的着色算法突出细节
- 尝试不同的公式和参数组合
- 调整颜色密度和传递函数改变视觉表现
如何创建 Julia 集
步骤:
- 选择支持 Julia 变体的公式(如 Mandelbrot、Nova)
- 在变体下拉菜单中选择 "Julia"
- 调整 Julia 种子参数
- 技巧:在 Mandelbrot 集中点击某个点,可以快速将该点设置为 Julia 种子
经典分形示例
Mandelbrot 集(默认配置)
以下为 MathArt 内置的 Mandelbrot 示例配置(mandelbrot.json):
公式:Mandelbrot
变体:MANDELBROT
幂次:2
逃逸半径:4
迭代次数:300
中心:(-0.7, 0)
缩放:0.5
旋转:0
渲染方法:Multi Pass
扰动精度:Ultra调色板(16 色):
#2A2A32 → #304A58 → #376B7E → #3E8CA4 → #52ACB6 → #8AB5BC → #C2BEC2 → #CCC79A
→ #D4B75B → #DB8F1C → #B86707 → #753F0C → #332211 → #251915 → #17111A → #10081F着色配置:
外部着色:Basic(度量=ITERATION,颜色密度=3,传递函数=LINEAR)
内部着色:None(固定颜色=#000000)Julia 集(海马谷附近)
公式:Mandelbrot
变体:JULIA
幂次:2
Julia 种子:(-0.8123, 0.016)
逃逸半径:4
迭代次数:500Newton 分形(三根)
公式:Newton
指数:3(实数)
松弛系数:1.0
迭代次数:200Nova 分形(五根)
公式:Nova
变体:MANDELBROT
指数:5(实数)
松弛系数:1.0
起始值:(1, 0)
迭代次数:300技术细节
GPU 渲染管线
分形场景使用 GPU Fragment Shader 渲染管线,核心流程如下:
- Shader 编译:
ShaderCompilationManager根据公式注册信息动态编译 Fragment Shader- 采用部件拼接架构:22 个 GLSL 部件按需拼接,注入
#define宏 - 编译结果缓存,避免重复编译
- 渲染执行:
- 设置所有 uniform(中心、缩放、旋转、迭代、公式参数、着色参数)
- 判定是否启用扰动算法
- 如需扰动:计算参考轨道 → 打包 RGBA32F 纹理 → 上传 GPU
- 生成 Gradient LUT 纹理(1024 采样点)
- 绘制全屏 QUAD,Fragment Shader 逐像素计算
- 着色流程:
- Fragment Shader 执行公式迭代
- 根据着色算法计算颜色索引或直接颜色
- 通过 Gradient LUT 或 Cosine Palette 采样获得最终颜色
扰动算法
扰动算法(Perturbation Theory)是深度缩放的核心技术,由 Pauldelbrot 等人于 2013-2014 年在 fractalforums.com 社区提出:
工作原理:
- 在 CPU 端使用 DoubleDouble 双精度计算参考点的完整轨道
- 将参考轨道以 RGBA32F 纹理上传 GPU
- GPU 端对每个像素,基于参考轨道进行扰动迭代
- 避免了深度缩放时标准双精度浮点的精度损失
精度判定:
- 公式必须支持扰动(满足特定数学条件)
- 幂次必须为整数
- 缩放级别超过阈值(zoom > 100)
- 迭代次数 > 0
公式注册系统
公式系统采用注册表驱动的插件式架构:
FormulaRegistry:全局公式注册表(ConcurrentHashMap),单例模式FormulaMetadata:描述公式的完整能力与参数,UI 层据此自动生成编辑器StandardFormulaCatalog:注册 10 种内置公式FormulaDomainService:构建运行时状态、判定扰动可用性、参数打包
着色算法注册系统
着色算法同样采用注册表模式:
ColoringRegistry:全局着色算法注册表ColoringMetadata:描述着色算法的输出类型、适用域、参数定义StandardColoringCatalog:注册 10 种内置着色算法ColoringRuntimeMapper:解析请求 ID、校验参数、返回映射结果
颜色系统三重体系
- 调色板直传:最多 16 色调色板以
u_paletteuniform 传入 shader - Cosine Palette:IQ 风格余弦调色板,参数 a/b/c/d 通过 uniform 传入
- Gradient LUT:CPU 端预计算 1024 点查找表,以 RGB32F 纹理上传 GPU,支持 RGB/HSV 插值
创作技巧
参数探索
- 从经典公式开始:Mandelbrot 是最好的起点,边界区域蕴含无限细节
- 缩放到边界:分形最丰富的细节总在逃逸集与收敛集的边界上
- 调整幂次:改变幂次可以创造不同形态的变体,p=3 产生三重对称
- 探索 Julia 集:在 Mandelbrot 集边界附近选择 Julia 种子,往往能发现精美的图案
视觉调优
- 着色方案:
- 先选择合适的着色算法(Smooth Mandelbrot 是最通用的选择)
- 再调整传递函数(LOG 适合展现细节,SQR 适合突出结构)
- 最后微调颜色密度和渐变偏移
- 色彩搭配:
- 使用余弦调色板快速生成和谐的色彩方案
- 深色背景配合高饱和度色彩通常效果最佳
- HSV 色彩空间插值通常比 RGB 更和谐
- 细节突出:
- Distance Estimator 着色可以清晰展现分形边界
- 增大颜色密度可以展现更多层次
- Orbit Trap 着色可以创造独特的艺术效果
动画设计
- 缩放动画:
- 这是最具分形特色的动画类型
- 选择一个有趣的目标点,设置起始和结束缩放级别
- 使用指数缩放曲线使缩放速度更自然
- 深度缩放时务必启用高精度扰动
- 参数振荡:
- 为 Julia 种子设置振荡动画,观察图案的形态演变
- 为幂次设置振荡,创造形态渐变效果
- 边沿缓动确保参数在范围边界处平滑过渡
- 渐变动画:
- 渐变偏移动画可以让颜色"流动"起来
- 配合缩放动画使用,效果更加震撼
注意事项
- 扰动算法限制:
- 并非所有公式都支持扰动算法
- Phoenix、Magnet、Lambda、Complex Sin、Spiral Septagon 不支持扰动
- 不支持扰动的公式在深度缩放时精度受限,这是数学上的固有限制
- 迭代次数与质量:
- 迭代次数过低会导致细节丢失,表现为大面积的纯色区域
- 迭代次数过高会显著增加渲染时间,但未必带来可见的改善
- 建议从较低值开始,逐步提高直到细节不再增加
- 逃逸半径设置:
- 逃逸半径影响逃逸判断的灵敏度
- 过小的逃逸半径可能导致本应逃逸的点被误判为集合内部
- 过大的逃逸半径会浪费迭代次数
- 经典 Mandelbrot 集的逃逸半径通常设为 4.0(即 |z|² > 4)
- Newton/Nova 的收敛判断:
- 这两个公式使用收敛判断而非逃逸判断
- 内部着色对 Newton/Nova 更重要
- 收敛速度的差异可以产生丰富的色彩层次
- Magnet 分形的混合终止策略:
- Magnet 公式同时具有逃逸和收敛特性
- 需要同时设置逃逸半径和收敛阈值
- 两个阈值的平衡对渲染结果影响显著
进阶主题
理解扰动算法的数学原理
标准双精度浮点数约有 15-16 位有效数字。当缩放级别超过 10¹³ 倍时,相邻像素之间的距离小于浮点精度,导致所有像素计算出相同的迭代值——这就是"像素化"的原因。
扰动算法的核心思想是:选择一个参考点 ,用高精度计算其完整轨道 ,然后对附近的点 ,用标准精度计算扰动 :
由于 通常远小于 ,标准精度足以表示 的有效数字,从而避免了精度损失。
Mandelbrot 集与 Julia 集的对偶关系
Mandelbrot 集可以看作是 Julia 集的"目录":对于 Mandelbrot 集中的每个点 ,都存在一个对应的 Julia 集 。当 位于 Mandelbrot 集内部时, 是连通的;当 位于 Mandelbrot 集外部时, 是完全不连通的(Cantor 尘)。
Mandelbrot 集边界附近的点对应的 Julia 集最为复杂和美丽。这就是为什么在 Mandelbrot 集边界附近选择 Julia 种子往往能产生最精美的图案。
着色算法的数学原理
Smooth Mandelbrot 着色使用归一化迭代计数来消除色带:
其中 是逃逸时的迭代次数, 是幂次。这个公式将离散的迭代次数映射为连续值,从而实现平滑的颜色过渡。
Distance Estimator 着色基于到分形集合边界的距离估算:
其中 是 对 的导数。距离越小的点越接近集合边界,渲染为不同的亮度可以突出边界的精细结构。
创造自定义分形图案
虽然 MathArt 使用预设公式,但通过巧妙调整参数,您可以创造出丰富多变的分形图案:
- 从经典 Mandelbrot 集开始,缩放到感兴趣的边界区域
- 切换到 Julia 变体,将当前视图中心设为 Julia 种子
- 微调 Julia 种子的实部和虚部,观察图案的细微变化
- 尝试不同的幂次值,探索非经典形态
- 使用 Newton/Nova 公式,调整指数和松弛系数创造全新的图案
- 利用参数振荡动画探索参数空间中的连续变化
参考资源
数学理论
- Benoît B. Mandelbrot - The Fractal Geometry of Nature (1982)
- Gaston Julia - Mémoire sur l'itération des fonctions rationnelles (1918)
- Pierre Fatou - Sur les équations fonctionnelles (1919-1920)
- Heinz-Otto Peitgen & Peter H. Richter - The Beauty of Fractals (1986)
在线资源
- Wikipedia: Mandelbrot Set
- Wikipedia: Julia Set
- Wikipedia: Newton Fractal
- Inigo Quilez - Cosine Palettes — 余弦调色板公式参考
- Fractal Forums — 分形爱好者社区
扰动算法
- Pauldelbrot - Perturbation Theory for the Mandelbrot Set (2013-2014, fractalforums.com)
- Karl Runmo - Deep Zoom Technology — 实现了 10⁻¹⁰⁰⁰ 量级的缩放
