2016-03-25 7 views
0

ich versucht habe eine Schildkröte Zeichnung durch eine einzige Achse und nach einigen Tests zu skalieren, konnte ich die folgende Funktion:Python Schildkröte Positional Fehler

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) 

Der Ausgang dieser Tests nur vier überlappende Quadrate sein sollte skaliert auf der Y-Achse, aber aus irgendeinem sehr seltsamen Grund ändert Python zufällig meine Y-Werte vor und nach einer Bewegung um 1 Einheit, wenn sie gleich sein sollten. (Zum Beispiel hat eine Linie, die horizontal gezeichnet wird, ein altes Ycor von 99, aber ein neues Ycor von 100), was meinen Code komplett unterbricht und die Quadrate fehl am Platz erzeugt.

Eine weitere seltsame Sache, die ich bemerkt, dass die Schildkröte ycor ohne Konvertierung() in einen int, die print-Anweisungen einige bizarre Werte anzuzeigen, die jeden Sinn für mich nicht ...

ich jede Hilfe dankbar !!

Antwort

0

Obwohl Pythons Turtle-Grafiken alle üblichen Transformationen (Skalierung, Scherung, Neigung usw.) für das Turtle-Bild selbst bieten, liefert es ihnen nicht die Bilder, die es zeichnet! Anstatt einen Skalierungsfaktor für jede Zeichenroutine hinzufügen, die Sie definieren, wollen sie versuchen, der Abbildungsmaßstab unabhängig von Ihrer Zeichnung Routinen zu manipulieren:

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() 

Nur Scale(1, 2) setzte alles, was Sie doppelt so groß in der Y-Dimension ziehen zu machen. Entweder vor oder nach dem Zeichnen.

Verwandte Themen