Universal card readers — turtle races

Изучая обилие каналов в любимой телеге я увидел ссылку на плейлист Модуль turtle. Создаем графику в Python.

Чего уж говорить, а рост интереса к змейке игнорировать просто нельзя! Я уже молчу о том, что он занял все топы рекомендаций к изучению, а есть еще и машинное обучение, в котором без него сейчас просто никак.

Иными словами: хочешь быть в теме — учи Python. Ну и я начал учить, не то чтобы прям нырнул, но постепенно иду ко дну погружаюсь, разбираюсь.

Рекомендую к просмотру все эти видео, очень интересно. А тут я распишу основы работы с turtle и интересные моменты.

Писать все буду в своей любимой PyCharm, а если во время выполнения возникают ошибка похожая на ImportError: DLL load failed while importing _tkinter, то видимо у вас система 64 бит, а вот Python скачан для 32. Просто удалите его и скачайте заново, уточнив предварительно, какая у вас система.

Импорт черепашки

Ладно. Перейдем к самой Черепашке (Turtle). Создали новый проект, файлик, и приступаем.

Как и с любым модулем, для работы с turtle её нужно импортировать. Делаем это вот так:

Далее создадим объект библиотеки turtle, который назван Turtle. Значение запишем в переменную turtlePen.

turtlePen = turtle.Turtle()

turtlePen = turtle.Turtle()

Попробуем запустить? Если все выполнено правильно, то вы должны увидеть белое окно, которое тут же исчезнет, так как программа завершена.

Добавим переменную window, которая будет содержать объект Screen (Не забывайте о скобках ()!). С его помощью можно изменить параметры этого самого окна, вроде цвета фона или возможность сохранить окно даже после всех операций отрисовки.

Последнее нам и нужно, для этого добавляем в самый конец такую команду:

import turtle

turtlePen = turtle.Turtle()
window = turtle.Screen()

window.mainloop() # <- не даст закрыть окно

turtlePen = turtle.Turtle()window.mainloop()   # <- не даст закрыть окно

Запускаем и видим:

Universal Card Readers - Turtle RacesЭто прекрасно!

Рисуем при помощи Turtle!

Уже можно рисовать? Да!

Для этого управляем нашим turtlePen. Допустим, мы можем указать ему идти вперед на определенное расстояние.

Universal Card Readers - Turtle RacesЯ художник!

Вперед — это в правую сторону из центра? Любая черепашка начинает с координаты (0;0), т.е. в центре экрана и смотрит в правую сторону.

Чтобы изменить направление движения используем команды left или right. Для примера нарисуем лесенку при помощи уже известных команд.

import turtle

turtlePen = turtle.Turtle()
window = turtle.Screen()

turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)

window.mainloop()

turtlePen = turtle.Turtle()

Выглядит кошмар, но на выходе получаем такую вот картинку:

Universal Card Readers - Turtle RacesКак и обещал

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

Обсудим скорость движения черепашки. При помощи команды speed мы можем изменять скорость рисования. Чем больше значение, тем быстрее рисует, но если укажем 0, то рисунок будет нарисован мгновенно.

Итак, версия ступени версия 2.0:

import turtle

turtlePen = turtle.Turtle()
window = turtle.Screen()

def draw_stairs(n, size=30): # <- создали функцию, для рисования
for i in range(0, n): # <- цикл нарисует указанное количество ступеней
turtlePen.left(90)
turtlePen.forward(size)
turtlePen.right(90)
turtlePen.forward(size)

turtlePen.speed(10)

draw_stairs(8) # <- вызов функции

window.mainloop()

turtlePen = turtle.Turtle()def draw_stairs(n, size=30):     # <- создали функцию, для рисования    for i in range(0, n):        # <- цикл нарисует указанное количество ступенейdraw_stairs(8)   # <- вызов функции

Universal Card Readers - Turtle RacesУже лучше

Что насчет других геометрических фигур? Без проблем! Вот треугольник!

turtlePen.left(120)
turtlePen.forward(80)
turtlePen.left(120)
turtlePen.forward(80)
turtlePen.left(120)
turtlePen.forward(80) Universal Card Readers - Turtle RacesПохож ведь?

А это квардат:

turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80) Universal Card Readers - Turtle RacesСтороны равны, гарантирую ????

