2016-11-02 4 views
0

Ich bin auf der Suche nach dem besten Weg, automatisch Startposition für neue Turtle Zeichnung zu finden, so dass es im Grafikfenster zentriert werden würde, unabhängig von seiner Größe und Form.Turtle Zeichnung automatische Zentrierung

Bisher habe ich eine Funktion entwickelt, die mit jedem gezeichneten Element Turtle-Position nach Extremwerten für links, rechts, oben und unten sucht und auf diese Weise finde ich Bildgröße und kann damit die Startposition vor dem Loslassen meiner anpassen Code. Dies ist beispielsweise der einfache Form zeichnen mit meinem Bild Größenerkennung hinzugefügt:

from turtle import * 

Lt=0 
Rt=0 
Top=0 
Bottom=0 

def chkPosition(): 
    global Lt 
    global Rt 
    global Top 
    global Bottom 

    pos = position() 
    if(Lt>pos[0]): 
     Lt = pos[0] 
    if(Rt<pos[0]): 
     Rt= pos[0] 
    if(Top<pos[1]): 
     Top = pos[1] 
    if(Bottom>pos[1]): 
     Bottom = pos[1] 

def drawShape(len,angles): 
    for i in range(angles): 
     chkPosition() 
     forward(len) 
     left(360/angles) 


drawShape(80,12) 
print(Lt,Rt,Top,Bottom) 
print(Rt-Lt,Top-Bottom) 

Dieses Verfahren ist jedoch funktioniert es scheint sehr ungeschickt mir so würde Ich mag mehr Erfahrungen Programmierer fragen Schildkröte gibt es eine bessere Art und Weise beginnen zu finden Position für Schildkrötenzeichnungen, um sie zentriert zu machen?

Grüße

+0

Verwendung Geometrie zu finden Position starten. – furas

Antwort

1

Es gibt keine universelle Methode jede Form zum Zentrum (bevor Sie sie ziehen und alle Ihre max, min Punkte finden).

Für Ihre Form ("fast" Kreis) können Sie Startpunkt mit Geometrie berechnen.

enter image description here

alpha + alpha + 360/repeat = 180 

so

alpha = (180 - 360/repeat)/2 

aber ich brauche 180-alpha rechts zu bewegen

beta = 180 - aplha = 180 - (180 - 360/repeat)/2 

Jetzt width

(und später links zu bewegen)
cos(alpha) = (lengt/2)/width 

so

width = (lengt/2)/cos(alpha) 

Da Python verwenden radians in cos() so brauche ich

width = (length/2)/math.cos(math.radians(alpha)) 

Jetzt habe ich beta und width so kann ich Startpunkt bewegen und Form zentriert werden.

from turtle import * 
import math 

# --- functions --- 

def draw_shape(length, repeat): 

    angle = 360/repeat 

    # move start point 

    alpha = (180-angle)/2 
    beta = 180 - alpha 

    width = (length/2)/math.cos(math.radians(alpha)) 

    #color('red') 
    penup() 

    right(beta) 
    forward(width) 
    left(beta) 

    pendown() 
    #color('black') 

    # draw "almost" circle 

    for i in range(repeat): 
     forward(length) 
     left(angle) 

# --- main --- 

draw_shape(80, 12) 

penup() 
goto(0,0) 
pendown() 

draw_shape(50, 36) 

penup() 
goto(0,0) 
pendown() 

draw_shape(70, 5) 

penup() 
goto(0,0) 
pendown() 

exitonclick() 

Ich links rot width auf Bild.

enter image description here

0

Ich bewundere @furas' Erklärung und Code, aber ich vermeiden math. Um zu zeigen, dass es immer ein andere Art und Weise über ein Problem zu gehen, hier ist ein Mathe-freie Lösung, die die gleiche konzentrische Polygone erzeugt:

from turtle import Turtle, Screen 

def draw_shape(turtle, radius, sides): 

    # move start point 

    turtle.penup() 

    turtle.sety(-radius) 

    turtle.pendown() 

    # draw "almost" circle 

    turtle.circle(radius, steps=sides) 

turtle = Turtle() 

shapes = [(155, 12), (275, 36), (50, 5)] 

for shape in shapes: 
    draw_shape(turtle, *shape) 
    turtle.penup() 
    turtle.home() 
    turtle.pendown() 

screen = Screen() 
screen.exitonclick() 

enter image description here