Skip to content

分形场景 (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⁻¹⁰⁰⁰ 量级的缩放

界面概览

所有控制项位于右侧的属性面板中,分为六个主要部分:

  1. Geometry(几何):选择分形公式、变体、调整公式参数、视图控制和渲染设置
  2. Camera(相机):控制观察视角
  3. Formulas(公式):显示数学公式和标注
  4. Appearance(外观):调整背景颜色、渐变调色板、着色算法和着色参数
  5. Parameters(参数):定义方程中使用的自定义常量(高级用法)
  6. 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_seedJulia 种子复数因公式而异定义 Julia 集的形态
relaxation松弛系数浮点1.0Newton/Nova 的收敛速度控制
exponent指数复数因公式而异Newton/Nova 的方程幂次
convergent_bailout收敛阈值浮点1e-6Magnet 的收敛判断阈值

技巧:在 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)

扰动算法是一种高级渲染技术,允许超高精度的分形渲染。当缩放级别超过阈值时,系统会自动启用扰动算法:

精度级别阈值说明
Low1.0e-2快速渲染,精度较低,适合快速预览
Medium1.0e-4平衡精度和速度,适合大多数情况
High1.0e-6高精度渲染,适合中等深度缩放
Ultra1.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)

内部着色应用于分形集合内部的点(未逃逸/收敛的点):

算法英文名输出类型说明
NoneINDEX使用固定颜色填充内部
基础BasicINDEX基于迭代次数的简单着色,支持多种度量方式
平滑 MandelbrotSmooth MandelbrotINDEX产生平滑的颜色过渡,消除色带
分解DecompositionINDEX基于角度的着色,展现复数的相位信息
二进制分解Binary DecompositionINDEX基于符号的二值化着色
距离估算Distance EstimatorINDEX基于到集合边界的距离着色
直接域Direct DomainDIRECT直接使用复数值作为颜色
直接轨道陷阱Direct Orbit TrapDIRECT基于轨道陷阱的着色
直接归一化 ZDirect Normalized ZDIRECT归一化后的复数值着色
轨道陷阱索引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 实现,可以让参数在指定范围内做周期性正弦振荡。

工作原理

  1. 为每个参数指定振荡的步长(step)、范围(min, max)和边沿缓动(edge easing)
  2. 参数值在 [min, max] 范围内做正弦振荡:value = mid + amp * sin(phase)
  3. 振荡速度由步长和步长缩放因子(step scale)共同控制
  4. 边沿缓动确保参数接近范围边界时减速,避免突变

可动画化的参数

所有公式参数均支持动画化,包括:

  • 视图参数:Center X/Y、Zoom、Rotation
  • 迭代参数:Iterations、Bailout
  • Julia 参数:Julia Cx/Cy
  • 公式特定参数:根据公式类型动态决定

参数模式

动画器支持四种参数模式:

  • SCALAR:标量参数,如迭代次数、逃逸半径
  • COMPLEX_FULL:复数参数,实部和虚部同时振荡
  • COMPLEX_REAL:复数参数,仅实部振荡
  • COMPLEX_IMAG:复数参数,仅虚部振荡

缩放动画

创建令人惊叹的缩放动画,这是分形场景最具特色的动画类型:

特点

  • 支持高精度坐标,可以创建深度缩放动画
  • 使用对数插值,缩放变化更自然
  • 支持缩放感知的中心点移动

创建缩放动画

  1. 添加缩放动画片段
  2. 设置起始和结束的缩放级别
  3. 设置目标中心位置
  4. 调整动画曲线控制缩放速度

技巧:使用指数缩放曲线可以创造更自然的缩放效果;深度缩放时建议启用高精度扰动算法。

渐变动画

渐变动画让颜色随时间变化:

  • 调色板偏移(Palette Offset):整体偏移调色板位置
  • 内部渐变偏移(Inside Gradient Offset):偏移内部着色的渐变
  • 外部渐变偏移(Outside Gradient Offset):偏移外部着色的渐变

配置方法

通过 JSON 配置文件中的 timeline 数组定义动画序列:

