康托尔集合基本绘制方法汇总(Python)

康托尔集合是分形理论发展的早起萌芽,对后来分形理论的发展起到了直观性的作用。怎样直观地理解这个集合,对后续理解分形理论非常有帮助。
康托尔集合的绘制方法多种多样,主要基于其构造原理(不断删除线段中间三分之一)和数学特性(三进制表示无1)。以下是不同算法的基本思路和步骤,涵盖递归、迭代等多种方法:

1. 递归分割法

算法步骤
  1. 输入:当前线段端点 [start, end],当前深度 depth,最大深度 max_depth
  2. 绘制当前线段。
  3. 若 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. 迭代队列法

算法步骤
  1. 初始化队列,存入初始线段 [0, 1]
  2. 设定最大迭代次数 max_iter
  3. 对于每轮迭代 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. 三进制点集排除法

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

4. 位图/像素填充法

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

5. 迭代函数系统(IFS)

算法步骤
  1. 定义变换
  • T1(x) = x/3(左缩放到1/3)
  • T2(x) = x/3 + 2/3(右缩放到1/3并平移)
  1. 初始化点x = 0.5(任意初始值)。
  2. 迭代:随机选择 T1 或 T2 应用多次,记录所有生成的点。
  3. 绘制:在水平线上绘制所有点(可能需要垂直抖动以可视化密度)。
注意:这个算法并没有指定深度,但是从绘制的图形上看,只有很小的深度。但是如果精度足够高,我们依然是可以观察到更小的gap的,也就是说有足够大的深度。

6. 垂直堆叠历史法 (算法1和2已经输出这样图形,但当时目的是为了展示迭代)

算法步骤
  1. 输入:最大迭代次数 max_iter
  2. 对每层 i 从 0 到 max_iter
  • 计算当前层剩余的线段集合。
  • 在垂直位置 y = i 处绘制这些线段,形成层次结构图。

7. 区间排除记录法

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

8. 概率随机移除法

算法步骤
  1. 输入:初始线段 [0,1],迭代次数 max_iter
  2. 对每次迭代:
  • 随机选择当前线段中的一个区间,删除中间三分之一。
  • 重复直到达到迭代次数。
  1. 绘制剩余线段(非标准康托尔集,但展示类似分形特性)。
注意:这里的线段长度(也代表着相应的深度)是不相同的,是因为在相应线段是,要判定是不是要进一步绘制。

9. 数学公式直接生成

算法步骤
  1. 康托尔集可表示为:$C = \bigcap_{n=1}^\infty C_n $,其中 $ C_n $ 是第 n 次迭代后的剩余区间。
  2. 通过数学公式计算每个 C_n 的区间端点,逐层绘制。

总结

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

代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值