2016-10-24 1 views
1

Hoffentlich kann ich das gut erklären. Ich verwende zur Zeit Hilfsfunktionen, um einen sechsstrahligen Stern im Turtle-Grafikfenster von Python zu zeichnen. Zuerst mussten wir eine Funktion erstellen, um ein Dreieck zu zeichnen. Hier ist mein Code:Verwenden von Turtle in Python zum Zeichnen von sechsspitzigen Sternen mit unterschiedlichen Seitenlängen

import turtle 

    wn = turtle.Screen() 
    tess = turtle.Turtle() 
    tess.speed(30) 


    def triangle(sz): 
     for i in range(3): 
     tess.fd(sz) 
     tess.lt(120) 

Dann mussten wir die Dreiecksfunktion verwenden, um einen sechszackigen Stern zu zeichnen. Hier ist mein Code:

def sixPtdStar(sz): 
     triangle(sz) 
     tess.lt(90) 
     tess.pu() 
     tess.fd(80) 
     tess.rt(90) 
     tess.fd(120) 
     tess.pd() 
     tess.rt(180) 
     triangle(sz) 

Nun, für mich läuft das alles reibungslos. Aber die Parameter für unseren Testlauf dieser beiden Funktionen waren: sz = 120 (also würden wir in der Shell sixPtdStar (120) eingeben und es würde laufen. Aber dann mussten wir eine Reihe von Sternen mit einer neuen Funktion zeichnen, und . dann eine BOX Umriss von diesen Reihen von Sternen, in einer anderen Funktion Hier ist mein Code:

def rowOfStars(numInRow,sz): 
     for i in range(numInRow): 
      sixPtdStar(sz) 
      tess.pu() 
      tess.lt(90) 
      tess.fd(80) 
      tess.lt(90) 


    def sqrOfRows(numInRow, sz): 
     for i in range(4): 
      rowOfStars(numInRow, sz) 
      tess.rt(90) 

Während dies die Aufgabe erfüllt, nur tut sie dies, wenn die sz = 120. Und für unsere Testlauf auf den rowOfStars Funktion, die Parameter sollen (6, 72) sein und für den Testlauf auf der sqrOfRows-Funktion sollen unsere Parameter sein (6, 36).

Also mein Problem ist das. Wie kann ich das machen Arbeit egal was Sz gleich ist Wenn ich es so laufen lasse (mit (6, 72) für rowOfStars oder (6, 36) f oder sqrOfRows), der Stift bewegt sich zu weit, weil die Dreiecke nicht mehr so ​​groß sind.

Bitte lassen Sie mich wissen, wenn mehr Informationen benötigt werden! Vielen Dank! (Ich benutze Python 3.5.2)

+0

Danke alle so sehr. Ich wusste, dass das Hauptproblem in der Skalierung meiner Formen lag, weil ich den Stift so bewegt hatte, dass er in die "richtige" Position kam. Und auch Danke für die kleinen Verbesserungen und Ratschläge hier und da, wie zB "Schnellster" anstatt einer Nummer! Ich bin sehr dankbar!! – maio123maio

Antwort

0

überall verwenden Sie eine Einheit, die eine Dimension hat:

tess.fd(80) 
tess.fd(120) # probably should be tess.fd(sz) 
tess.fd(80) 

Sie müssen es skalieren, was immer Logik, die Sie verwendet von 120 (sz) bis 80. Jedoch zu bekommen, wie @wptreanor erwähnt, dass Logik ist leicht fehlerhaft, da die Punkte auf dem Stern sind uneben:

enter image description here

auch Ihre rowOfStars() Routine nicht wirklich eine Reihe von Sternen ziehen (Mathe ist aus und der Stift ist im falschen Zustand zu Zeiten .) Einfaches Reparieren der Skalierung geht nicht repariere das. Schließlich funktioniert Ihre sqrOfRows() Routine nicht, bis rowOfStars() behoben ist, und um es nützlich zu machen, müssen Sie die Startposition auf dem Bildschirm anpassen, um Platz für die Zeichnung zu schaffen.

Unten ist meine Überarbeitung Ihres Codes, um einige dieser Probleme zu beheben.Es verwendet eine etwas andere Berechnung, wie aus dem Finish der unteren zum Start das obere Dreieck zu positionieren, so dass die Zahlen etwas anders sind:

from turtle import Turtle, Screen 

WIDTH_RATIO = 2 * 3**0.5/3 # ratio of widest point in star to edge of triangle 

def triangle(size): 
    for i in range(3): 
     tess.fd(size) 
     tess.lt(120) 

def sixPtdStar(size): 
    triangle(size) 
    tess.lt(30) 
    tess.pu() 
    tess.fd(size * WIDTH_RATIO) 
    tess.lt(150) 
    tess.pd() 
    triangle(size) 

def rowOfStars(numInRow, size): 
    for i in range(numInRow): 
     sixPtdStar(size) 
     tess.pu() 
     tess.lt(90) 
     tess.fd(size * WIDTH_RATIO/2) 
     tess.lt(90) 
     tess.pd() 

def sqrOfRows(numInRow, size): 
    tess.pu() 
    halfSize = numInRow * size/2 
    tess.goto(-halfSize, halfSize) # center on screen 
    tess.pd() 

    for i in range(4): 
     rowOfStars(numInRow, size) 
     tess.rt(90) 

screen = Screen() 
tess = Turtle() 
tess.speed("fastest") # numbers > 10 are all equivalent, safer to use symbols 

sqrOfRows(6, 36) 

screen.exitonclick() 

enter image description here

0

Das Problem ist in Ihrer sixPtdStar() Funktion.

def sixPtdStar(sz): 
    triangle(sz) 
    tess.lt(90) 
    tess.pu() 
    tess.fd(80) # here 
    tess.rt(90) 
    tess.fd(120) # and here 
    tess.pd() 
    tess.rt(180) 
    triangle(sz) 

Wenn Ihre Funktion eine Größe als Parameter übernimmt, werden alle Funktionen mit Bewegung (wie forward() oder goto()) müssen auch durch die Größe skaliert werden. Der folgende Code sollte funktionieren:

def sixPtdStar(sz): 
    triangle(sz) 
    tess.lt(90) 
    tess.pu() 
    tess.fd((2.0/3.0)*sz) #formerly 80 
    tess.rt(90) 
    tess.fd(sz) #formerly 120 
    tess.pd() 
    tess.rt(180) 
    triangle(sz) 

Dadurch wird sichergestellt, dass alle Vorwärtsbewegungen auf die Größe des Objekts proportional sind Sie erstellen. Sie müssen ähnliche Verbesserungen an Ihrer rowOfStars() Funktion vornehmen. Ich habe auch bemerkt, dass dein sechsstrahliger Stern nicht vollständig symmetrisch ist. Sie könnten das beheben, indem Sie tess.fd((2.0/3.0)*sz) durch tess.fd((7.0/12.0)*sz) ersetzen.

+0

Ich nehme an, Sie nähern sich sqrt (3)/3, also (15.0/26.0) sollte näher und doch einfach sein. Oder das OP könnte die Rechnung machen: test.fd (sz * 3 ** 0.5/3) – cdlane

Verwandte Themen