Python: команда turtle goto () - PullRequest
       25

Python: команда turtle goto ()

0 голосов
/ 07 ноября 2018

Мое задание просит меня закодировать графическое представление некоторых вложенных квадратов, размер которых варьируется от 20 до 80, например:

enter image description here

После создания первого квадрата мне нужно переместить позицию в начало следующего квадрата. Я использую команду goto() для этого. Моя проблема - команда goto(), так как я использую две переменные для горизонтальных и вертикальных входов, но одновременно работает только одна из них - мне нужны обе для работы. Любая помощь будет оценена.

#Draw a set of nested squares, increasing in size
from turtle import *

number_of_shapes = 4

for shape in range(1, number_of_shapes + 1):
    #Draw a square
    for sides in range(1,5):
        forward(20 + shape * 10)
        right(90)

#Move to position of next square
    penup()
    goto(shape * 10, shape * 10)
    pendown()

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Эта простая геометрическая форма является прекрасным примером того, как штамповка может быть проще и быстрее , чем рисунок :

from turtle import Screen, Turtle

NUMBER_OF_SHAPES = 4
CURSOR_SIZE = 20  # cursor sized relative to this starting size

screen = Screen()

turtle = Turtle('square', visible=False)
turtle.color('black', 'white')  # pencolor, fillcolor
turtle.penup()

for shape in range(NUMBER_OF_SHAPES - 1, -1, -1):  # from large to small
    turtle.shapesize((20 + shape * 20) / CURSOR_SIZE)
    turtle.stamp()

screen.mainloop()

enter image description here

Так же, как при рисовании , мы можем повернуть изображение, просто добавив:

turtle.setheading(45)

или turtle.left(45) или turtle.right(45):

enter image description here

, но в отличие от рисования , мы также можем воспользоваться другими графическими операциями курсора черепахи, которые не реализованы черепахой для рисования . Например, shear :

turtle.shearfactor(0.5)

enter image description here

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

0 голосов
/ 07 ноября 2018

Одной из замечательных особенностей Python является то, что в интерпретаторе легко тестировать небольшие кусочки кода. Давайте используем интерпретатор для проверки длины сторон:

In [82]: number_of_shapes = 4

In [83]: for shape in range(1, number_of_shapes + 1):
   ....:     print(20 + shape * 10)
30
40
50
60

К сожалению. Теперь мы можем ясно видеть, что forward(20 + shape * 10) не даст сторонам длины 20, 40, 60 и 80. Обратите внимание, что (20 + shape * 10) увеличивает длину сторон на 10. Мы хотим увеличить на 20, поэтому используйте (20 + shape * 20) вместо:

In [84]: for shape in range(1, number_of_shapes + 1):
   ....:     print(20 + shape * 20)
   ....: 
40
60
80
100

Упс, я не правильно поняла. Нет проблем, нам просто нужно уменьшить все на 20:

In [85]: for shape in range(1, number_of_shapes + 1):
   ....:     print(shape * 20)
   ....: 
20
40
60
80

Ах, намного лучше.


Итак, теперь код выглядит так:

import turtle

number_of_shapes = 4

for shape in range(1, number_of_shapes+1):
    #Draw a square
    for sides in range(4):
        turtle.forward(20 + shape * 20)
        turtle.right(90)

    #Move to position of next square
    turtle.penup()
    turtle.goto(shape * 10, shape * 10)
    turtle.pendown()
turtle.mainloop()

enter image description here

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


Теперь давайте подумаем о выражении goto(shape * 10, shape * 10). Куда это нас ведет? Давайте использовать переводчик, чтобы узнать:

In [87]: for shape in range(1, number_of_shapes + 1):
   ....:     print(shape * 10, shape * 10)
   ....: 
10 10
20 20
30 30
40 40

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

In [88]: for shape in range(1, number_of_shapes + 1):
   ....:     print(-shape * 10, shape * 10)
   ....: 
-10 10
-20 20
-30 30
-40 40

Посмотрим, что происходит сейчас:

enter image description here

Бинго.


Кстати, для смешивания относительных команд, таких как left и right и forward, с абсолютными командами, такими как goto, требуется ... координация. Математика привередлива. Если вы придерживаетесь чисто относительных команд, вам не нужно много думать о получении правильных goto координатных формул:

turtle.penup()
turtle.left(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
turtle.left(180)
turtle.pendown()

Преимущество использования чисто относительных команд состоит в том, что теперь вы можете разместить черепаху где угодно, с любым начальным заголовком и по-прежнему рисовать вложенные квадраты:

import turtle

number_of_shapes = 4
turtle.setheading(45)
turtle.penup()
turtle.goto(20, 50)
turtle.pendown()
for shape in range(1, number_of_shapes+1):
    #Draw a square
    for sides in range(4):
        turtle.forward(20 + shape * 20)
        turtle.right(90)

    #Move to position of next square
    turtle.penup()
    turtle.left(90)
    turtle.forward(10)
    turtle.left(90)
    turtle.forward(10)
    turtle.left(180)
    turtle.pendown()
turtle.mainloop()

enter image description here

...