json
{
  "timeline": [
    {
      "type": "wait",
      "duration": 5,
      "label": "Wait",
      "easing": "SINE_IN_OUT"
    }
  ]
}

[截图占位: 展示时间线面板和动画设置]


性能与最佳实践

推荐配置

目标迭代次数渲染方法扰动精度着色算法
快速探索100-300GuessingLow/MediumBasic
交互式调整300-500Multi PassMedium/HighSmooth Mandelbrot
高质量输出500-2000One PassHigh/UltraSmooth Mandelbrot / DE
深度缩放1000+One PassUltraSmooth Mandelbrot

性能优化技巧

  1. 迭代次数
    • 探索时使用较低值(100-300),找到满意构图后再提高
    • 迭代次数与渲染时间近似线性关系
  2. 渲染方法
    • 交互时使用 Multi Pass,输出时使用 One Pass
    • Guessing 最快但可能丢失细节
  3. 着色算法
    • Basic 着色渲染最快
    • Direct 系列算法需要额外计算,渲染稍慢
    • Distance Estimator 需要导数计算,渲染最慢
  4. 扰动算法
    • 仅在深度缩放时自动启用
    • 更高的精度级别需要更多计算资源和内存
    • 不支持扰动的公式在深度缩放时会出现精度损失
  5. 调色板
    • 手动调色板和余弦调色板渲染效率相同
    • Gradient LUT 在 CPU 端预计算,对渲染性能影响极小

常见问题

分形看起来很模糊

问题:渲染结果模糊,细节不清晰

原因:迭代次数不足或缩放级别过高导致精度损失

解决方案

  • 增加迭代次数(建议 300 以上)
  • 使用扰动算法提高精度(High 或 Ultra)
  • 检查渲染方法设置,One Pass 质量最高
  • 确认逃逸半径设置合理(通常为 4.0)

颜色出现明显色带

问题:分形颜色出现条纹状色带,不够平滑

原因:着色算法或传递函数选择不当

解决方案

  • 使用 Smooth Mandelbrot 着色算法替代 Basic
  • 选择 LOG 或 SQRT 传递函数
  • 使用 HSV 调色板空间
  • 尝试余弦或曲线调色板模式

渲染速度太慢

问题:分形渲染耗时过长

原因:参数设置过高或渲染方法不当

解决方案

  1. 降低迭代次数
  2. 使用 Guessing 或 Multi Pass 渲染方法
  3. 简化着色算法(Basic 最快)
  4. 降低扰动精度(如果不需要深度缩放)
  5. 关闭扰动算法(浅层缩放时不需要)

深度缩放出现像素化

问题:深度缩放后画面出现方块状像素

原因:浮点精度不足,标准双精度浮点在缩放超过 10¹³ 倍后精度耗尽

解决方案

  • 确保使用支持扰动的公式(Mandelbrot、Julia、Newton、Nova)
  • 设置扰动精度为 High 或 Ultra
  • 对于不支持扰动的公式,深度缩放精度受限是数学上的固有限制

如何找到有趣的分形细节

建议

  1. 从 Mandelbrot 集开始探索
  2. 缩放到边界区域——最丰富的细节总在边界上
  3. 寻找螺旋、海马、象鼻等经典结构
  4. 使用不同的着色算法突出细节
  5. 尝试不同的公式和参数组合
  6. 调整颜色密度和传递函数改变视觉表现

如何创建 Julia 集

步骤

  1. 选择支持 Julia 变体的公式(如 Mandelbrot、Nova)
  2. 在变体下拉菜单中选择 "Julia"
  3. 调整 Julia 种子参数
  4. 技巧:在 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
迭代次数:500

Newton 分形(三根)

公式:Newton
指数:3(实数)
松弛系数:1.0
迭代次数:200

Nova 分形(五根)

公式:Nova
变体:MANDELBROT
指数:5(实数)
松弛系数:1.0
起始值:(1, 0)
迭代次数:300

技术细节

GPU 渲染管线

