Turtel python?


17.05.2021, 19:54

Bzw wie kann ich Zeichnen eines zufällig großen, zufällig auf dem Schirm verteilten Tannebaums, der aus einem Stamm und drei übereinander angeordneten, kleiner werdenden Dreiecken besteht machen?

 

regex9  12.05.2021, 15:56

Wie sieht dein eigener Ansatz aus? Wie würdest du selbst in Einzelschritten einen Baum zeichnen?

Anastasia354 
Fragesteller
 12.05.2021, 16:32

Weiß ich ja nicht

1 Antwort

Teile die Aufgabe in viele Einzelschritte auf.

Du brauchst ein Viereck für den Stamm und drei Dreiecke. Also schau erst einmal, wie du ein Viereck und ein Dreieck zeichnen kannst. Turtle stellt dafür einfache Funktionen bereit (forward, left, right, ...). Sie werden alle in der Dokumentation aufgelistet und beschrieben.

Mit welchen Längen je Seite du die Formen zeichnest, ist vorerst egal. Im Vordergrund sollte erst einmal stehen, dass du sie überhaupt irgendwie zeichnen kannst.

Sobald du das geschafft hast, kommt der nächste Schritt: Die Formen so zeichnen, sodass sie richtig positioniert werden. Mit penup und pendown kannst du den Zeichenstift heben und senken. So lange er gehoben ist, wird auch nichts gezeichnet.

Mit einem gedanklich gesetzten Ankerpunkt fällt es womöglich noch einmal leichter. Er kann als neuer Koordinatenursprung dienen (= lokales Koordinatensystem). Du kannst seine Position frei wählen. Sinn macht er bspw. im Zentrum oder in der linken oberen Ecke des Tannenbaums (wenn man sich einmal vorstellt, der Baum würde noch einmal von einem Viereck eng umspannt werden, welches exakt so hoch und so breit ist, wie der Baum in seinen größten Ausmaßen selbst). Wenn du zeichnest, würdest du folgendermaßen immer von diesem Ankerpunkt ausgehen und auf dessen Basis die Startkoordinaten für deine Formen berechnen.

Wenn später festgelegt werden soll, wo der Baum gezeichnet werden soll, brauchst du nur die Koordinaten des Ankerpunkts festlegen.

Beispiel: Der Ankerpunkt liegt horizontal mittig und vertikal an der obersten Kante (y = 0). Es soll eine horizontal zentrierte Linie der Länge 200px gezeichnet werden, die relativ zum Ankerpunkt vertikal um 10px nach unten verschoben ist.

In einem Koordinatensystem könnte man dies so darstellen:

                  |
                  |
<-----------------A-------------------------->
                  |
        S-------------------E
                  |

S = Startpunkt der Linie
E = Endpunkt der Linie
A = Ankerpunkt / Koordinatenursprung

Code:

length = 200
startX = anchorX - length / 2
startY = anchorY - 10

turtle.penup()
turtle.setposition(startX, startY)

turtle.pendown()
turtle.forward(length)

Das heißt also, dass der Startpunkt der Linie horizontal bei -100 und vertikal -10 (beide Angaben relativ zum Ankerpunkt) starten muss. Der Stift wird zu dieser Koordinate bewegt und die Linie gezeichnet.

In diesem Schritt kommst du somit auch zu dem Punkt, mit Variablen und mathematischen Operatoren arbeiten zu müssen. Du brauchst mindestens die Höhe und Breite des Tannenbaums. Dazu müsstest du berechnen, wie sich die einzelnen Formen diesen Platz (prozentual) aufteilen.

Letzten Endes brauchst du also die üblichen mathematischen Formeln:

  • Dreisatz (zur Berechnung der Höhe und Breite des Stamms sowie der Höhe der Dreiecke und der Länge ihrer Hypotenusen)
  • Berechnung der Seitenlängen der Dreiecke, wenn nur Hypotenuse und Höhe bekannt sind

Suche erst mathematische Lösungswege, fernab von Python und turtle. Die Dreiecke kann man bspw. jeweils in zwei rechtwinklige Dreiecke aufteilen. Dann kennt man schon die Innenwinkel (180° - 90° - 2x = 0) und die Längen der Katheten (Höhe, Hypotenuse des kompletten Dreiecks / 2). Die Hypotenuse lässt sich mit dem Satz des Pythagoras berechnen.

Wie so oft dazu der Tipp: Skizziere es dir separat auf Blatt Papier / in MS Paint / o.ä.. Eine visuelle Darstellung erleichtert das Finden der Lösung meist erheblich.

Bzw wie kann ich Zeichnen eines  zufällig großen, zufällig auf dem Schirm verteilten Tannebaums, (...) machen?

Für Zufallszahlen kannst du das random-Modul importieren.

In diesem Beispiel würde eine Zahl zwischen 0 (inklusiv) und 9 (inklusiv) generiert werden.

import random

print(random.randint(0, 9))

Für deinen Baum bräuchtest du vier unterschiedliche Zufallswerte.


Anastasia354 
Fragesteller
 19.05.2021, 13:15
# Python program to draw a tree using turtle
# Importing required modules
import turtle
import math


# Function to draw rectangle
def drawRectangle(t, width, height, color):
    t.fillcolor(color)
    t.begin_fill()
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.forward(width)
    t.left(90)
    t.forward(height)
    t.left(90)
    t.end_fill()

    
# Function to draw triangle    
def drawTriangle(t, length, color):
    t.fillcolor(color)
    t.begin_fill()
    t.forward(length)
    t.left(135)
    t.forward(length / math.sqrt(2))
    t.left(90)
    t.forward(length / math.sqrt(2))
    t.left(135)
    t.end_fill()

    
# Set the background color
screen = turtle.Screen ( )
screen.bgcolor("skyblue")


# Creating turtle object
tip = turtle.Turtle()
tip.color ("black")
tip.shape ("turtle")
tip.speed (2)


# Tree base
tip.penup()
tip.goto(100, -130)
tip.pendown()
drawRectangle(tip, 20, 40, "brown")


# Tree top
tip.penup()
tip.goto(65, -90)
tip.pendown()
drawTriangle(tip, 90, "lightgreen")
tip.penup()
tip.goto(70, -45)
tip.pendown()
drawTriangle(tip, 80, "lightgreen")
tip.penup()
tip.goto(75, -5)
tip.pendown()
drawTriangle(tip, 70, "lightgreen")

wie macht man dann daraus das hier:

  • zufällige Größe und Positionierung der Bäume
  • Benutzer gibt selbst die Anzahl der Bäume an

Danke im Vorfeld! :)

0
regex9  20.05.2021, 22:56
@Anastasia354

Zu Ersterem habe ich m.E. ausreichend geschrieben. Für Zweiteres gibt es Schleifen.

0