Ошибки позиционирования 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. Либо до, либо после того, как вы его нарисуете.