Внимательные могли заметить, что и для правильного треугольника, и для квадрата, мы в сумме получаем поворот на 360 градусов, а значит можно создать функцию рисования правильных многоугольников!

Вот она:

def polygon(n, size=80):
if n > 2: # <- многоугольников меньше 3 углов я не знаю 🙂
angle = 360/n # <- получаем угол поворота в зависимости от количества углов

for n in range(0, n): # <- рисуем стороны
turtlePen.left(angle)
turtlePen.forward(size)

# рисуем разные фигуры
polygon(3)
polygon(4)
polygon(5)
polygon(6)

    if n > 2:                          # <- многоугольников меньше 3 углов я не знаю 🙂        angle = 360/n                  # <- получаем угол поворота в зависимости от количества углов        for n in range(0, n):         # <- рисуем стороны

Для примера я выведу фигуры с 3, 4, 5 и 6 углами.

Universal Card Readers - Turtle RacesВсе работает!

Если заметили, то я везде оставлял возможность менять длину стороны для каждой фигуры (2 параметр у каждой функции). Это вполне можно использовать для создания интересных узоров!

К примеру:

import turtle

turtlePen = turtle.Turtle()
window = turtle.Screen()

def polygon(n, size=80):
if n > 2:
angle = 360/n

for n in range(0, n):
turtlePen.left(angle)
turtlePen.forward(size)

turtlePen.speed(10)

for i in range(0, 100, 5):
polygon(3, 10 + i)
turtlePen.left(20)

window.mainloop()

turtlePen = turtle.Turtle()for i in range(0, 100, 5):

Universal Card Readers - Turtle RacesОдин из вариантов…

Изменим треугольники на пятиугольники, и получим:

Universal Card Readers - Turtle RacesВсе так же, но иначе

А этот цикл:

size = 40

for i in range(0, 80):
polygon(4, size)
turtlePen.left(5)
size = size + 3

Нарисует:

Universal Card Readers - Turtle RacesНужно будет переместить центр…

Иными словами — экспериментируйте! Так можно получить самые интересные изображения.

А пока добавим всему этому красок!

Используем цвета

Фон окна можно изменить командой bgcolor, куда передаем имя текста в виде строки:

Выбор явно не лучший, но для примера сойдет ^_^. Далее буду использовать brown

Аналогично при помощи команды color указываем цвет для рисования:

turtlePen.color(«magenta»)

turtlePen.color(«magenta»)

Думаю вполне неплохо

Цвет можно менять и во время рисования. Для этого создадим массив цветов и в зависимости от значения цикла (или иных параметров) будем менять цвет линий.

import turtle

turtlePen = turtle.Turtle()
window = turtle.Screen()

window.bgcolor(«black»)

def polygon(n, size=80):
if n > 2:
angle = 360 / n

for n in range(0, n):
turtlePen.left(angle)
turtlePen.forward(size)

turtlePen.speed(100)

colors = ['orange', 'cyan', 'blue', 'green', 'red']

size = 40

for i in range(0, 60):
turtlePen.color(colors[i % 5])
polygon(4, size)
turtlePen.left(5)
size = size + 3

window.mainloop()

turtlePen = turtle.Turtle()colors = ['orange', 'cyan', 'blue', 'green', 'red']    turtlePen.color(colors[i % 5])

Цвет фона я сделал черным, чтобы максимально рассмотреть это цветовое безумие.

Все интереснее!

Если же вы хотите разрисовать конкретные стороны своих фигур, то цвет нужно указать в цикле отрисовки сторон (и убрать из цикла отрисовки фигур).

В итоге функция polygon должна выглядеть приблизительно так:

def polygon(n, size=80):
if n > 2:
angle = 360 / n

for n in range(0, n):
turtlePen.color(colors[n % 5])
turtlePen.left(angle)
turtlePen.forward(size)

Читайте также:  Torrents.ru будет отстаивать свои права в суде, RU-CENTER готов пойти на мировую
            turtlePen.color(colors[n % 5])

А изображение получит совершенно новый вид:

Так даже круче!

Напоследок вспомним о кругах. Ведь наша программа рисует только многоугольники. И хотя можно указать какой-то 40-угольник, который в итоге даже будет похож на круг:

Ну почти. Зато красиво!

