康托尔集合是分形理论发展的早起萌芽,对后来分形理论的发展起到了直观性的作用。怎样直观地理解这个集合,对后续理解分形理论非常有帮助。
康托尔集合的绘制方法多种多样,主要基于其构造原理(不断删除线段中间三分之一)和数学特性(三进制表示无1)。以下是不同算法的基本思路和步骤,涵盖递归、迭代等多种方法:
1. 递归分割法
算法步骤:
- 输入:当前线段端点 [start, end],当前深度 depth,最大深度 max_depth。
- 绘制当前线段。
- 若 depth < max_depth:
- 计算分段点:left_end = start + (end - start)/3right_start = start + 2*(end - start)/3
- 递归处理左段:递归([start, left_end], depth+1, max_depth)
- 递归处理右段:递归([right_start, end], depth+1, max_depth)


2. 迭代队列法
算法步骤:
- 初始化队列,存入初始线段 [0, 1]。
- 设定最大迭代次数 max_iter。
- 对于每轮迭代 i 从 0 到 max_iter-1:
- 遍历当前队列所有线段:
- 对每个线段 [a, b],计算 left_end = a + (b - a)/3 和 right_start = a + 2*(b - a)/3。
- 将左段 [a, left_end] 和右段 [right_start, b] 加入新队列。
- 更新队列为新队列,绘制当前所有线段。


3. 三进制点集排除法
算法步骤:
- 输入:图像宽度 width,最大精度 n(三进制小数位数)。
- 对每个像素 x 从 0 到 width-1:
- 计算归一化坐标 x_norm = x / width。
- 检查 x_norm 的三进制展开是否不含 1(例如通过逐位检查)。
- 若属于康托尔集,则在 (x, y) 处绘制点(可固定 y 或垂直堆叠)。


4. 位图/像素填充法
算法步骤:
- 创建宽度为 3^max_depth 的位图,初始全黑(非康托尔集)。
- 对每层迭代 i 从 0 到 max_depth:
- 将当前位图分割为 3^i 个区间。
- 删除每个区间中间的三分之一部分(设为白色)。
- 最终剩余黑色像素即康托尔集,渲染为图像。


5. 迭代函数系统(IFS)
算法步骤:
- 定义变换:
- T1(x) = x/3(左缩放到1/3)
- T2(x) = x/3 + 2/3(右缩放到1/3并平移)
- 初始化点:x = 0.5(任意初始值)。
- 迭代:随机选择 T1 或 T2 应用多次,记录所有生成的点。
- 绘制:在水平线上绘制所有点(可能需要垂直抖动以可视化密度)。

注意:这个算法并没有指定深度,但是从绘制的图形上看,只有很小的深度。但是如果精度足够高,我们依然是可以观察到更小的gap的,也就是说有足够大的深度。
6. 垂直堆叠历史法 (算法1和2已经输出这样图形,但当时目的是为了展示迭代)
算法步骤:
- 输入:最大迭代次数 max_iter。
- 对每层 i 从 0 到 max_iter:
- 计算当前层剩余的线段集合。
- 在垂直位置 y = i 处绘制这些线段,形成层次结构图。

7. 区间排除记录法
算法步骤:
- 初始化剩余区间列表为 [0, 1]。
- 对每层迭代 i:
- 遍历所有当前区间,将每个区间三等分。
- 删除中间段,保留左右两段加入新列表。
- 绘制所有未被删除的区间。

8. 概率随机移除法
算法步骤:
- 输入:初始线段 [0,1],迭代次数 max_iter。
- 对每次迭代:
- 随机选择当前线段中的一个区间,删除中间三分之一。
- 重复直到达到迭代次数。
- 绘制剩余线段(非标准康托尔集,但展示类似分形特性)。


注意:这里的线段长度(也代表着相应的深度)是不相同的,是因为在相应线段是,要判定是不是要进一步绘制。
9. 数学公式直接生成
算法步骤:
- 康托尔集可表示为:$C = \bigcap_{n=1}^\infty C_n $,其中 $ C_n $ 是第 n 次迭代后的剩余区间。
- 通过数学公式计算每个 C_n 的区间端点,逐层绘制。


总结
以上方法覆盖了递归、迭代、数学特性(三进制)、像素操作、IFS等多种思路。实际实现时,可根据需求选择算法:递归适合小深度快速实现,迭代法避免栈溢出,三进制法适合高精度点检查,IFS适合概率逼近。