Ошибки позиционирования Python Turtle

Я пытался масштабировать рисунок Черепахи по одной оси, и после некоторого тестирования мне удалось выполнить следующую функцию:

def DrawSquare(length=50.0, Yscale=2):

   setheading(0)

   for n in range(0,4):
      oldYcor = int(ycor())
      oldPos = pos()
      penup()
      forward(length)
      newYcor = int(ycor())

      print 'OldYcor = ', int(oldYcor)
      print 'NewYcor = ', int(newYcor)
      print '------'

      setpos(oldPos)
      pendown()

      if (oldYcor == newYcor):
          print 'dont scale'          
          forward(length)
      elif (oldYcor != newYcor):
          print 'scale'
          forward(length*Yscale)

      left(90)

penup()
speed('slowest')
goto(0,0)

#TESTS
DrawSquare(50.0, 2)
DrawSquare(50.0, 2)
DrawSquare(50.0, 2)
DrawSquare(50.0, 2)

Результат этих тестов должен быть просто четырьмя перекрывающимися квадратами, масштабированными по оси y, но по какой-то очень странной причине Python случайным образом меняет мои значения Y до и после перемещения на 1 единицу, когда они должны быть одинаковыми. (например, линия, нарисованная горизонтально, имеет старый код 99, но новый код 100), что полностью нарушает мой код и выдает квадраты не на своем месте.

Еще одна странная вещь, которую я заметил, заключается в том, что без преобразования ycor() черепахи в int операторы print отображают некоторые странные значения, которые не имеют никакого смысла для меня...

Я ценю любую помощь!

1 ответ

Хотя графика черепахи в Python обеспечивает все обычные преобразования (масштаб, сдвиг, наклон и т. Д.) Для самого изображения черепахи, он не обеспечивает их для изображений, которые он рисует! Вместо того, чтобы добавлять коэффициент масштабирования к каждой определяемой вами процедуре рисования, давайте попробуем манипулировать масштабом изображения независимо от ваших процедур рисования:

from turtle import *
import time

SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400

def DrawSquare(length=1):

    oldPos = pos()
    setheading(0)
    pendown()

    for n in range(0, 4):
        forward(length)
        left(90)

    setpos(oldPos)

def Scale(x=1, y=1):
    screen = Screen()
    screen.setworldcoordinates(- (SCREEN_WIDTH / (x * 2)), - (SCREEN_HEIGHT / (y * 2)), (SCREEN_WIDTH / (x * 2)), (SCREEN_HEIGHT / (y * 2)))

setup(SCREEN_WIDTH, SCREEN_HEIGHT)
mode("world")

penup()
goto(-25, -25)

# TESTS

Scale(1, 1) # normal size
DrawSquare(50)
time.sleep(2)

Scale(1, 2)  # twice as tall
time.sleep(2)

Scale(2, 1)  # twice as wide
time.sleep(2)

Scale(2, 2)  # twice as big
time.sleep(2)

Scale(1, 1)  # back to normal

done()

Просто установите Scale(1, 2) чтобы сделать все, что вы рисуете в два раза больше в измерении Y. Либо до, либо после того, как вы его нарисуете.

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