В программе есть для этого отдельная функция: circle. И заменив функцию polygon в цикле отрисовки:

for i in range(0, 70):
turtlePen.color(«white»)
turtlePen.circle(size)
turtlePen.left(5)
size = size + 3

Получаем очередной интересный узор, но только с кружками:

Лучше так, чем 40 угольник!

Спасибо за внимание! Жду отзывов и узоров ????

Черепашьи бега. by @Politick

Спасибо https://replit.com/@politick за предоставленный код.

Первым делом, при работе с черепахой, импортируем данную библиотеку в проект. Нам так же потребуется функция randint() из библиотеки random. Сразу после импорта научим нашу черепашку перемещаться. Для этого используем метод .forward() и вставим его в цикл for.

Universal Card Readers - Turtle Races

Мы научили нашу черепашку перемещаться, но обычная стрелка выглядит не очень привлекательно, давайте поменяем её на черепаху! Над циклом вставьте следующий код t.shape('turtle').

Теперь давайте нарисуем финишную черту, до которой необходимо будет добраться нашей черепашке. Используем методы .up() .goto() .down(). Данный код пишем над циклом. Должно получиться как на картинке ниже.

  • Universal Card Readers - Turtle Races
  • Universal Card Readers - Turtle Races

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

Для этого лучше переписать цикл for на цикл while. Чтобы понять где сейчас находится черепаха, воспользуемся методом .xcor(). Этот метод возвращает текущую координату черепахи по оси x. Мы будем идти вперёд до тех пор, пока координата черепахи меньше координаты финишной черты. Координату x финишной черты мы можем узнать из метода .

goto(150,-60) — это первый аргумент который мы передаём. Переписываем цикл…

Universal Card Readers - Turtle Races

Теперь наша черепашка прекратит движение ровно на линии финиша.

И, казалось бы, на этом всё, но нет! Давайте устроим настоящие черепашьи бега! Поставим несколько черепашек на линию старта и заставим их бежать наперегонки! Как? Вся сила в ООП(Объектно Ориентированном Программировании)

Для начала, объявим список colors, который будет хранить цвета всех наших будущих гонщиков. А ниже объявим, пока что пустой, список наших будущих гонщиков. Пиши этот код перед тем как рисуешь финишную черту.

Universal Card Readers - Turtle Races

Теперь тебе необходимо создать участников гонки, цветом указанным в списке colors и расположить их друг под другом (т.е. меняя координату y) на стартовой позиции. Кстати, не забудьте скрыть стрелку, которая рисует финишную черту. Она у нас в гонке не участвует ????Будте внимательны, прочитайте комментарии к коду.

Universal Card Readers - Turtle Races

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

Каждый наш участник является объектом класса Turtle и ему доступны все методы которые мы могли применять к нашей черепашке. Объявим переменную racing и присвоим ей значение True.

ГОНКА НАЧАЛАСЬ!!! Теперь, пока гонка хранит True, все участники будут постепенно перемещаться к финишной черте, но как только один из участников пересечёт финишную черту, сразу же прекращаем гонку, присвоив переменной racing значение False.

Universal Card Readers - Turtle Races Universal Card Readers - Turtle Races

Можно удалить написанный ранее цикл while и написать новый, или переписать его.

Но ещё не всё так гладко. Сейчас все наши черепашки одновременно пересекают финишную черту.

«Черепашья графика» при помощи turtle, рисование при помощи алгоритма

Черепашья графика, turtle – принцип организации библиотеки графического вывода, построенный на метафоре Черепахи, воображаемого роботоподобного устройства, которое перемещается по экрану или бумаге и поворачивается в заданных направлениях, при этом оставляя (или, по выбору, не оставляя) за собой нарисованный след заданного цвета и ширины.

Проще: черепашка ползает по экрану и рисует. Мы управляем черепашкой на плоскости при помощи программы.

Начало работы. Движения

В первой строке необходимо добавить:

import turtle

Мы командуем черепашкой простыми словами на английском языке.
left, right – поворот налево и направо, forward и backward – движение вперед и назад. В программе каждое действие – вызов функции из модуля turtle. Простая программа:

import turtle

turtle.right(90)
turtle.forward(100)
turtle.left(90)
turtle.backward(100)

