2

こんにちは、クラスから質問があり、目、口、頭にserperate関数を使用してスマイリーフェイスを作成するように求められました。あとは、少しずつ重ねて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)
4

1 に答える 1

4

これは可能ですが、描画ロジックを再考する必要があります。顔文字が 10 度の回転に耐えられるようにするには、顔文字を描画する際のタートルの配置は、絶対的ではなく、すべて相対的でなければなりません。いいえturtle.goto()、いいえjump(turtle, x, y)。そして、10 個の顔文字をページに収めるには、絶対的なサイズではなく、相対的なサイズにする必要があります。これを行うリワークは次のとおりです。

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()は閉じたポリゴンでしか構成できないため、顔文字の笑顔が多少変化します。

ここに画像の説明を入力

楽しむ!

于 2016-11-06T08:54:22.970 に答える