Перейти к содержимому

Как нарисовать снежинку в питоне

  • автор:

Рисуем новогодние снежинки Черепашкой

Сегодня мы нарисуем с использованием Черепашки новогодние снежинки.

Для начала попробуем нарисовать один из лучей нашей будущей снежинки. Зададим с помощью переменной line длину луча. Изменим также командой pensize() толщину и color() цвет линии на синий крайола (#1F75FE).

Продвинем Черепашку на длину нашей линии, затем вернем ее назад на треть этой длины. Повернем налево на 45 градусов, чтобы нарисовать узор на конце нашего луча. И продвинемся вперед на треть длины луча. Вернемся назад и повернем теперь направо уже на 90 градусов, чтобы нарисовать вторую часть нашего узора. Повторим команды которые мы делали для рисования левой части. После этого повернем налево на 45 градусов, чтобы Черепашка смотрела в ту же сторону, в какую мы рисовали наш луч. Вернемся в самое начало, откуда мы начали движение, проделав оставшиеся 2/3 пути.

line = 120 turtle.pensize(7) turtle.color('#1F75FE') turtle.forward(line) turtle.backward(line / 3) turtle.left(45) turtle.forward(line / 3) turtle.backward(line / 3) turtle.right(90) turtle.forward(line / 3) turtle.backward(line / 3) turtle.left(45) turtle.backward(2 * line / 3)

Но у снежинке таких лучиков может быть пять, шесть или больше. Чтобы не повторять эти команды много раз, мы вложим их в цикл со счетчиком for. Количество итераций цикла будет совпадать с количеством лучей у нашей снежинки.

Добавим переменную n отвечающую за количество лучей. Так же в конце цикла добавим поворот Черепашки налево на 360/n, чтобы развернуть Черепашку и нарисовать другие лучи снежинки.
Так как нам не нужна сама переменная со счетчиком, то мы ее можем заменить на _ в заголовке цикла.

line = 120 n = 6 turtle.pensize(7) turtle.color('#1F75FE') for _ in range(n): turtle.forward(line) turtle.backward(line / 3) turtle.left(45) turtle.forward(line / 3) turtle.backward(line / 3) turtle.right(90) turtle.forward(line / 3) turtle.backward(line / 3) turtle.left(45) turtle.backward(2 * line / 3) turtle.left(360 / n)

Теперь, когда мы умеем рисовать снежинку, напишем функцию, которая будет это делать. В качестве обязательных параметров она будет принимать координаты точки x и y центра снежинки. Из необязательных: длину луча снежинки line, толщину линии size и цвет color.

import turtle def draw_snowflake(x, y, line=120, n=6, size=5, color='#1F75FE'): """ This function draws an snowflake. """ turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(color) turtle.pensize(size) for _ in range(n): turtle.forward(line) turtle.backward(line / 3) turtle.left(45) turtle.forward(line / 3) turtle.backward(line / 3) turtle.right(90) turtle.forward(line / 3) turtle.backward(line / 3) turtle.left(45) turtle.backward(2 * line / 3) turtle.left(360 / n) draw_snowflake(120, 100) draw_snowflake(-120, 100, 110, size=15) draw_snowflake(-100, -100, 90, 8)

Рисуем снежинку Коха помощью Черепашки в 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)

Помогите решить задачу на python с помощью черепашки и цикла for

t = turtle.Turtle()
t.shape(‘turtle’)
t.speed(10)
for looper in range(1, 7):
t.forward(150)
t.backward(75)
t.left(45)
t.forward(75)
t.backward(75)
t.right(90)
t.forward(75)
t.backward(75)
t.left(45)
t.backward(75)
t.right(60)
print(looper)

t = turtle.Turtle()
t.shape(«turtle»)
t.stamp()
for i in range(6):
t.forward(100)
t.backward(50)
t.left(45)
t.forward(60)
t.backward(60)
t.left(270)
t.forward(60)
t.backward(60)
t.left(45)
t.backward(50)
t.left(60)

Рисуем кривую Коха и снежинку Коха

Прежде чем идти дальше, давайте познакомимся с turtle-графикой (то есть, черепашьей графикой) в Python. С ее помощью часто выполняется рисование фракталов с помощью, так называемых, L-систем, о которых мы еще будем говорить. А пока посмотрим, как эта «черепашка» сможет нарисовать нам первые фракталы – кривую и снежинку Коха.

