2016-03-25 3 views
0

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

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 единицу, когда они должны быть одинаковыми. (например, линия, выведенная горизонтально, имеет oldYcor из 99, но newYcor из 100), что полностью нарушает мой код и создает квадраты на месте.

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

Я признателен за любую помощь !!

ответ

0

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