Что произошло:

  • Поворот направо на 90 градусов
  • Движение вперед на 100 шагов (пикселей)
  • Поворот налево на 90 градусов
  • Движение назад на 100 шагов

Не похоже на черепашку, это ползающая стрелка! Исправим это:

import turtle
turtle.shape(«turtle»)
turtle.fd(100)
turtle.exitonclick()

Universal Card Readers - Turtle Races

Отлично! Теперь это черепашка, пусть и монохромная. Дополнительно, функция exitonclick() позволяет закрыть окно и завершить выполнение программы кликом мышкой по окну. А еще можно использовать сокращенные названия функций: fd(100) вместо forward(100),
rt вместо right, lt вместо left, bk вместо backward.

Геометрические фигуры

Рисуем простые геометрические фигуры:

  • Прямая: просто движение вперед
  • Квадрат: вперед, поворот на 90 градусов и так 4 раза. Повторение команд – значит, можно выполнить их в цикле for!
  • Пятиконечная звезда: вперед, поворот на 144 градусов и так 5 раз.

Если мы хотим выполнить инструкции n раз, мы пишем их в цикле

for i in range(n):

Далее идут инструкции с отступом в 4 пробела. Код с отступами – тело цикла. Когда цикл завершается, отступы больше не ставятся.

Рисуем квадрат:

import turtle
square = turtle.Turtle()
square.shape(«turtle»)
for i in range(4):
square.forward(100)
square.right(90)
turtle.exitonclick()

Universal Card Readers - Turtle Races

Скучно рисовать одинокие фигуры. Поэтому мы приготовились рисовать сразу несколько и теперь создаем отдельный экземпляр класса Turtle для каждой фигуры.

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

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

Звезда рисуется также:

Universal Card Readers - Turtle Races

Самостоятельно:

  1. Нарисуйте пятиконечную звезду (угол поворота 144 градуса).
  2. Квадрат и звезду в одной программе, на одном графическом поле, но с разными экземплярами класса Turtle.
  3. Восьмиконечную звезду (угол поворота 135 градусов).
  4. Фигуру из анимации в начале страницы.

Решения

import turtle
square = turtle.Turtle()
for i in range(4):
square.forward(100)
square.right(90)

Читайте также:  IPhone Pro – концепт “идеального iPhone” от итальянских дизайнеров

starf = turtle.Turtle()
for i in range(5):
starf.forward(100)
starf.right(144)

turtle.exitonclick()
import turtle
star = turtle.Turtle()
star.

hideturtle()
for i in range(8):
star.forward(100)
star.right(135)
turtle.exitonclick()
import turtle
nineang = turtle.Turtle()
for i in range(9):
nineang.forward(100)
nineang.left(140)
nineang.forward(100)
nineang.right(100)
turtle.

exitonclick()

Изменяем параметры во время движения

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

import turtle

square = turtle.Turtle()
square.shape(«turtle»)
square.color('red', 'green')
square.begin_fill()
for j in range(3):
square.left(20)
for i in range(4):
square.forward(100)
square.left(90)

square.end_fill()
turtle.exitonclick()

Universal Card Readers - Turtle Races

Мы также добавили:

  • color('red', 'green') определяет цвет линии и цвет заполнения. Черепашка теперь зеленая!
  • begin_fill() и end_fill() обозначают начало и конец заполнения

Больше программирования!

Напишем обобщенную программу рисования выпуклых равносторонних многоугольников. num_sides – количество граней, side_length – длина грани, angle – угол поворота.

import turtle

polygon = turtle.Turtle()
num_sides = 6
side_length = 100
angle = 360.0 / num_sides

for i in range(num_sides):
polygon.forward(side_length)
polygon.right(angle)

turtle.exitonclick()

Universal Card Readers - Turtle Races

Что будет, если на каждом шаге увеличивать длину пути? В первый день 10 шагов, во второй – 20, далее 30, 40 и так до 200:

import turtle

spiral = turtle.Turtle()
for i in range(20):
spiral.forward(i * 10)
spiral.right(144)
turtle.exitonclick()

Universal Card Readers - Turtle Races

Координаты на плоскости

Положение на плоскости определяется двумя числами, x и y:

Universal Card Readers - Turtle Races

Черепашку в программе можно перемещать функцией goto(x, y). x и y – числа, или переменные. goto(0, 0) переместит черепашку в начало координат.

