Черепаха и наклон объекта
Привет всем, у меня был вопрос из моего класса, который попросил меня создать улыбающееся лицо, используя отдельные функции для глаз, рта и головы. После этого они хотят, чтобы мы рисовали его 10 раз, слегка перекрывая друг друга, и наклоняли его влево на 10 при каждом повторении. Я знаю, как сделать цикл for, у меня проблема с наклоном. Ниже то, что я имею до сих пор. Не могли бы вы указать мне правильное направление наклона?
import turtle
s=turtle.Screen()
p=turtle.Turtle()
def happymouth(p,x,y):
p.setheading(-60)
jump(p,x-60.62,y+65)
p.circle(70,120)
def eyes(p,x,y):
jump(p,x+35,y+120)
p.dot(25)
jump(p,x-35,y+120)
p.dot(25)
def jump(p,x,y):
p.up()
p.goto(x,y)
p.down()
def emoticon(p,x,y):
p=turtle.Turtle()
s=turtle.Screen()
p.pensize(3)
p.setheading(0)
jump(p,x,y)
p.circle(100)
eyes(p,x,y)
happymouth(p,x,y)
jump(p,x,y)
1 ответ
Вы можете сделать это, но для этого нужно переосмыслить логику рисования. Чтобы смайлик удерживался при поворотах на 10 градусов, ваше положение черепахи при рисовании смайлика должно быть относительным, а не абсолютным. нет turtle.goto()
нет jump(turtle, x, y)
, А затем, чтобы уместить ваши десять смайликов на странице, вам также нужно сделать относительный размер не абсолютным. Вот переделка, которая делает это:
from turtle import Turtle, Screen
def jump(turtle, x, y):
turtle.up()
turtle.goto(x, y)
turtle.down()
def head(turtle, size):
# to draw circle with current position as center, have to adjust the y position
turtle.up()
turtle.right(90)
turtle.forward(size)
turtle.left(90)
turtle.color("black", "yellow")
turtle.down()
turtle.begin_fill()
turtle.circle(size)
turtle.end_fill()
# return to the center of the circle
turtle.up()
turtle.color("black")
turtle.left(90)
turtle.forward(size)
turtle.right(90)
turtle.down()
def eyes(turtle, size):
turtle.up()
turtle.forward(0.35 * size)
turtle.left(90)
turtle.forward(0.2 * size)
turtle.right(90)
turtle.down()
turtle.dot(0.25 * size)
turtle.up()
turtle.backward(0.7 * size)
turtle.down()
turtle.dot(0.25 * size)
turtle.up()
turtle.forward(0.35 * size)
turtle.right(90)
turtle.forward(0.2 * size)
turtle.left(90)
turtle.down()
def happymouth(turtle, size):
turtle.up()
turtle.left(180)
turtle.forward(0.6 * size)
turtle.left(90)
turtle.forward(0.35 * size)
turtle.left(90)
turtle.down()
turtle.right(60)
turtle.circle(0.7 * size, 120)
turtle.up()
turtle.circle(0.7 * size, 240)
turtle.left(60)
turtle.forward(0.6 * size)
turtle.left(90)
turtle.forward(0.35 * size)
turtle.right(90)
turtle.down()
def emoticon(turtle, size):
turtle.pensize(0.03 * size)
head(turtle, size)
eyes(turtle, size)
happymouth(turtle, size)
screen = Screen()
yertle = Turtle()
width, height = screen.window_width(), screen.window_height()
yertle.setheading(-50)
for xy in range(-5, 5):
jump(yertle, xy * width / 10, xy * height / 10)
emoticon(yertle, 60)
yertle.setheading(yertle.heading() + 10)
screen.exitonclick()
Приведенный выше код не оптимизирован в части рисования - он всегда возвращается в центр, чтобы убедиться, что каждый компонент нарисован относительно него. Но это в основном работает:
Существует совершенно другой способ решения этой проблемы, который позволяет нам использовать абсолютный turtle.goto()
но есть свои трудности. Мы можем сделать черепаху смайликом и поставить ее на странице. Это также позволяет нам игнорировать относительный размер, так как у курсора черепахи есть своя возможность определения размеров:
from turtle import Turtle, Screen, Shape
def jump(turtle, x, y):
turtle.up()
turtle.goto(x, y)
turtle.down()
def head(turtle, shape, x, y):
jump(turtle, x, y - 100)
turtle.begin_poly()
turtle.circle(100)
turtle.end_poly()
shape.addcomponent(turtle.get_poly(), "yellow", "black")
def happymouth(turtle, shape, x, y):
turtle.setheading(-60)
jump(turtle, x - 60, y - 35)
turtle.begin_poly()
turtle.circle(70, 120)
turtle.end_poly()
shape.addcomponent(turtle.get_poly(), "black")
turtle.setheading(90)
def eyes(turtle, shape, x, y):
jump(turtle, x + 35, y + 20)
turtle.begin_poly()
turtle.circle(13)
turtle.end_poly()
shape.addcomponent(turtle.get_poly(), "black")
jump(turtle, x - 35, y + 20)
turtle.begin_poly()
turtle.circle(13)
turtle.end_poly()
shape.addcomponent(turtle.get_poly(), "black")
def emoticon(turtle, x, y):
shape = Shape("compound")
head(turtle, shape, x, y)
eyes(turtle, shape, x, y)
happymouth(turtle, shape, x, y)
screen.register_shape("emoticon", shape)
screen = Screen()
yertle = Turtle(visible="False")
emoticon(yertle, 0, 0)
yertle.shape("emoticon")
yertle.clear()
yertle.shapesize(0.6, 0.6)
width, height = screen.window_width(), screen.window_height()
yertle.setheading(50)
for xy in range(-5, 5):
jump(yertle, xy * width / 10, xy * height / 10)
yertle.stamp()
yertle.setheading(yertle.heading() + 10)
screen.exitonclick()
К сожалению, штампы сделаны с использованием turtle.*_poly()
может состоять только из замкнутых полигонов, что означает, что смайлик несколько меняется:
Повеселись!