📖 Документация Qumir

← Вернуться в Playground

← Все примеры

Треугольник Серпинского

Фрактал, состоящий из треугольников с «вырезанной» серединой. На каждом уровне рекурсии треугольник делится на четыре части, и центральная остаётся пустой.

Разбор

Сначала перемещаем черепаху в начальную позицию (без рисования) и запускаем построение с глубиной 5 и размером стороны 240:

использовать Черепаха
алг
нач
    поднять хвост
    назад(140)
    влево(90)
    вперед(90)
    вправо(90)
    опустить хвост
    серпинский(5, 240.0)
кон

Вспомогательный алгоритм маленький_треуг рисует один маленький равносторонний треугольник --- это базовый случай рекурсии. Цикл повторяется 3 раза: черепаха проходит вперёд и поворачивает на $120°$:

алг маленький_треуг(вещ side)
нач
    цел i
    нц для i от 0 до 2
        вперед(side)
        влево(120)
    кц
кон

Основной алгоритм серпинский работает рекурсивно. Если глубина равна нулю, рисуем маленький треугольник. Иначе делим сторону пополам и строим три копии фрактала меньшего размера:

  1. Нижний левый --- рисуем на текущей позиции.
  2. Нижний правый --- сдвигаемся вправо на $side / 2$ и рисуем.
  3. Верхний --- возвращаемся, поднимаемся по диагонали и рисуем.
алг серпинский(цел n, вещ side)
нач
    если n = 0 то
        маленький_треуг(side)
    иначе
        серпинский(n - 1, side / 2.0)  | нижний левый
        вперед(side / 2.0)
        серпинский(n - 1, side / 2.0)  | нижний правый
        назад(side / 2.0)
        влево(60)
        вперед(side / 2.0)
        вправо(60)
        серпинский(n - 1, side / 2.0)  | верхний
        влево(60)
        назад(side / 2.0)
        вправо(60)
    все
кон

Центральный треугольник никогда не рисуется --- именно так возникает характерный «дырчатый» узор. Площадь фрактала стремится к нулю при увеличении глубины, а его фрактальная размерность равна $\log_2 3 \approx 1{,}585$.

Полная программа

использовать Черепаха
алг
нач
    поднять хвост
    назад(140)
    влево(90)
    вперед(90)
    вправо(90)
    опустить хвост
    серпинский(5, 240.0)
кон

алг маленький_треуг(вещ side)
нач
    цел i
    нц для i от 0 до 2
        вперед(side)
        влево(120)
    кц
кон

алг серпинский(цел n, вещ side)
нач
    если n = 0 то
        маленький_треуг(side)
    иначе
        серпинский(n - 1, side / 2.0)
        вперед(side / 2.0)
        серпинский(n - 1, side / 2.0)
        назад(side / 2.0)
        влево(60)
        вперед(side / 2.0)
        вправо(60)
        серпинский(n - 1, side / 2.0)
        влево(60)
        назад(side / 2.0)
        вправо(60)
    все
кон

▶ Запустить пример