import turtle

spiral = turtle.Turtle()
for i in range(20):
spiral.fd(i * 10)
spiral.rt(144)
spiral.goto(0,0)
turtle.exitonclick()

Вместо звезды-спирали мы получили 5 линий, расходящихся из точки начала координат.

Круг и точка

Не хватает плавных изгибов? На помощь приходят функции dot() и circle():

import turtle

turtle.title(«Turtle Drawing»)
circle = turtle.Turtle()
circle.shape(«turtle»)
circle.pensize(5)
circle.pencolor(«cyan»)

circle.dot(20)
circle.penup()
circle.goto(0, -100)
circle.pendown()
circle.circle(100)
turtle.exitonclick()

Universal Card Readers - Turtle Races

Дополнительно мы:

  • изменили заголовок окна функцией title(),
  • установили толщину линии – pensize(),
  • установили цвет линии – pencolor(),
  • Подняли черепашку перед перемещением – penup() и опустили после – pendown().

Самостоятельно:

  • Используя код из примеров и функцию goto(), нарисовать галерею из 5 или более многоугольников на одном поле. Использовать экземпляр класса turtle.Turtle().
  • Нарисованные многоугольники закрасить разными цветами. Пробуйте стандартные цвета или их шестнадцатеричное представление. Не забудьте кавычки вокруг названия или кода цвета!

Решения

Несколько закрашенных фигур

  • У нас есть два варианта нарисовать несколько фигур: используя отдельные классы и не используя их. Рассмотрим оба варианта.
  • Без классов: import turtle

    turtle.hideturtle()
    turtle.speed(10)

    turtle.color('red')
    turtle.begin_fill()
    for i in range(4):
    turtle.forward(100)
    turtle.right(90)
    turtle.end_fill()

    turtle.penup()
    turtle.goto(200, 200)
    turtle.pendown()

    turtle.color('green')
    turtle.begin_fill()
    for i in range(5):
    turtle.forward(100)
    turtle.rt(144)
    turtle.end_fill()

    turtle.penup()
    turtle.goto(-200, -200)
    turtle.pendown()

    turtle.color('blue')
    turtle.begin_fill()
    for i in range(8):
    turtle.forward(100)
    turtle.right(135)
    turtle.end_fill()

    turtle.penup()
    turtle.goto(200, -200)
    turtle.pendown()

    turtle.color('cyan')
    turtle.begin_fill()
    for i in range(3):
    turtle.forward(100)
    turtle.lt(120)
    turtle.end_fill()

    turtle.penup()
    turtle.goto(-200, 200)
    turtle.pendown()

    turtle.color('magenta')
    turtle.begin_fill()
    for i in range(9):
    turtle.forward(30)
    turtle.right(140)
    turtle.forward(30)
    turtle.left(100)
    turtle.end_fill()

    turtle.exitonclick()

  • Получается довольно многословно. С классами (начало): import turtle

    square = turtle.Turtle()
    square.hideturtle()
    square.color('red')
    square.speed(10)
    square.begin_fill()
    for i in range(4):
    square.forward(100)
    square.right(90)
    square.end_fill()
    square.penup()

  • Так еще многословнее. Зачем нам понадобилось писать для каждой фигуры отдельный класс? Для того, чтобы подготовиться к написанию программы с помощью функций, которые помогут обобщить и сократить наш код. Создадим функции, используя написанную ранее обобщенную программу рисования выпуклых равносторонних многоугольников. Функция prepare() делает все приготовления для рисования: переходит в нужную точку холста, устанавливает нужный цвет и дает команду заполнять цветом. У функции три входных параметра: координаты по осям X, Y и кодовое слово цвета. Функция draw_polygon() – наш старый знакомый, так мы рисуем выпуклый многоугольник. У функции два входных параметра: количество граней и длина грани. import turtle

    def prepare(x, y, color):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.color(color)
    turtle.begin_fill()

    def draw_polygon(num_sides, side_length):
    angle = 360.0 / num_sides
    for i in range(num_sides):
    turtle.forward(side_length)
    turtle.right(angle)

    turtle.hideturtle()
    turtle.speed(10)

    prepare(0, 0, 'red')
    draw_polygon(3, 100)
    turtle.end_fill()

    prepare(200, 200, 'green')
    draw_polygon(4, 100)
    turtle.end_fill()

    prepare(-200, -200, 'blue')
    draw_polygon(5, 100)
    turtle.end_fill()

    prepare(200, -200, 'cyan')
    draw_polygon(6, 100)
    turtle.end_fill()

    prepare(-200, 200, 'magenta')
    draw_polygon(7, 100)
    turtle.end_fill()

    turtle.exitonclick()

  • Получилось существенно сократить программу, и она стала более читаемой. Но повторяющиеся действия остались. Значит, есть еще работа для программиста! Будем рисовать все 5 фигур в цикле. Для этого все параметры соберем в списки, а внутри цикла будем брать значение параметра по индексу (номеру минус 1) в списке. Теперь всего 22 строки кода: import turtle

    def prepare(x, y, color):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.color(color)
    turtle.begin_fill()

    def draw_polygon(num_sides, side_length):
    angle = 360.0 / num_sides
    for i in range(num_sides):
    turtle.forward(side_length)
    turtle.right(angle)
    turtle.end_fill()

    turtle.hideturtle()
    turtle.speed(10)

    colors = ['red', 'green', 'blue', 'cyan', 'magenta']
    xcoords = [0, 200, -200, 200, -200]
    ycoords = [0, 200, -200, -200, 200]
    for i in range(5):
    prepare(xcoords[i], ycoords[i], colors[i])
    draw_polygon(i+3, 100)

    turtle.exitonclick()

  • Получились фигуры разного размера. Самостоятельно: Задать переменной внутри цикла длину грани так, чтобы фигуры казались (или являлись) равновеликими.