分形场景使用 GPU Fragment Shader 渲染管线,核心流程如下:

  1. Shader 编译
    • ShaderCompilationManager 根据公式注册信息动态编译 Fragment Shader
    • 采用部件拼接架构:22 个 GLSL 部件按需拼接,注入 #define
    • 编译结果缓存,避免重复编译
  2. 渲染执行
    • 设置所有 uniform(中心、缩放、旋转、迭代、公式参数、着色参数)
    • 判定是否启用扰动算法
    • 如需扰动:计算参考轨道 → 打包 RGBA32F 纹理 → 上传 GPU
    • 生成 Gradient LUT 纹理(1024 采样点)
    • 绘制全屏 QUAD,Fragment Shader 逐像素计算
  3. 着色流程
    • Fragment Shader 执行公式迭代
    • 根据着色算法计算颜色索引或直接颜色
    • 通过 Gradient LUT 或 Cosine Palette 采样获得最终颜色

扰动算法

扰动算法(Perturbation Theory)是深度缩放的核心技术,由 Pauldelbrot 等人于 2013-2014 年在 fractalforums.com 社区提出:

工作原理

  1. 在 CPU 端使用 DoubleDouble 双精度计算参考点的完整轨道
  2. 将参考轨道以 RGBA32F 纹理上传 GPU
  3. GPU 端对每个像素,基于参考轨道进行扰动迭代
  4. 避免了深度缩放时标准双精度浮点的精度损失

精度判定

  • 公式必须支持扰动(满足特定数学条件)
  • 幂次必须为整数
  • 缩放级别超过阈值(zoom > 100)
  • 迭代次数 > 0

公式注册系统

公式系统采用注册表驱动的插件式架构:

  • FormulaRegistry:全局公式注册表(ConcurrentHashMap),单例模式
  • FormulaMetadata:描述公式的完整能力与参数,UI 层据此自动生成编辑器
  • StandardFormulaCatalog:注册 10 种内置公式
  • FormulaDomainService:构建运行时状态、判定扰动可用性、参数打包

着色算法注册系统

着色算法同样采用注册表模式:

  • ColoringRegistry:全局着色算法注册表
  • ColoringMetadata:描述着色算法的输出类型、适用域、参数定义
  • StandardColoringCatalog:注册 10 种内置着色算法
  • ColoringRuntimeMapper:解析请求 ID、校验参数、返回映射结果

颜色系统三重体系

  1. 调色板直传:最多 16 色调色板以 u_palette uniform 传入 shader
  2. Cosine Palette:IQ 风格余弦调色板,参数 a/b/c/d 通过 uniform 传入
  3. Gradient LUT:CPU 端预计算 1024 点查找表,以 RGB32F 纹理上传 GPU,支持 RGB/HSV 插值

创作技巧

参数探索

  1. 从经典公式开始:Mandelbrot 是最好的起点,边界区域蕴含无限细节
  2. 缩放到边界:分形最丰富的细节总在逃逸集与收敛集的边界上
  3. 调整幂次:改变幂次可以创造不同形态的变体,p=3 产生三重对称
  4. 探索 Julia 集:在 Mandelbrot 集边界附近选择 Julia 种子,往往能发现精美的图案

视觉调优

  1. 着色方案
    • 先选择合适的着色算法(Smooth Mandelbrot 是最通用的选择)
    • 再调整传递函数(LOG 适合展现细节,SQR 适合突出结构)
    • 最后微调颜色密度和渐变偏移
  2. 色彩搭配
    • 使用余弦调色板快速生成和谐的色彩方案
    • 深色背景配合高饱和度色彩通常效果最佳
    • HSV 色彩空间插值通常比 RGB 更和谐
  3. 细节突出
    • Distance Estimator 着色可以清晰展现分形边界
    • 增大颜色密度可以展现更多层次
    • Orbit Trap 着色可以创造独特的艺术效果