Принцип здесь очень простой. Черепашка может ползти вперед (то есть, куда глаза глядят) с помощью команды forward(), поворачиваться влево, вправо с помощью команд left() и right(). И делать некоторые другие элементы «высшего пилотажа», с которыми мы постепенно познакомимся. Если вы хотите сразу поближе познакомиться с черепашкой, то это можно сделать по ссылке:

Итак, чтобы запустить черепашку в нашу программу, достаточно сделать импорт:

import turtle

а, затем, создать ее экземпляр:

t = turtle.Turtle()

Если сейчас запустить программу, то появится графическое окно и тут же пропадет. Чтобы этого не происходило, в конце добавим команду:

turtle.done()

Отлично, наша черепашка готова беспрекословно выполнять любые команды. Скажем ей пройти вперед на 20 пикселей:

t.forward(20)

или в сокращенном варианте:

t.fd(20)

Далее, повелим ей повернуться налево на 90 градусов, пройти еще 20 писелей, повернуться направо на 120 градусов и пройти еще 40 пикселей:

t.left(90) t.fd(20) t.right(120) t.fd(40)

Как видите, она послушно выполнила все наши команды. Пришло время дать нашей черепашке настоящее задание. Объявим функцию, которая нарисует один сегмент кривой Коха:

def draw_koch_segment(t, ln): t.fd(ln) t.left(60) t.fd(ln) t.right(120) t.fd(ln) t.left(60) t.fd(ln)

Чтобы рисование происходило быстрее, мы ускорим черепашку командой:

t.speed(100)

Итак, одна итерация у нас есть. Теперь, каждый линейный фрагмент также нужно прорисовать такой же ломаной, но уменьшенной в 3 раза. Проще всего это сделать через рекурсию, следующим образом:

def draw_koch_segment(t, ln): if ln > 6: ln3 = ln // 3 draw_koch_segment(t, ln3) t.left(60) draw_koch_segment(t, ln3) t.right(120) draw_koch_segment(t, ln3) t.left(60) draw_koch_segment(t, ln3) else: t.fd(ln) t.left(60) t.fd(ln) t.right(120) t.fd(ln) t.left(60) t.fd(ln)

Мы заменяем линейные сегменты, пока длина сегмента ln больше 6 пикселей. Соответственно, при выполнении этого условия, уходим вглубь рекурсии и черепашка готова прорисовывать более мелкие детали. Когда условие не выполняется, то начинается рисование, причем, только самых мелких деталей. Фактически, рекурсией мы здесь сформировали множество однотипных команд для проприсовки кривой Коха.

Давайте запустим эту функцию, прописав такие строчки:

ln = 150 t.ht() draw_koch_segment(t, ln)

Здесь ln = 150 – это длина одного линейного сегмента на самом крупном масштабе; команда th() скрывает черепашку. После выполнения увидим следующее изображение:

Черепашка успешно справилась со своей миссией и нарисовала нам первый фрактал.

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

Как это сделать нам в нашей программе? Нет ничего проще. Функция draw_koch_segment() рисует один линейный сегмент начального треугольника. Значит, для прорисовки всех трех сторон, мы будем поворачивать черепашку вправо на 120 градусов и снова выполнять эту же функцию:

draw_koch_segment(t, ln) t.right(120) draw_koch_segment(t, ln) t.right(120) draw_koch_segment(t, ln)

В результате получим это:

Кстати, если вместо поворота вправо на 120 градусов сделать поворот влево, то получим уже друое изображение:

draw_koch_segment(t, ln) t.left(120) draw_koch_segment(t, ln) t.left(120) draw_koch_segment(t, ln)

Тоже весьма достойная картина. Вот на что способна наша черепашка. И это только начало. На следующем занятии мы познакомимся с универсальным способом формирования множества разных фракталов, известный как L-система.

Видео по теме

Фракталы вокруг нас. Как все начиналось

#1. Кривая Коха и снежинка Коха

#2. Рисуем кривую Коха и снежинку Коха

#3. Простая L-система на плоскости

#4. L-система для дракона Хартера-Хайтвея, ковра Серпинского и кривой Гильберта

#5. L-система с ветвлениями. Рисуем деревья и травы

#6. Добавляем параметры в L-систему

#7. Добавляем случайности в L-систему

#8. Добавляем цвет в L-систему

#9. Как вычисляется фрактальная размерность по Хаусдорфу

#10. Системы итерированных функций СИФ

#11. Рандомизированная система итерированных функций

#12. Примеры фракталов, сгенерированных СИФ

#13. Как построить множества Жюлиа

#14. Рисуем множество Мандельброта

© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *