Библиотека turtle — это модуль для языка Питон, позволяющей рисовать на экране рисунки.
Представьте себе, что по экрану компьютера ползает маленькая черепашка (turtle). Вы можете управлять движением черепашки, отдавая ей различные команды вида "Проползти вперед на 10 пикселей", "Поверни направо на 10 градусов". После того, как вы отдадите ей команду "Начать рисовать", черепашка будет оставлять за собой след, пока не получит команду "Закончить рисовать". Управлять черепашкой можно при помощи инструкций Питона. Вот так, например, выглядит программа, рисующая квадрат:
import turtle # Подключаем модуль turtle
T = turtle.Turtle() # T — это наша черепашка. Можно создавать много черепашек
T.pendown() # Опускаем перо (начало рисования)
T.forward(50) # Проползти 50 пикселей вперед
T.left(90) # Поворот влево на 90 градусов
T.forward(50) # Рисуем вторую сторону квадрата
T.left(90) # Поворот влево на 90 градусов
T.forward(50) # Рисуем третью сторону квадрата
T.left(90) # Поворот влево на 90 градусов
T.forward(50) # Рисуем четвертую сторону квадрата
T.penup() # Поднять перо (закончить рисовать)
T.forward(100) # Отвести черепашку от рисунка в сторону
T.hideturtle() # Спрятать черепашку
turtle.mainloop() # Задержать окно на экране
Кривая Коха — фрактальная кривая, описанная в 1904 году шведским математиком Хельге фон Кохом.
Кривая Коха является типичным геометрическим фракталом. Процесс её построения выглядит следующим образом: берём единичный отрезок, разделяем на три равные части и заменяем средний интервал равносторонним треугольником без этого сегмента. В результате образуется ломаная, состоящая из четырёх звеньев длины 1/3. На следующем шаге повторяем операцию для каждого из четырёх получившихся звеньев и т. д… Предельная кривая и есть кривая Коха.
Строить фрактальные кривые очень удобно при помощи рекурсивных процедур, получающих на вход глубину рекурсии и линейный размер кривой (или какой-то её конкретной части).
На вход даётся неотрицательное число n.
Постройте кривую «степени» n.
Треугольник Серпинского — фрактал, один из двумерных аналогов множества Кантора, предложенный польским математиком Вацлавом Серпинским в 1915 году. Также известен как «решётка» или «салфетка» Серпинского.
На вход даётся неотрицательное число n.
Постройте границу салфетки Серпинского «степени» n.
Кривая Минковского — классический геометрический фрактал, предложенный Минковским. Инициатором является отрезок, а генератором является ломаная из восьми звеньев (два равных звена продолжают друг друга).
На вход даётся неотрицательное число n.
Постройте кривую «степени» n.
В ледяном фрактале всё начинается с отрезка.
На каждом шаге в центре каждого отрезка «отрастают» два «уса» под углом 60 градусов длиной одна четверть от исходного отрезка.
На вход даётся неотрицательное число n.
Постройте кривую «степени» n.
Считается, что такое название фрактал получил за сходство с традиционными китайскими драконами. По крайней мере, так показалось ученым, которые впервые его исследовали. Каждая ломаная-дракон является лишь приближением к дракону-фракталу и состоит из отрезков. Ломаная с номером n будет состоять из 2n отрезков.
Итак, возьмём полоску бумаги и сложим её несколько раз пополам, а затем развернем так чтобы между углами сгиба образовались прямые углы. В итоге мы получим кривую дракона. Поскольку толщина сложенной полоски каждый раз удваивается, а длина отдельного звена уменьшается в два раза, то мы не можем получить таким наивным способом длинных кривых.
К счастью длинные кривые легко рисуются другим способом.
На вход даётся неотрицательное число n.
Постройте кривую «степени» n.
Ориентация кривой важна, первый поворот — налево.
В этой задаче мы будем строить то, что называют «обнаженное обдуваемое ветром дерево Пифагора».
Классическое дерево Пифагора состоит из множества квадратов (см. раз, два).
На вход даётся неотрицательное число n, и два угла α и β.
Необходимо построить дерево «степени» n.
Для этого нужно построить отрезок, клонировать черепашку командой T.clone().
Первую черепашку нужно повернуть на угол α налево, а вторую — на угол β направо.
После чего приказать каждой черепашке построить по такому же дереву Пифагору на единицу меньшей степени.
Длина каждого следующего отрезка в глубь должна быть в 2 раза меньше предыдущего.
PS. Вероятно, саму черепашку, которая будет рисовать дерево, нужно передавать внутрь рекурсивной функции.
from turtle import *
bgcolor("gray60")
pu()
speed(0)
ht()
shape("square")
shapesize(3.2, 3.5)
shift = [10, 0, 10, 28, 10, 0, 10, 28, 10]
tracer(False)
for i in range(9):
goto(-365 + shift[i], 267-66*i)
color("black")
for i in range(11):
stamp()
fd(70)
if pencolor() == "white":
color("black")
else:
color("white")
mainloop()
Скрыть пример
Гравитация — комета-черепашка вокруг солнца
from turtle import *
color("orange")
dot(10)
center = pos()
color("blue")
shape("turtle")
speed(0)
penup()
goto(200, 0)
pendown()
G = 800
v = Vec2D(0, 1)
t = 0
dt = 1
while t < 1100:
goto(pos() + v * dt)
setheading(towards(center))
r = distance(center)
acc = (-G / r ** 3) * pos()
v += acc * dt
t += dt
mainloop()
Скрыть пример
Управляем космическим кораблём
from turtle import *
from math import sin, cos, pi
FORCE_UNIT = 0.1 # Ускорение двигателя
HEIGHT = 350
WIDTH = 250
def one_step(): # Одна итерация движения
global speed_x, speed_y # Глобальные переменные, в которых хранится текущая скорость
cur_x, cur_y = position() # Получаем текущие координат
cur_x += speed_x # Двигаем "корабль"
cur_y += speed_y
setpos(cur_x, cur_y)
if abs(cur_x) > WIDTH: # Проверяем, что не улетели слишком далеко
speed_x *= -1
if abs(cur_y) > HEIGHT:
speed_y *= -1
def turn_left(): # Была нажата клавиша "Налево"
left(10)
def turn_right(): # Была нажата клавиша "Направо"
right(10)
def exit(): # Была нажата клавиша Escape, завершаем работу
global continue_game
continue_game = False
def speed_up(): # Была нажата клавиша "Вверх"
global speed_x, speed_y # Глобальные переменные, в которых хранится текущая скорость
alpha = heading() * pi / 180.0 # Получаем текущий угол в радианах
speed_x += FORCE_UNIT * cos(alpha) # Ускоряемся
speed_y += FORCE_UNIT * sin(alpha)
def main():
reset()
global speed_x, speed_y # Глобальные переменные, в которых хранится текущая скорость
global continue_game
speed_x = speed_y = 0
continue_game = True
speed(0) # Перемещаться будем мгновенно
pensize(2) # И рисовать за собой линию
shape("turtle") # Форма курсора
fillcolor("blue") # Цвет черепашки
pencolor("red") # Цвет линии
onkeypress(turn_left, "Left") # По нажатию кнопки "Налево" вызвать функцию turnleft()
onkeypress(turn_right, "Right") # ...
onkeypress(speed_up, "Up") # ...
onkey(exit, "Escape") # По нажатию кнопки Escape завершить работу
listen() # Начинаем "слушать" нажатия клавиш
while continue_game:
one_step() # Запускаем основной цикл
bye()
main()
Скрыть пример
Пример от разработчкиков turtle
from turtle import *
def switchpen():
if isdown():
pu()
else:
pd()
def demo2():
"""Demo of some new features."""
speed(1)
st()
pensize(3)
setheading(towards(0, 0))
radius = distance(0, 0)/2.0
rt(90)
for _ in range(18):
switchpen()
circle(radius, 10)
write("wait a moment...")
while undobufferentries():
undo()
reset()
lt(90)
colormode(255)
laenge = 10
pencolor("green")
pensize(3)
lt(180)
for i in range(-2, 16):
if i > 0:
begin_fill()
fillcolor(255-15*i, 0, 15*i)
for _ in range(3):
fd(laenge)
lt(120)
end_fill()
laenge += 10
lt(15)
speed((speed()+1)%12)
#end_fill()
lt(120)
pu()
fd(70)
rt(30)
pd()
color("red","yellow")
speed(0)
begin_fill()
for _ in range(4):
circle(50, 90)
rt(90)
fd(30)
rt(90)
end_fill()
lt(90)
pu()
fd(30)
pd()
shape("turtle")
tri = getturtle()
tri.resizemode("auto")
turtle = Turtle()
turtle.resizemode("auto")
turtle.shape("turtle")
turtle.reset()
turtle.left(90)
turtle.speed(0)
turtle.up()
turtle.goto(280, 40)
turtle.lt(30)
turtle.down()
turtle.speed(6)
turtle.color("blue","orange")
turtle.pensize(2)
tri.speed(6)
setheading(towards(turtle))
count = 1
while tri.distance(turtle) > 4:
turtle.fd(3.5)
turtle.lt(0.6)
tri.setheading(tri.towards(turtle))
tri.fd(4)
if count % 20 == 0:
turtle.stamp()
tri.stamp()
switchpen()
count += 1
tri.write("CAUGHT! ", font=("Arial", 16, "bold"), align="right")
tri.pencolor("black")
tri.pencolor("red")
def baba(xdummy, ydummy):
clearscreen()
bye()
while undobufferentries():
tri.undo()
turtle.undo()
tri.fd(50)
tri.write(" Click me!", font = ("Courier", 12, "bold") )
tri.onclick(baba, 1)
demo2()