动画设计

  1. 缩放动画
    • 这是最具分形特色的动画类型
    • 选择一个有趣的目标点,设置起始和结束缩放级别
    • 使用指数缩放曲线使缩放速度更自然
    • 深度缩放时务必启用高精度扰动
  2. 参数振荡
    • 为 Julia 种子设置振荡动画,观察图案的形态演变
    • 为幂次设置振荡,创造形态渐变效果
    • 边沿缓动确保参数在范围边界处平滑过渡
  3. 渐变动画
    • 渐变偏移动画可以让颜色"流动"起来
    • 配合缩放动画使用,效果更加震撼

注意事项

  1. 扰动算法限制
    • 并非所有公式都支持扰动算法
    • Phoenix、Magnet、Lambda、Complex Sin、Spiral Septagon 不支持扰动
    • 不支持扰动的公式在深度缩放时精度受限,这是数学上的固有限制
  2. 迭代次数与质量
    • 迭代次数过低会导致细节丢失,表现为大面积的纯色区域
    • 迭代次数过高会显著增加渲染时间,但未必带来可见的改善
    • 建议从较低值开始,逐步提高直到细节不再增加
  3. 逃逸半径设置
    • 逃逸半径影响逃逸判断的灵敏度
    • 过小的逃逸半径可能导致本应逃逸的点被误判为集合内部
    • 过大的逃逸半径会浪费迭代次数
    • 经典 Mandelbrot 集的逃逸半径通常设为 4.0(即 |z|² > 4)
  4. Newton/Nova 的收敛判断
    • 这两个公式使用收敛判断而非逃逸判断
    • 内部着色对 Newton/Nova 更重要
    • 收敛速度的差异可以产生丰富的色彩层次
  5. Magnet 分形的混合终止策略
    • Magnet 公式同时具有逃逸和收敛特性
    • 需要同时设置逃逸半径和收敛阈值
    • 两个阈值的平衡对渲染结果影响显著

进阶主题

理解扰动算法的数学原理

标准双精度浮点数约有 15-16 位有效数字。当缩放级别超过 10¹³ 倍时,相邻像素之间的距离小于浮点精度,导致所有像素计算出相同的迭代值——这就是"像素化"的原因。

扰动算法的核心思想是:选择一个参考点 ,用高精度计算其完整轨道 ,然后对附近的点 ,用标准精度计算扰动

由于 通常远小于 ,标准精度足以表示 的有效数字,从而避免了精度损失。

Mandelbrot 集与 Julia 集的对偶关系

Mandelbrot 集可以看作是 Julia 集的"目录":对于 Mandelbrot 集中的每个点 ,都存在一个对应的 Julia 集 。当 位于 Mandelbrot 集内部时, 是连通的;当 位于 Mandelbrot 集外部时, 是完全不连通的(Cantor 尘)。

Mandelbrot 集边界附近的点对应的 Julia 集最为复杂和美丽。这就是为什么在 Mandelbrot 集边界附近选择 Julia 种子往往能产生最精美的图案。

着色算法的数学原理

Smooth Mandelbrot 着色使用归一化迭代计数来消除色带:

其中 是逃逸时的迭代次数, 是幂次。这个公式将离散的迭代次数映射为连续值,从而实现平滑的颜色过渡。

Distance Estimator 着色基于到分形集合边界的距离估算:

其中 的导数。距离越小的点越接近集合边界,渲染为不同的亮度可以突出边界的精细结构。

创造自定义分形图案

虽然 MathArt 使用预设公式,但通过巧妙调整参数,您可以创造出丰富多变的分形图案:

  1. 从经典 Mandelbrot 集开始,缩放到感兴趣的边界区域
  2. 切换到 Julia 变体,将当前视图中心设为 Julia 种子
  3. 微调 Julia 种子的实部和虚部,观察图案的细微变化
  4. 尝试不同的幂次值,探索非经典形态
  5. 使用 Newton/Nova 公式,调整指数和松弛系数创造全新的图案
  6. 利用参数振荡动画探索参数空间中的连续变化

参考资源

数学理论

  • 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)

在线资源

扰动算法

  • Pauldelbrot - Perturbation Theory for the Mandelbrot Set (2013-2014, fractalforums.com)
  • Karl Runmo - Deep Zoom Technology — 实现了 10⁻¹⁰⁰⁰ 量级的缩放

All rights reserved.