Блог учителя Информатики

Рисуем снежинку Коха помощью Черепашки в Python

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

Кривая Коха представляет из себя отрезок, разделенный на три равных участка, где средняя часть заменяется на равносторонний треугольник с длиной, равной 1/3 прямой. В результате получается ломаная из четырех сегментов одинаковой длины.
В нулевой итерации кривая Коха — это прямая линия.
Кривая Коха
Теперь нарисуем кривую Коха в первой итерации.
Для этого пройдем вперед на 1/3 длины нашей линии, затем повернем налево на 60° чтобы нарисовать выступ из равностороннего треугольника. Двигаемся вперед на 1/3 длины, поворачиваем направо на 120°, опять двигаемся вперед на 1/3 длины и поворачиваемся налево на 60°. Проходим еще вперед остаток 1/3 длины чтобы закончить рисовать кривую.
Кривая Коха

import turtle

size = 300

turtle.forward(size / 3)
turtle.left(60)
turtle.forward(size / 3)
turtle.right(120)
turtle.forward(size / 3)
turtle.left(60)
turtle.forward(size / 3)

Для рисования следующих итераций напишем уже функцию, которой будем передавать два параметра — длина нашей линии и количество итераций.
Кривая Коха
Зададим условие: если n = 0, то укажем двигаться нашей Черепашке вперед на длину переданной в параметре, в противном случае будем рисовать кривую Коха по разобранному алгоритму. Но теперь заменим команды движения на рекурсивный вызов нашей функции с параметрами size / 3 и n — 1. Тем самым, параметром n мы задаем глубину рекурсии, заставляя делить каждую грань на новую кривую Коха.

import turtle

size = 300
n = 2


def koch_curve(size, n):
    if n == 0:
        turtle.forward(size)
    else:
        koch_curve(size / 3, n - 1)
        turtle.left(60)
        koch_curve(size / 3, n - 1)
        turtle.right(120)
        koch_curve(size / 3, n - 1)
        turtle.left(60)
        koch_curve(size / 3, n - 1)


koch_curve(size, n)

Для рисования снежинки Коха напишем отдельную функцию, которая будет рисовать равносторонний треугольник, где вместо катетов будут нарисованы кривые Коха.
Снежинка Коха
Определим функцию draw_koch_snowflake в которой с помощью цикла будем рисовать равносторонний треугольник. За три итерации будем двигать черепашку вперед на длину, переданную в первом параметре и поворачивать на 60 градусов. Таким образом, Черепашка нарисует снежинку и окажется в том же месте, с которого и начинала рисовать.

import turtle

size = 300
n = 2


def koch_curve(size, n):
    if n == 0:
        turtle.forward(size)
    else:
        koch_curve(size / 3, n - 1)
        turtle.left(60)
        koch_curve(size / 3, n - 1)
        turtle.right(120)
        koch_curve(size / 3, n - 1)
        turtle.left(60)
        koch_curve(size / 3, n - 1)


def draw_koch_snowflake(size, n):
    for i in range(3):
        koch_curve(size, n)
        turtle.right(120)


draw_koch_snowflake(size, n)
Посмотреть Live Demo
Поделиться:
Вам также может понравится
Решение олимпиадных задач по информатике: Наименьший остаток
Решение олимпиадных задач по информатике: Последовательность
Решение олимпиадных задач по информатике: От перестановки чисел что-то меняется
Делаем Черепашку в виде снежинки