Wie mache ich geschachtelte Polygone in Python?
Hallo Leute,
ich bin frisch was Python angeht und versuche Scratch Figuren in Python zu machen. Ich habe aber Probleme das Schaubild (siehe unten) nachzumachen. Ich hab beide Formen schon, nur schaffe ich es nicht ein verschachteltes Polygon zu machen. Ich wäre euch dankbar, wenn ihr mir erklärt, was im Code falsch ist.
Hier der Code:
import turtle
turtle.speed(2)
eckenzahl=4
for i in range(4):
turtle.forward(100)
turtle.right(90)
for i in range(3):
turtle.left(120)
turtle.back(100)
for s in range(100):
turtle.forward(100)
turtle.right(60)
eckenzahl=eckenzahl+1 #Anzahl der Polygone wird um 1 erhöht
2 Antworten
Die ersten zwei for-loops kannst du weglassen, der eine malt einen Würfel und der andere ein Dreieck, die brauchst du nicht.
Und bei deinem dritten, der wichtig ist, machst du halt immer nur
turtle.right(60)
deswegen malt es dir hundert mal die selbe Figur. 60 Grad ergibt immer ein 6-Eck, da 360/60 = 6, er kann sich also 6 mal drehen bis er wieder am start ist, macht also 6 Linien. Du erhöhst die Eckenzahl zwar, verwendest sie jedoch nicht.
Um welchen Winkel sich der Turtle dreht muss abhängig von der Eckenzahl sein. Wenn man etwas nachdenkt kommt man auf einen Winkel von 360/eckenzahl. (Siehe Rechnung im letzten Absatz)
So ist der Code richtig:
import turtle
turtle.speed(2)
eckenzahl=4
for shape in range(10):
for edge in range(eckenzahl):
turtle.forward(100)
turtle.right(360/eckenzahl)
eckenzahl=eckenzahl+1 #Anzahl der Polygone wird um 1 erhöht
Du kannst natürlich den äußeren For-Loop direkt für die Eckenanzahl verwenden, dann musst du sie nicht selbst anlegen und erhöhen.
Credit: ralphdieter`s Antwort.
import turtle
turtle.speed(2)
for eckenzahl in range(4, 11):
for edge in range(eckenzahl):
turtle.forward(100)
turtle.right(360/eckenzahl)
for i in range(4): # 4 = Eckenzahl
turtle.forward(100) # 100 = Seitenlänge (konstant)
turtle.right(90) # 90 = Innenwinkel
Das ergibt ein Viereck. Schön ist, dass die Kröte danach wieder an der Ausgangsposition sitzt und in die gleiche Richtung schaut. Du könntest die 4 durch die Variable eckenzahl ersetzen. Die Seitenlänge bleibt immer 100, aber der Winkel ändert sich mit der Eckenzahl. Die allgemeine Formel dafür ist 360/eckenzahl.
________
for i in range(3):
turtle.left(120)
turtle.back(100)
Das zeichnet ein Dreieck. Wozu denn?
________
for s in range(100):
...
eckenzahl=eckenzahl+1 #Anzahl der Polygone wird um 1 erhöht
Eine Schleife ist ja schon mal gut. Aber wozu brauchst Du s? Nimm doch gleich eine Schleife mit eckenzahl in range(4, 11). Dann versteht man den Code besser.
Und in diese Schleife kannst Du nun die verallgemeinerte Schleife von oben einbauen. Alles klar?
range(100) zählt von 0 bis 99.
range(4, 11) zählt von 4 bis 10.
range(1, 20, 5) zählt von 1 bis unter 20 in Fünferschritten (1, 6, 11, 16).
Aber ich habe mich verzählt: Das äußerte Vieleck in Deinem Bild hat 13 Ecken. Also
for eckenzahl in range(4, 14):
Schön ist, dass die Kröte danach wieder an der Ausgangsposition sitzt und in die gleiche Richtung schaut.
So sollte es zumindest sein. Ich könnte mir vorstellen, dass das mit zunehmender Eckenzahl durch Rundungsfehler nicht mehr gegeben ist.
Wenn es also ungenau wird, würde ich Startpunkt und -richtung jedes Mal neu setzen.
Danke für die Hilfe erstmal, nur weiß ich nicht wofür range(4,11)steht...ich könnt mir vorstellen, dass die 4 sich auf die Seiten, des Vierecks bezieht, aber die 11 weiß ich nicht.