s n h m r u
i

Anwendung - Streckenzüge

Geometrische Figuren als Streckenzüge

In den folgenden Aufgaben geht es um die Verwaltung geometrischer Figuren. Eine Figur wird dabei als geschlossener Streckenzug festgelegt, d.h. als Folge von Anweisungen der folgenden Art:

  • F: Gehe um eine bestimmte Anzahl Längeneinheiten vorwärts.
  • L: Drehe dich um eine bestimmte Gradzahl nach links.
  • R: Drehe dich um eine bestimmte Gradzahl nach rechts.

Nach Abarbeiten der Anweisungen wird der Streckenzug (auch ohne explizite Anweisung) geschlossen, d.h. eine Verbindung zum Startpunkt gezogen.

Beispiel:

Streckenzug als Folge von Anweisungen[1]

Im Folgenden wird das Python-Modul turtle verwendet. Ein Überblick dazu befindet sich im Kapitel Exkurs - Turtle-Grafik.

Aufgabe 1

(a) Teste das vorgegebene Programm. Was bedeuten die einzelnen Parameter des Konstruktors der Klasse Streckenzug?

(b) Erweitere die Szene um einen weiteren Baum bestehend aus einem Rechteck und einem Dreieck.


from turtle import *

# Klasse Streckenzug
class Streckenzug(object):

    def __init__(self, start, beschreibung):
        self.start = start
        self.beschreibung = beschreibung

    def __str__(self):
        text = "Streckenzug bei (" + str(self.start[0]) + "|" + str(self.start[1]) + "), " + str(self.start[2]) + "°"
        return text

    def zeichnen(self):
        penup()
        goto(self.start[0], self.start[1])
        setheading(self.start[2])
        pendown()

        for angabe in self.beschreibung:
            befehl = angabe[0]
            wert = float(angabe[1:])
            if befehl == "F":
                forward(wert)
            elif befehl == "L":
                left(wert)
            elif befehl == "R":
                right(wert)

        goto(self.start[0], self.start[1])
        setheading(self.start[2])

# Zeichnen der Szene
reset()
speed(0)

z  = Streckenzug((-80, -100, 90), ["L40", "F120", "R40", "F40", "R110", "F100"])
r  = Streckenzug((-90, -10, 90),  ['F20', 'L90', 'F40', 'L90', 'F20'])
d  = Streckenzug((-100, 30, 90),  ['F40', 'L100', 'F100'])
s1 = Streckenzug((70, 250, 90),   ['R20', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140'])
s2 = Streckenzug((-40, 220, 90),  ['R20', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140', 'F30', 'L50', 'F30', 'R140'])
n  = Streckenzug((0, 0, 90),      ['F100', 'L135', 'F141.4', 'L225', 'F100', 'L135', 'F70.7', 'L90', 'F70.7', 'L45', 'F100', 'L135', 'F141.4', 'L225', 'F100'])

figuren = [z, r, d, s1, s2, n]
for figur in figuren:
    figur.zeichnen()

Aufgabe 2

Die Klasse Rechteck erbt von Streckenzug:


# Klasse Streckenzug
class Streckenzug(object):
    ...

# Klasse Rechteck
class Rechteck(Streckenzug):

    def __init__(self, start, a, b):
        self.breite = a
        self.laenge = b

        beschreibung = ["F" + str(self.breite), "L90", "F" + str(self.laenge), "L90", "F" + str(self.breite)]
        Streckenzug.__init__(self, start, beschreibung)

    def __str__(self):
        text = "Rechteck bei (" + str(self.start[0]) + "|" + str(self.start[1]) + "), " + str(self.start[2]) + "°"
        return text

    def getBreite(self):
        return self.breite

    def getLaenge(self):
        return self.laenge

(a) Erzeuge einige Objekte der Klasse Rechteck.

(b) Ergänze Methoden zur Berechnung von Flächeninhalt und Umfang des Rechtecks (Vgl. Klassendiagramm).

Klassendiagramm Rechteck und Dreieck

(c) Entwickle entsprechend die Klasse Dreieck, welche von Streckenzug erbt. Hierzu einige Tipps:

  • Berechnung eines Winkels (hier Alpha) mit Hilfe des Kosinussatzes in Python: alpha = degrees(acos((b * b + c * c - a * a) / (2 * b * c))). Damit dies funktioniert, musst du from math import * dem Programm voranstellen.
  • Eine Formel zur Berechnung der Dreiecksfläche aus den drei Seitenlängen findest du hier.

Aufgabe 3

Entwickle weitere Klassen, welche von Streckenzug erben. Hier einige Vorschläge:

Orientiere dich bei folgenden Aufgaben am untenstehenden Klassendiagramm.

(a) Entwickle eine Klasse Quadrat, welche von Rechteck erbt.

(b) Entwickle eine Klasse GleichschenkligesDreieck, welche von Dreieck erbt sowie eine Klasse GleichseitigesDreieck, welche von GleichschenkligesDreieck erbt.

(c) Verdeutliche am Klassendiagramm die Begriffe Spezialisierung und Generalisierung.

Klassendiagramm weitere Figuren

Quellen

Suche

v
7.2.3.8.5
inf-schule.de/oop/python/bank/vererbung/anwendungstreckenzuege
inf-schule.de/7.2.3.8.5
inf-schule.de/@/page/osw4yktyPOCD4WbU

Rückmeldung geben