Делаем фигуры равновеликими

Площадь квадрата со стороной 100 пикселей – 10 000 квадратных пикселей.
Вычислим площади всех фигур со стороной 100 от треугольника до 7-угольника.
Формула площади правильного многоугольника содержит тангенс, поэтому «поверим на слово» результату, зависимости количество углов (вершин) – площадь:

  • 3 – 4330.13
  • 4 – 10000
  • 5 – 17204.77
  • 6 – 25980.76
  • 7 – 36339.12

Изобразим ее на графике:

Получается, что площадь 7-угольника в 36339.12 / 4330.13 = 8.4 раза больше, чем площадь треугольника! Это очень заметно на рисунке:

Чтобы фигуры стали равновеликими, надо сделать длину грани вместо константы 100 – переменной, которая зависит от количества углов.

Как: приведем все площади к 10000. Для треугольника площадь увеличится на 10000 / 4330.13 = 2.31 раза. Для 7-угольника – уменьшится в 36339.12 / 10000 = 3.63 раз.
Значит, стороны должны измениться в 1.52 и 0.52 раз соответственно, то есть, до 152 и 32.7 пикселей (снова «верим на слово»).
Эту зависимость можно нащупать «на глаз», в чем и заключалось задание.

Наша программа без труда масштабируется до большего количества фигур:

Программа, в которой вычисляются точные значения:

import turtle
from math import tan, sqrt, pi

def prepare(x, y, color):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.color(color)
turtle.begin_fill()

def draw_polygon(num_sides, side_length):
angle = 360.0 / num_sides
for i in range(num_sides):
turtle.forward(side_length)
turtle.right(angle)
turtle.end_fill()

def calc_s(num_sides, side_length):
return num_sides * side_length ** 2 / (4 * tan(pi/num_sides))

def calc_side(square):
return sqrt(4 * square * tan(pi/num_sides) / num_sides)

turtle.hideturtle()
turtle.speed(10)

colors = ['red', 'green', 'blue', 'cyan', 'magenta', 'black', 'yellow', 'pink', 'brown']
xcoords = [0, 150, -150, 150, -150, 270, -270, 270, -270]
ycoords = [0, 150, -150, -150, 150, 270, -270, -270, 270]

squares = []
numsides = []
for i in range(9):
num_sides = i + 3
square = round(calc_s(num_sides, 100), 2)
side_length = round(calc_side(10000), 3)
squares.append(square)
numsides.append(num_sides)
print(«Углов:», num_sides, «была площадь:», square, «стала длина грани:», side_length,
«изменение в», round(side_length/100, 2), «раз»)
prepare(xcoords[i], ycoords[i], colors[i])
draw_polygon(num_sides, side_length)

