Черепаха и наклон объекта

Привет всем, у меня был вопрос из моего класса, который попросил меня создать улыбающееся лицо, используя отдельные функции для глаз, рта и головы. После этого они хотят, чтобы мы рисовали его 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() может состоять только из замкнутых полигонов, что означает, что смайлик несколько меняется:

Повеселись!

Другие вопросы по тегам