Engee 文档
Notebook

Cantorial集

我们正在考虑实现一种生成康托尔集的算法,这种分形结构是通过递归地去除线段的中心部分来构建的。

导言

康托尔集是通过无限地去除每个剩余段的中间三分之一从单个段获得的分形。 在实践中,算法可以被限制为一定水平的递归深度。

为什么要用它?

该算法具有教育价值,用于计算机图形学来演示递归和分形结构。 它也被用来作为一个简单的例子分形和一个不寻常的集合在数学。

主要部分

In [ ]:
# Определение размеров поля: ширина 81 и высота 5
const width = 81;
const height = 5;

在这里,常量被设置-将在其上构建Cantor集的图像的字段的宽度和高度。 宽度选择为三的幂(),使得除法过程是基于整数的。

In [ ]:
# Рекурсивная функция построения множества Кантора
# Принимает:
# - lines — массив символов (поле для рисования)
# - start — начальная позиция (индекс) в строке
# - len — длина текущего сегмента
# - idx — номер строки (уровень рекурсии)
function cantor!(lines, start, len, idx)
    # Делим отрезок на три части
    seg = div(len, 3)

    # Если длина сегмента больше нуля, продолжаем рекурсию
    if seg > 0
        # Очищаем среднюю треть отрезка во всех строках ниже текущей
        for i in idx+1:height, j in start + seg + 1 : start + seg * 2
            lines[i, j] = ' '  # заменяем символ решётки на пробел
        end

        # Рекурсивный вызов для левой и правой трети
        cantor!(lines, start, seg, idx + 1)
        cantor!(lines, start + 2 * seg, seg, idx + 1)
    end
end
Out[0]:
cantor! (generic function with 1 method)

这是一个关键的递归函数。 cantor!,其构建康托尔集。 在每个步骤中,它将当前段分为三个部分,并清除(用空格替换)当前递归级别以下行中的中间三分之一。 该过程对左三分子和右三分子重复,直到该段小于3个像素。

In [ ]:
# Инициализируем весь массив символом '#'
lines = fill(UInt8('#'), height, width)

# Вызываем рекурсивную функцию, начинаем с самого верхнего уровня
cantor!(lines, 0, width, 1)

创建二维数组 lines,充满了符号 # —这是表示集合剩余部分的符号。 挑战 cantor!(lines, 0, width, 1) 从行的开头开始构造康托尔集的过程(start=0),全宽(len=width)和第一行(idx=1).

In [ ]:
# Печать результата построчно
for i in 1:height, j in 1:width
    print(Char(lines[i, j]), j == width ? "\n" : "")
end
#################################################################################
###########################                           ###########################
#########         #########                           #########         #########
###   ###         ###   ###                           ###   ###         ###   ###
# #   # #         # #   # #                           # #   # #         # #   # #

这是结果显示的地方。 我们遍历数组的每个元素。 lines,将数字值转换回字符并打印它们。 当到达行尾时(j == width)添加到新行的过渡。

结论

我们已经回顾了一个经典的分形,康托尔集,使用朱莉娅编程语言的实现。 我们成功了:

-递归地构建分形结构。
-以文本图形的形式可视化结果。
-熟悉使用递归和在Julia中使用二维数组的简单示例。

这是理解递归,分形和基本计算机图形学的有用示例。 它还可以扩展到更复杂的可视化或交互式应用程序。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Cantor_set