turtle.exitonclick()
print(«Список количество углов:», numsides, end=»»)
print(«Список площади:», squares)

Текстовый вывод:

Углов: 3 была площадь: 4330.13 стала длина грани: 151.967 изменение в 1.52 раз
Углов: 4 была площадь: 10000.0 стала длина грани: 100.0 изменение в 1.0 раз
Углов: 5 была площадь: 17204.77 стала длина грани: 76.239 изменение в 0.76 раз
Углов: 6 была площадь: 25980.76 стала длина грани: 62.04 изменение в 0.62 раз
Углов: 7 была площадь: 36339.12 стала длина грани: 52.458 изменение в 0.52 раз
Углов: 8 была площадь: 48284.27 стала длина грани: 45.509 изменение в 0.46 раз
Углов: 9 была площадь: 61818.24 стала длина грани: 40.22 изменение в 0.4 раз
Углов: 10 была площадь: 76942.09 стала длина грани: 36.051 изменение в 0.36 раз
Углов: 11 была площадь: 93656.4 стала длина грани: 32.676 изменение в 0.33 раз
Список количество углов: [3, 4, 5, 6, 7, 8, 9, 10, 11]
Список площади: [4330.13, 10000.0, 17204.77, 25980.76, 36339.12, 48284.27, 61818.24, 76942.09, 93656.4]

Как построить график (если кто захочет):

  1. Поставить Matplotlib, набрав в командной строке pip install matplotlib
  2. Запустить программу import matplotlib.pyplot as plt
    numsides = [3, 4, 5, 6, 7, 8, 9, 10, 11]
    squares = [4330.13, 10000.0, 17204.77, 25980.76, 36339.12, 48284.27, 61818.24, 76942.09, 93656.4]
    plt.plot(numsides, squares, 'or—')
    plt.xlabel('Количество углов')
    plt.ylabel('Площадь')
    plt.show()

Другие полезные функции:

  • turtle.setup(800, 400) устанавливает размеры окна в 800 на 400 пикселей
  • turtle.setworldcoordinates(0, 0, 800, 400) устанавливает начало координат в точку 800, 400
  • turtle.tracer(0, 0) отключает анимацию
  • setpos(x, y) устанавливает черепашку (курсор) в позицию с координатами (x, y)
  • seth(x) устанавливает направление в градусах. 0 – горизонтально направо (на восток), 90 – вверх (на север) и так далее
  • hideturtle() скрывает черепашку (или стрелку, курсор)
  • speed(x) изменяет скорость рисования. Например, speed(11) – почти моментальная отрисовка простых фигур
  • clear() очищает холст от нарисованного
  • reset() очищает холст и возвращает курсор в начало координат

Пример двух рисунков – экземпляров класса Turtle() – на одном полотне

import turtle

turtle.title(«Turtle Circles»)
circ = turtle.Turtle()
circ.pencolor(«purple»)
circ.fillcolor(«orange»)
circ.shape(«circle»)
circ.pensize(5)
circ.speed(10)
circ.fd(150)
circ.begin_fill()
circ.circle(90)
circ.end_fill()

n = 10
t = turtle.Turtle()
while n

Команды передвижения/рисования пером по холсту

В материале представлены команды, отвечающие за рисование, передвижение, изменение направления, а так же настройка измерения величины угла поворота (градусы/радианы) в модуле turtle.

При рисовании можно использовать как функции модуля, так и одноименные методы экземпляра пера/холста:

>>> import turtle
# функция модуля
>>> turtle.fd(150)
# создание экземпляра пера
>>> pen = turtle.Turtle()
>>> pen.lt(90)
>>> pen.fd(150)

Содержание:

  • Движение пера/карандаша:
  • Скорость перемещения пера/карандаша по холсту:
    • turtle.speed() устанавливает.возвращает скорость передвижения пера,
  • Поворот пера/карандаша:
  • Настройка угла поворота пера
  • Ориентация пера на холсте:
  • Отмена действий:
    • turtle.undo() отменяет действие пера.

Движение пера/карандаша

turtle.forward(distance),turtle.fd(distance):

Методы turtle.forward и turtle.fd() передвигают перо черепахи вперед на указанное расстояние distance и в том направлении, в котором она движется.

Аргумент distance принимает число int или float.

