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

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

← Все примеры

Снежинка Коха

Классический фрактал, построенный из кривых Коха. Три кривые соединяются в форме треугольника и образуют снежинку.

Разбор

Перемещаем черепаху в начальную позицию и запускаем построение снежинки с глубиной 4 и стороной 180:

использовать Черепаха
алг
нач
    поднять хвост
    влево(90)
    назад(150)
    вправо(90)
    опустить хвост
    снежинка(4, 180.0)
кон

Алгоритм снежинка рисует три кривые Коха, поворачивая после каждой на $120°$. Вместе они образуют замкнутый треугольник:

алг снежинка(цел order, вещ side)
нач
    цел i
    нц для i от 0 до 2
        кох(order, side)
        влево(120)
    кц
кон

Алгоритм кох строит одну кривую Коха рекурсивно. Базовый случай ($n = 0$) --- просто прямая линия. На каждом уровне рекурсии отрезок делится на три части, а средняя заменяется «треугольным выступом»:

  1. Рисуем первую треть.
  2. Поворачиваем на $60°$ вправо и рисуем вторую треть (подъём).
  3. Поворачиваем на $120°$ влево и рисуем третью треть (спуск).
  4. Поворачиваем на $60°$ вправо и рисуем последнюю треть.
алг кох(цел n, вещ len)
нач
    если n = 0 то
        опустить хвост
        вперед(len)
    иначе
        кох(n - 1, len / 3.0)
        вправо(60)
        кох(n - 1, len / 3.0)
        влево(120)
        кох(n - 1, len / 3.0)
        вправо(60)
        кох(n - 1, len / 3.0)
    все
кон

На каждом уровне длина отрезка делится на 3, а количество отрезков умножается на 4. Поэтому периметр на каждом шаге увеличивается в $4/3$ раза и при бесконечной глубине стремится к бесконечности, тогда как площадь остаётся конечной.

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

использовать Черепаха
алг
нач
    поднять хвост
    влево(90)
    назад(150)
    вправо(90)
    опустить хвост
    снежинка(4, 180.0)
кон

алг снежинка(цел order, вещ side)
нач
    цел i
    нц для i от 0 до 2
        кох(order, side)
        влево(120)
    кц
кон

алг кох(цел n, вещ len)
нач
    если n = 0 то
        опустить хвост
        вперед(len)
    иначе
        кох(n - 1, len / 3.0)
        вправо(60)
        кох(n - 1, len / 3.0)
        влево(120)
        кох(n - 1, len / 3.0)
        вправо(60)
        кох(n - 1, len / 3.0)
    все
кон

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