3 Hausaufgabe Allgemeines zu allen Aufgabenblöcken: • Lesen Sie den jeweils einleitenden Aufgabentext und die Aufgabenstellung genau. Damit Sie erläuternden Text von den Aufgabenstellungen schnell unterscheiden können, sind die Aufgabentexte optisch durch einen Randbalken hervorgehoben. Pflichtaufgaben sind mit dickem Randbalken, freiwillig zu bearbeitende Aufgaben mit einem dünnen Seitenstrich markiert. • Bearbeiten Sie die Aufgaben zügig. Sollten sich bei der Bearbeitung Schwierigkeiten ergeben, die Sie nicht selber lösen können, so befragen Sie Ihren Betreuer (Hiwi) und bitten Sie ihn um Hilfestellung oder ergänzende Erläuterungen! Sie sollten sich nicht “stundenlang” an einem Problem “festbeißen”! • Lesen Sie in der angegebenen/empfohlenen Literatur und in unserem “Einführungstext” nach eigenem Ermessen zu den im folgenden angegebenen Inhalten des Aufgabenblocks. Inhalt dieser Teilaufgabe, Hinweise zu Informationsquellen: • Java: Erzeugen, Lebensyzyklus und Zugriff auf Objekte, primitive Datentypen S. dazu im EIP-Begleittext, Kap. 10 (gesamt) • Java: objektorientierte Programmierung S. dazu im EIP-Begleittext, Kap. 14.1 bis 14.6 inkl. • Java: Klassen, Objekt/Instanz, Zugriff auf Methoden und Attribute S. dazu im EIP-Begleittext, Kap. 12 bis 12.5 inkl • Java: Vererbung, Super-/Basisklasse, Subklasse, Erweitern einer Klasse, Ergänzen von Instanzvariablen, Überschreiben von Methoden S. dazu im EIP-Begleittext, Kap. 14 bis 14.6 inkl. • Java: Konstruktoren S. dazu im EIP-Begleittext, Kap. 12.7 und 14.5 • Java: Der Verweisoperator super S. dazu im EIP-Begleittext, Kap. 14.4 • Java: (in Wdh.) Kontrollstrukturen: if-Verzweigung, for-Schleife S. dazu im EIP-Begleittext, Kap. 9.5 und 9.7.3, 1 • Java: (neu) Kontrollstrukturen: while- und do while-Schleife S. dazu im EIP-Begleittext, Kap. 9.7.1 und 9.7.2 • Java: Nutzen der in einem java package vorliegenden Klasse Random S. dazu auch im EIP-Begleittext, Kap. 15 Anmerkung: Informieren Sie sich zu den soweit erwähnten Inhalten, insbesondere aber zur Vererbung, Erweiterung (extension) von Klassen, zum Überschreiben von Methoden, dem Verweisoperator super und der Nutzung von Konstruktoren auch in der Ihnen ergänzend verfügbaren Literatur! TA 3.1 Legen Sie zur Bearbeitung und Strukturierung Ihrer Lösungen unter Ihrem directory AB3 6 weitere directories TA1,...,TA6 an und sortieren Sie Ihre Quellen und Ergebnisse entsprechend ein. Bisher wurden Klassen als Mittel genutzt, um Daten und Verhalten als eine Einheit zu konzipieren. Die objektorientierte Methodik wird aber erst dadurch zu einem mächtigen Werkzeug, weil sie es erlaubt, mehrere Klassen, die ähnliche Aufgaben haben, zu einer abstrakteren Klasse (der sogen. “Basisklasse”, oder auch “Superklasse”) zusammenzufassen. In der Superklasse sind dann die Daten und Verhaltensweisen implementiert, die in jeder speziellen Klasse gleich sind. Somit müssen sie in den speziellen (oder “Sub-“)Klassen nicht wiederholt niedergeschrieben werden, sondern werden von der Superklasse übernommen (vererbt). Das folgende Beispiel soll verdeutlichen, wie in Java durch Vererbung eine (abgeleitete) Subklasse erzeugt wird, d.h. eine neue Klasse definiert wird, die auf einer bereits bekannten Klasse basiert. Prinzipiell kann dabei die neue Subklasse eine Erweiterung und/ oder Spezialisierung ihrer Superklasse sein, d.h. z.B. neue Elemente wie Instanzvariablen oder neue Methoden beinhalten, die dann die Eigenschaften/Fähigkeiten der Superklasse erweitern. Sie kann aber auch eine in der Superklasse vorhandene Methode “überschreiben”, sie abändern. Wir wollen uns dieser objektorientierten Techniken bedienen, um aus der vorhandenen Superklasse Turtle eine neue Subklasse TurnTurtle abzuleiten, die in der Lage ist (über das in Turtle schon konzipierte hinaus) die 2 Summe der Turtle-Drehungen in einem Gesamtdrehwinkel abzuliefern. Anmerkung: Die Superklasse Turtle ist die von uns im eip-package gegebene Klasse, in der die turtle-Befehle (methods) auf eine Instanz (also ein Objekt) von turtle angewendet werden. In der Erweiterung soll sich der Gesamtdrehwinkel additiv aus den einzelnen Drehwinkeln rt(angle) und lt(angle) der Turtle ergeben. Ein rechts gedrehter Winkel zählt positiv, ein links gedrehter negativ, sodaß sich der Gesamtdrehwinkel als Summe der insgesamt absolvierten Rechtsdrehung ergibt (in unserem Screen-Koordinatensystem zeigt nämlich x nach rechts positiv und y nach unten positiv). Zur programmtechnischen Realisierung werden in der Subklasse TurnTurtle die folgenden “Ergänzungen” zur Superklasse Turtle benötigt: • Die Erweiterung der Superklasse wird definiert, indem im Klassenkopf der neuen Subklasse das Symbol extends <Superklasse> { ... } angefügt wird, also hier z.B.: public class TurnTurtle extends Turtle { ... }. • Es wird eine Variable (vom Typ double) eingeführt, in der die Summe aller einzelnen Drehungen der Turtle als Gesamtdrehwinkel totalAngle gespeichert werden kann. Anmerkung: Wird in Java ein Objekt einer Klasse angelegt, so wird für eine einfache Variable (wie totalAngle) automatisch ein Speicherplatz angelegt und dieser (default) auf 0.0 initialisiert. Soll im Rahmen eines Programms (wie hier) der Gesamtdrehwinkel evtl. des öfteren neu berechnet werden, so muss es eine Methode in der Klasse geben, den Winkel bei Aufruf erneut auf 0.0 zu initialisieren (das übernimmt hier die Methode resetAngle() ). • Zum o.g. Initialisieren des Gesamtdrehwinkels totalAngle auf den Wert 0.0 wird die Methode resetAngle() angelegt mit: totalAngle = 0.0; • Eine weitere Methode getTotalAngle() wird angelegt, um den ermittelten Gesamtdrehwinkel aller Drehungen zurückzugeben durch: return totalAngle;. • Die Methoden rt(angle) und lt(angle) der Superklasse Turtle sollen im Rahmen der Vererbung um das Aufsummieren der Winkel erweitert (besser “überschrieben”) werden. Dazu werden die Methoden mit gleichem Namen und mit gleicher Parameterliste wie in der Superklasse definiert. Das Aufsummieren der Winkel übernehmen bei rechtsdrehender turtle die Anweisung totalAngle += angle; und bei 3 linksdrehender turtle die Anweisung totalAngle -= angle; Anmerkung: Die verkürzende Schreibweise totalAngle += angle; bedeutet in Java: totalAngle = totalAngle + angle; entsprechende Bedeutung hat die Variante mit dem Minus-Zeichen. In den überschriebenen Methoden rt(angle) und lt(angle) werden mit dem Verweisoperator super die Methoden rt(angle) und lt(angle) der Superklasse Turtle aufgerufen (die ja unverändert weiterhin gebraucht werden). Anmerkung: Nach den Regeln des Überschreibens wird bei Methoden mit gleichem Kopf in der Super- und Subklasse stets die Methode der Subklasse verwendet. Durch die Benutzung des Superklassenverweises super wird diese Regel außer Kraft gesetzt und der Zugriff auf sonst verdeckte Attribute der Superklasse möglich. • Überschreibt eine Subklasse eine Superklasse, so werden die Konstruktordefinitionen nicht übernommen. Sie müssen explizit aufgerufen werden. Anmerkung: Im Sinne einer klaren Programmstrukturierung ist es zweckmäßig, die Anweisungen zur Bildung des Anfangszustandes (Speicherzuteilung und Initialisierung) in einer eigenen Methode zusammenzufassen. Java bietet hierfür eine spezielle Methode, den sogen. Konstruktor. Konstruktoren können - wie Methoden - parametrisiert sein und somit die Übergabe der Initialisierung via aktueller Parameter gestatten. Formal muß ein Konstruktor den Namen wie die Klasse besitzen, zu der er gehört. Er liefert als Ergebnis stets einen Verweis auf das neu erzeugte Objekt an die Aufrufstelle. Mit super(screen); wird hier aus der Subklasse der Konstruktor der Superklasse Turtle aufgerufen, so wie (s.o.) allgemein verdeckte Attribute der Superklasse durch die Benutzung des Superklassenverweises super aus der Subklasse heraus realisiert werden. Ergänzend wird die Instanzvariable totalAngle initialisiert per Aufruf von resetAngle(); KlasseTurnTurtlea a http://www.wire.tu-bs.de/EIP/ha/ha3/TurnTurtle.java oder im Pool unter ∼/EIP/ha/ha3/TurnTurtle.java 4 ProgrammExample31a a http://www.wire.tu-bs.de/EIP/ha/ha3/Example31.java oder im Pool unter ∼/EIP/ha/ha3/Example31.java 5 Aufgaben: 1. Verdeutlichen Sie sich die Funktionsweise des Programms Example31, das den gesamt Drehwinkel der Turtle beim Umlaufen eines Dreiecks ermittelt. Anm.: Mit final wird in Java eine nicht änderbare Konstante definiert (s. Zeile: public static final int SIDELENGTH = 150;) In der Methode main wird - wie bisher - ein Objekt ts des turtlescreen angelegt, in dem sich aber nun eine turtle bewegt, die nicht mehr der Klasse Turtle sondern der erweiterten Klasse TurnTurtle entstammt. Damit werden deren Methoden in main nutzbar (resetAngle, getTotalAngle und die erweiterten rt und lt). Beachten Sie - auch im weiteren Verlauf der Teilaufgaben - , daß die selbst geschriebenen Superklassen für abgeleitete Klassen vom Java BytecodeInterpreter gefunden werden können, d.h. im CLASSPATH aufgenommen sind. 2. Um die Arbeitsweise des Example31 genauer zu erfahren, lassen Sie die Turtle jeweils um ein nEck (mit n = 3, 6, 12) (s. Aufgabenblock 2, TA 2.2), entlang einem doodle (s. Aufgabenblock 1, TA 1.6) und entlang der Koch-Kurve (s. Aufgabenblock 2, TA 2.3) laufen und dabei den gesamt umlaufenen Drehwinkel ermitteln. Anm.: Ziehen Sie dazu die in den Aufgabenblöcken TA 2.2, 1.6 und TA 2.3 erarbeiteten Programmsequenzen (Methoden) zum Umlaufen entsprechender Figuren hinzu. 3. Um zu verdeutlichen, wie man mittels wiederholter Vererbung die Eigenschaften/Fähigkeiten einer Klasse immer weiter ergänzen und ausbauen kann, dient die folgende Aufgabe (und die freiwillige Zusatzaufgabe TA 3.6), die schrittweise (aufeinander aufbauend) gelöst werden. Hier soll erst einmal die Fähigkeit der Klasse TurnTurtle (bislang aus den Methoden rt(angle) und lt(angle) mit erweiterter Berechnung des Gesamtdrehwinkels ) durch Vererbung so erweitert werden, daß eine neue Klasse PathTurnTurtle entsteht, die zusätzlich auch die Gesamtlänge der zurückgelegten Wegstrecke aufsummiert. Analog dem Vorgehen bei der Konstruktion der Subklasse TurnTurtle müssen beim Ableiten der Subklasse PathTurnTurtle eine neue Instanzvariable (double totalPath;) zur Speicherung des Gesamtweges angelegt werden und die Methoden fd und bk um das Aufsummieren der Strecken erweitert werden und neue Methoden zum Initialisieren bzw. Rückgeben der Gesamtweglänge (resetPath, getTotalPath) ergänzt werden. Schreiben Sie ergänzend (entspr. Example31) ein passendes Programm, das mit der Klasse PathTurnTurtle arbeitet. 6 In der frewiwilligen Zusatzaufgabe TA 3.6 mögen Interessierte dann zudem (durch erneute extension) auch die beim Lauf umschlossene Fläche berechnen. TA 3.2 Das folgende Programmbeispiel dient im Wesentlichen dazu, Sie mit den Elementen bekannt zu machen, die für die Bearbeitung der nachfolgenden Aufgaben gebraucht werden: Dazu zählt die Steuerung der Turtle durch einen Zufallszahlengenerator. Er legt je Schritt zufällig den Winkel ihrer Drehung, die Länge der geradlinig zurückzulegenden Strecke oder auch beide fest. Hier im Beispiel dreht sich die Turtle zufällig in den Winkelbereichen LEFT und RIGHT von 20◦ um den Ausrichtungswinkel 0◦ bis 360◦ und vollführt nach jeder Drehung einen Schritt konstanter Länge. Für die zufällige Drehung wird die in Java vorgegebene Klasse Random genutzt. Ihre Instanzmethoden geben über nextDouble gleichverteilte Pseudo-Zufallszahlen im Bereich von 0.0 bis 1.0 vom Datentyp double zurück. Im Weiteren wird in diesem Programmbeispiel gezeigt, wie mit einer whileSchleife die Summe der Turtle-Bewegungen kontrolliert und terminiert wird. Nach Überschreiten einer maximal vorgegebenen Distanz der Turtle vom Startpunkt terminiert der Algorithmus. In Java stehen drei Schleifenvarianten zur Verfügung: • Die while-Schleife dient der Wiederholung von Anweisungen, solange ein logischer Ausdruck (Ergebnistyp boolean) wahr (true) ist, z.B.: sum = 0; anz = 1; while (anz <= 5) { sum = sum + anz; anz++; } Ist die Bedingung bereits bei der ersten Püfung “false”, so werden die Anweisungen im Rumpf der Schleife gar nicht ausgeführt. • In der for-Schleife kann ein Anweisungsblock mit einer bestimmten Anzahl von Wiederholungen bearbeitet werden (s. auch Aufgabenblock 1, 7 TA 1.3). Zu Beginn der Schleifenbearbeitung wird eine Zählervariable initialisiert, nach jedem Durchlauf (zumeist) um 1 erhöht/vermindert (Inkrement/Dekrement) bis schließlich die Wiederholungsbedingung nicht mehr greift. sum = 0; for (int anz = 1; anz <= 5; anz++) { sum = sum + anz; } In Java können im Initialisierungsteil und im Inkrementierungs- bzw. Dekrementierungsteil auch jeweils mehrere Anweisungen stehen. • In solchen Fällen, wo in einer Schleife statt einer “Eintrittsbedingung” von der Logik eine “Austrittsbedingung” benötigt wird, steht die dowhile Schleife zur Verfügung. In ihr wird der Rumpf mindestens einmal ausgeführt, z.B.: sum = 0; anz = 1; do { sum = sum + anz; anz++; } while (anz <= 5); Wird in Java eine Schleife benötigt, die einen Anweisungsblock solange wiederholt ausführt, bis eine bestimmte Bedingung erfüllt ist (im Sinne von: repeat ... until), so muß die Bedingung in der while-Sequenz negiert werden (Zeichen: !), z.B.: do { ... } while (!Bedingung);. Informieren Sie sich ergänzend über die Klasse Random im Paket java.util und über die in Java bereitgestellten Varianten von Schleifen. 8 KlasseRandomTurtlea a http://www.wire.tu-bs.de/EIP/ha/ha3/RandomTurtle.java oder im Pool unter ∼/EIP/ha/ha3/RandomTurtle.java ProgrammExample32a a http://www.wire.tu-bs.de/EIP/ha/ha3/Example32.java oder im Pool unter ∼/EIP/ha/ha3/Example32.java 9 Aufgaben: 1. Verdeutlichen Sie sich die Funktionsweise von Example32.java. Experimentieren Sie dazu mit einigen Parametern: Wählen Sie die maximalen Drehwinkelbereiche RIGHT und LEFT zu anderen Werten als den vorgegeben (z.B. 90, 90 oder 10, 10 und 40, 20) und/oder die maximale Entfernung vom Startpunkt MAXDIS zu größeren oder kleineren Werten als dem gegebenen Wert 400 und variieren Sie den Startpunkt der Turtle. 2. Modifizieren Sie (durch Abändern) das Beispielprogramm so, daß die geraden Strecken von ihrer Länge auch per Zufallszahlengenerator (im Bereich 1 bis 50) bestimmt werden. Wiederholen Sie dabei die Variationen der Drehwinkelbereiche RIGHT und LEFT der Turtle wie im vorangegangenen Aufgabenteil. Die Kontrollbedingung soll in dieser Modifikation im Gegensatz zur gezeigten abweisenden Schleife while(Bedingung) { ... } durch eine zumindest einmal durchlaufene Schleife do { ... } while (Bedingung); realisiert werden. Machen Sie sich den Unterschied in den Schleifenvarianten klar! 3. Fügen Sie schließlich eine andere Kontrollbedingung ein, die den Algorithmus dann terminiert, wenn die Turtle (wie bisher) eine vorgegebene maximale Distanz vom Startpunkt überschreitet (“Heimweh”) oder (ergänzend) eine Gesamtwegstrecke zurückgelegt hat, die ihre vorgegebene maximale Laufleistung übertrifft (“Ermüdung”) oder (ergänzend) einen maximal vorgegebenen Gesamt-Drehwinkelbereich als Folge aller einzelnen Drehungen überschreitet (“Schwindelgefühl”). 10 TA 3.3 In Erweiterung der Teilaufgabe 3.2 wird aus der zufällig sich drehenden und vorwärts laufenden Turtle eine nach dem (im Turtlescreen plazierten) Futter “suchenden” Turtle abgeleitet. Dabei soll die Turtle ihre Bewegungsstrategie nach der Intensität des Futtergeruchs richten. Die Intensität des Futtergeruchs wird dabei durch die Distanz zwischen Turtle und Futter simuliert (kurze Distanz: hoher Intensitätsgrad; weite Distanz: geringer Intensitätsgrad). Bei kürzer gewordener Distanz (entspricht steigender Geruchsintensität) fährt sie fort, geradewegs in gleicher Richtung zu gehen, bei größer gewordener Distanz (entspricht fallender Geruchsintensität), dreht sie sich zufällig in eine andere Richtung und fährt mit dem Suchprozeß fort. Die Klasse SmellTurtle besitzt zwei neue Methoden: smell(int foodx, int foody) zur Berechnung der Distanz zum Futter und smellStep(int foodx, int foody, double left, double right, double length, double disold)), eine Methode, die die Turtle bewegt und die Distanz zum Futter zurückgibt. 11 KlasseSmellTurtlea a http://www.wire.tu-bs.de/EIP/ha/ha3/SmellTurtle.java oder im Pool unter ∼/EIP/ha/ha3/SmellTurtle.java 12 ProgrammExample33a a http://www.wire.tu-bs.de/EIP/ha/ha3/Example33.java oder im Pool unter ∼/EIP/ha/ha3/Example33.java Aufgaben: 1. Machen Sie sich mit dem Beispiel Example33 und der SmellTurtle vertraut und experimentieren Sie mit einigen Parametern wie dem Verändern der Schrittweite, dem zugelassenen Drehwinkel und der Abstandsbedingung zum Erreichen des Futters. Gewinnen Sie einen Eindruck davon, wie sich die einzelnen Parameter (schmaler/breiter zugelassener Drehwinkel, Abstandsbedingung zum Erreichen des Futters etc.) im Mittel auf die Anzahl der von der Turtle benötigten Schritte, zurückgelegten Wegstrecken und durchlaufenen Drehwinkel auswirken. Schreiben Sie geeignete Ausgabeanweisungen. 2. Schreiben Sie nach ähnlichem Muster wie die gezeigte Futter suchende SmellTurtle eine Futter suchende SpähTurtle (engl. “PeerTurtle”). Diese PeerTurtle soll solange vorwärts gehen, wie das Futter in einem vorgegebenen Spähwinkel (gamma) um ihren momentanen Winkel der Ausrichtung β liegt. Entschwindet das Futter aus der Ausrichtung β± Spährichtung γ, so soll die PeerTurtle sich wie die Smellturtle zufällig drehen und den Suchprozeß fortsetzten. Wiederholen Sie die Experimente bezüglich der im Mittel benötigten Schritte, gesamt zurückgelegten Weglängen und Drehwinkel der Turtle bis zum Erreichen der Beute in Abhängigkeit von Parametern wie der Weite des Spähwinkels und der Abstandsbedingung zum Erreichen des Futters etc. Hinweise: Die folgende Abbildung verdeutlicht die Zusammenhänge zwischen den Winkeln α, β und γ: (0, 0): Ursprung des Turtle-screen-Koordinatensystems F : Ort des Futters T : Momentaner Standpunkt der Turtle (x1,y1) α: Momentaner Winkel zwischen Futter und Turtle β: Momentaner Ausrichtungswinkel der Turtle ±γ: “Spähwinkel” der Turtle (0,0) x x T - x T F α γ y - y F T γ α F y Abbildung 1: Turtle, Futter, Spähbereich 14 β α errechnet sich aus den Koordinaten von Futter und Turtle wie folgt: α= 180 · M ath.atan2(xT − xF , yF − yT ) M ath.P I Math.atan2(y,x) liefert den Winkel im Bogenmaß, dessen Tangens y/x ist. Es berücksichtigt automatisch die Vorzeichen von x und y zur Ermittlung des richtigen Quadranten und den Sonderfall x = 0. (Anm.: Definieren Sie für den Ausdruck 180/Math.PI eine Konstante). Wie aus der Abbildung 1 zu entnehmen ist, sieht die Turtle das Futter wenn gilt: β − γ < α + 180 < β + γ d.h. allgemein immer dann wenn |α + 180 − β| < γ. Um den Absolutbetrag eines arithmetischen Ausdrucks zu berechnen wird in Java Math.abs(Ausdruck); aufgerufen. TA 3.4 Aufgaben: Schreiben Sie ein Programm, das zwei Turtles (zwei Farben) im Turtlescreen zeigt. Eine Turtle sei die Beute-Turtle, die andere die Räuber-Turtle. 1. Nehmen Sie die sich zufällig drehende RandomTurtle aus TA 3.2 als Beute und die SmellTurtle aus TA 3.3 als Räuber. Der Räuber “riecht” sein Futter jeweils an der momentanen Position der Beute-Turtle. Beute- und Räuber-Turtle bewegen sich immer abwechselnd. 2. Nehmen Sie die PeerTurtle aus TA 3.3.2 als Beute und die SmellTurtle aus TA 3.3.1 als Räuber. Wie oben “riecht” der Räuber sein Futter jeweils an der momentanen Position der Beute-Turtle. Beachten Sie aber, daß bei der PeerTurtle als Beute das Ausrichtungsverhalten nicht zufällig ist (wie bei der RandomTurtle) sondern auf Flucht gerichtet sein muß, d.h. umgekehrt arbeiten muß, als das Ausrichtungsverhalten der RäuberTurtle! Experimentieren Sie mit den Parametern Schrittweite, Spähwinkel, Drehwinkel so, daß der Räuber die Beute fangen kann. Beute- und Räuber-Turtle bewegen sich wie zuvor immer abwechselnd. 15 TA 3.5 In den soweit behandelten Beispielen wurde immer wieder die in Java integrierte Dokumentationsmethode eingesetzt. Aufgabe: Starten Sie nun zur Erstellung eines HTML-Dokumentes das Programm javadoc für die vorgegebenen Example31.java, Example32.java und die von Ihnen bearbeitete TA 3.4 jeweils gesondert nach folgendem Muster an: javadoc -author -version Example31.java. Sehen Sie sich die von Ihnen erstellte Dokumentation ihres Javaprogramms mit einem Browser an. TA 3.6 (Freiwillige Zusatzaufgabe für Interessierte) Diese Aufgabe ergänzt die TA 3.1 um ein weiteres Beispiel zur Vererbung und Erweiterung einer Super-/Basisklasse. Aufgabe: 1. Die Klasse PathTurnTurtle (aus TA 3.1) soll noch einmal durch Vererbung erweitert werden (zur Subklasse AreaPathTurnTurtle), sodaß sie auch die von der Turtle bei geschlossenen geometrischen Figuren umlaufene Fläche berechnet (s. dazu Abb 2 und die “Erläuterung zur Berechnung der Fläche”). Eine neue Instanzvariable zur Speicherung der umlaufenen Fläche und die Erweiterung der Methoden fd und bk um das Aufsummieren der Flächen sind dazu nötig. Verwenden Sie anschließend die Klasse AreaPathTurnTurtle in einem Programm, in dem die Turtle sich zum einen um ein nEck (mit n = 3 und 8) und zum anderen um die Koch-Kurve bewegt und dabei den Gesamtdrehwinkel, die Gesamtlaufstrecke und die Fläche der umlaufenen Figuren ermittelt. Anm.: Ziehen Sie dazu die in den Aufgabenblöcken TA 2.2 und TA 2.3 erarbeiteten Programmsequenzen (Methoden)zum Umlaufen entsprechender Figuren hinzu. Erläuterung zur Berechnung der Flächen: 16 (x1,y1) 2. Teilflaeche 11111 00000 00000000000000 0000011111111111111 11111 00000000000000 11111111111111 00000 11111 00000000000000 0000011111111111111 11111 00000000000000 11111111111111 00000 11111 00000000000000 0000011111111111111 11111 00000000000000 11111111111111 00000 11111 00000000000000 11111111111111 0000011111111111111 11111 00000000000000 00000 11111 00000000000000 b 0000011111111111111 11111 00000000000000 11111111111111 00000 11111 00000000000000 11111111111111 00000 11111 00000000000000 11111111111111 00000 11111 00000000000000 11111111111111 a 00000 11111 00000000000000 0000011111111111111 11111 00000000000000 11111111111111 00000 11111 00000000000000 11111111111111 00000 11111 00000000000000 0000011111111111111 11111 00000000000000 11111111111111 (x2,y2) (x2,y2) 1. Teilflaeche (x1,y1) (startx,starty) Abbildung 2: Flächenberechnung Die Turtle kann auf einen Startpunkt gesetzt werden durch Aufruf von t.setPosition(startx, starty). Die Koordinaten einer Turtle-Position können abgefragt werden durch getX() und getY(). Nun kann man die Fläche einer von der Turtle umlaufenen Figur dadurch errechnen, daß man die Summe aller eingeschlossenen Dreiecks-Teilflächen addiert (s. Abb. 2). Zur Bestimmung einer Dreiecks-Teilfläche gilt folgende Rechenvorschrift: |f | = 1 · (x1 − startx) · (y2 − starty) − (y1 − starty) · (x2 − startx) · e3 2 Der Startpunkt (startx, starty) bleibt je Teilfläche erhalten, (x1,y1) und (x2,y2) werden je Schritt “vorangeschoben” (s. Abb. 2). Bei der Errechnung der Teilflächen ergeben sich automatisch positive oder negative Werte, je nachdem ob sich die Turtle ausgehend von der letzten Position rechts oder linksdrehend weiter bewegt hat. 17