>>> turtle.position()
# (0.00,0.00)
>>> turtle.forward(25)
>>> turtle.position()
# (25.00,0.00)
>>> turtle.forward(-75)
>>> turtle.position()
# (-50.00,0.00)

turtle.back(distance),turtle.bk(distance):

Методы turtle.back(distance) и turtle.backward() передвигают перо черепахи назад на расстояние distance, в противоположном направлении, в котором она движется. Этот метод не меняет угол/направление черепахи.

Аргумент distance принимает число int или float.

>>> turtle.position()
# (0.00,0.00)
>>> turtle.backward(30)
>>> turtle.position()
# (-30.00,0.00)

Скорость перемещения пера/карандаша по холсту

turtle.speed(speed=None):

Метод turtle.speed() задает скорость перемещения пера черепахи по холсту целым числом в диапазоне 0 — 10 или строкой, означающей скорость.

Если аргумент не указан, то возвращает текущую скорость.

Если число speed больше 10 или меньше 0,5, то скорость устанавливается равной 0. Строки скорости сопоставляются со значениями скорости следующим образом:

  • 'fastest': 0
  • 'fast': 10
  • 'normal': 6
  • 'slow': 3
  • 'slowest': 1

>>> turtle.speed()
# 3
>>> turtle.speed('normal')
>>> turtle.speed()
# 6
>>> turtle.speed(9)
>>> turtle.speed()
# 9

Поворот пера/карандаша

turtle.right(angle),turtle.rt(angle):

Методы turtle.right() и turtle.rt() поворачивают черепаху вправо на единицу измерения угла angle.

Единицы измерения угла по умолчанию — градусы, но их можно задать с помощью функций turtle.degrees() и turtle.radians(). Ориентация угла зависит от режима turtle.mode() пера черепахи.

Аргумент angle принимает число int или float.

>>> turtle.heading()
# 22.0
>>> turtle.right(45)
>>> turtle.heading()
# 337.0

turtle.left(angle),turtle.lt(angle):

Методы turtle.left() и turtle.lt() поворачивают черепаху влево на единицу измерения угла angle.

Аргумент angle принимает число int или float.

>>> turtle.heading()
# 22.0
>>> turtle.left(45)
>>> turtle.heading()
# 67.0

Настройка измерения угла поворота пера

turtle.degrees(fullcircle=360.0):

Метод turtle.degrees() устанавливает единицы измерения угла, т. е. задает количество градусов для полного круга. Значение по умолчанию это 360 градусов.

Аргумент fullcircle — целое число int.

>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
# 90.0

Пример изменения единицы измерения угла в градиан (который равен 1/100-й части прямого угла).

>>> turtle.degrees(400.0)
>>> turtle.heading()
# 100.0
>>> turtle.degrees(360)
>>> turtle.heading()
# 90.0

turtle.radians():

Метод turtle.radians() устанавливает единицы измерения угла в радианы. Эквивалентно градусам как 2 * math.pi.

>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
# 90.0
>>> turtle.radians()
>>> turtle.heading()
# 1.5707963267948966

turtle.setheading(to_angle),turtle.seth(to_angle):

Методы turtle.setheading() и turtle.seth() устанавливает направление движения (ориентацию) пера черепахи в значение to_angle.

Аргумент to_angle — число (int или float).

Вот некоторые общие направления в градусах:

standard mode logo mode
0 — east 0 — north
90 — north 90 — east
180 — west 180 — south
270 — south 270 — west

>>> turtle.setheading(90)
>>> turtle.heading()
# 90.0

turtle.home():

Метод turtle.home() перемещает черепаху в начало координат (координаты (0,0)) и устанавливает его заголовок в начальную ориентацию, которая зависит от turtle.mode().

>>> turtle.heading()
# 90.0
>>> turtle.position()
# (0.00,-10.00)
>>> turtle.home()
>>> turtle.position()
# (0.00,0.00)
>>> turtle.heading()
# 0.0

Отмена действий

turtle.undo():

Метод turtle.undo() отменяет (можно повторять многократно) последнее действие(я) черепахи.

Количество доступных действий отмены определяется размером буфера отмены.

>>> for i in range(4):
… turtle.fd(50); … turtle.lt(80)

>>> for i in range(8):
… turtle.undo()

Ссылка на основную публикацию
Adblock
detector