studyklar
GdI 2 · Übungsblatt 7 · Aufgabe 4

Figuren zu Gruppen zusammenfassen und verschieben

Ein Fahrzeug aus einem Rechteck und zwei Kreisen soll sich mit einem Befehl bewegen lassen. Dafür fasst eine neue Klasse Gruppe mehrere Figuren in einer Liste zusammen. Rechts steht jeweils die Klasse, um die es gerade geht; die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 4

Es sollen wieder verschiedene Figuren auf einer Zeichenfläche gezeichnet werden. Der Code findet sich im Package grafik.

Dieses Mal sollen mehrere Figuren zu Gruppen zusammengefasst werden. So kann man beispielsweise ein Fahrzeug zeichnen, indem man ein Rechteck mit zwei Kreise als Räder versieht. Fasst man diese drei Figuren zu einer Gruppe zusammen, so soll man sie mit einem Befehl gemeinsam verschieben können.

Erstellen Sie eine Klasse „Gruppe“. Eine Gruppe soll beliebig viele Figuren enthalten können. Verwenden Sie hierfür eine geeignete Java-Collection. Schreiben Sie auch eine Methode, mit der man einer Gruppe eine Figur hinzufügen kann.

In der Klasse GrafikApp sollen zunächst einige Figuren und Gruppen angelegt werden können. Schließlich soll jede Gruppe einmal verschoben werden, wobei der gewünschte x-Wert und der gewünschte y-Wert jeweils über die Konsole eingegeben wird.

Damit Sie auf die Gruppen zugreifen können, müssen Sie sie in geeigneter Weise in der GraphikApp speichern.

Die Methode „aktualisiere( )“ muss ergänzt werden, damit nach dem Leeren der Zeichenfläche alle Figuren aller Gruppen neu gezeichnet werden.

Auf Blatt 6 gab es Kreise und Dreiecke als Unterklassen von Figur. Jetzt kommen Gruppen dazu. Eine Gruppe sammelt beliebig viele Figuren. Verschiebt man die Gruppe, verschieben sich alle ihre Figuren um dieselben Werte.

GrafikApp legt Figuren und Gruppen an und merkt sich alle Gruppen. Dann fragt sie für jede Gruppe nach der Verschiebung in x und y. Ihre Methode aktualisiere() zeichnet nach jeder Änderung alles neu.

Das Paket grafik mit der Zeichenfläche liegt uns nicht vor. Hier ersetzt sie ein Raster aus Zeichen auf der Konsole (Schritt 2).

Merke: Eine Klasse, die viele Objekte zusammenfasst, hält sie in einer Liste. Ein Befehl an das Ganze wird in einer Schleife an jedes Teil weitergegeben.
  1. Die Vorgabe: Figur, die Figuren und die Zeichenfläche.
  2. Die Klasse Gruppe: Liste, hinzufügen, zeichnen, verschieben.
  3. GrafikApp: Gruppen speichern, anlegen, neu zeichnen, verschieben.
  4. Ein Probelauf.

Was jede Figur schon kann

    public abstract void zeichne();     public void verschiebe(int deltaX, int deltaY) {        xMitte += deltaX;        yMitte += deltaY;        GrafikApp.aktualisiere();    }

Jede Figur hat einen Mittelpunkt (xMitte, yMitte) und zwei Methoden. zeichne() malt sie auf die Zeichenfläche. verschiebe(deltaX, deltaY) rückt den Mittelpunkt um die beiden Werte weiter. delta steht für „Änderung um“.

Wichtig für später: Nach dem Verschieben ruft die Figur GrafikApp.aktualisiere() auf. Diese Methode soll die Fläche leeren und alles neu zeichnen, damit die Figur an der alten Stelle verschwindet.

Aus Blatt 6, Aufgabe 2 („Abstrakte Klasse Figur über Kreis und Dreieck“): Figur ist eine abstrakte Oberklasse: Von ihr selbst gibt es kein Objekt. Kreis und Dreieck erben Mittelpunkt und verschiebe und schreiben je ihr eigenes zeichne().

Die übrigen Klassen der Vorgabe

KlasseHerkunftAufgabe
FigurBlatt 6, Aufgabe 2Mittelpunkt, verschieben
KreisBlatt 6, Aufgabe 2zeichnet einen Kreis
DreieckBlatt 6, Aufgabe 2zeichnet ein Dreieck
Rechteckhier ergänzt, wie Dreieckzeichnet ein Rechteck aus Breite und Höhe
ZeichenflaecheErsatz auf der KonsolePixel setzen, leeren, zeigen
public class Rechteck extends Figur {     private int breite, hoehe;     public Rechteck(int xMitte, int yMitte, int breite, int hoehe) {        super(xMitte, yMitte);        this.breite = breite;        this.hoehe = hoehe;        zeichne();    }     @Override    public void zeichne() {        int links = xMitte - breite / 2;        int unten = yMitte - hoehe / 2;        for (int deltaX = 0; deltaX <= breite; deltaX++) {            Zeichenflaeche.zeichnePixel(links + deltaX, unten);            Zeichenflaeche.zeichnePixel(links + deltaX, unten + hoehe);        }        for (int deltaY = 0; deltaY <= hoehe; deltaY++) {            Zeichenflaeche.zeichnePixel(links, unten + deltaY);            Zeichenflaeche.zeichnePixel(links + breite, unten + deltaY);        }    }}

Die Tabelle zeigt, woher jede Klasse stammt. Neu zu schreiben sind nur Gruppe und die Teile von GrafikApp, um die es ab Schritt 3 geht.

Die echte Zeichenfläche ist ein Fenster mit 1000 × 800 Pixeln (Bildpunkten). Alle Figuren dieser Aufgabe liegen in den linken 800 Pixeln, nur die zeigt unser Ersatz, als Raster aus Zeichen: Ein * steht für 10 Pixel in der Breite und 20 in der Höhe. y zählt von unten nach oben. Er hat dieselben Methoden zeichnePixel und leere, dazu zeige() zum Ausgeben auf der Konsole.

Rechteck steht darunter. Sein Konstruktor bekommt vier Zahlen: den Mittelpunkt x und y, dann Breite und Höhe. zeichne() zieht daraus die vier Seiten, je eine Schleife für unten und oben, eine für links und rechts.

Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Figur.java

aus Blatt 6, Aufgabe 2

Abbildung 1Figur.java

aus Blatt 6, Aufgabe 2

public abstract class Figur {     protected int xMitte, yMitte;     public Figur(int xMitte, int yMitte) {        this.xMitte = xMitte;        this.yMitte = yMitte;    }     public abstract void zeichne();     public void verschiebe(int deltaX, int deltaY) {        xMitte += deltaX;        yMitte += deltaY;        GrafikApp.aktualisiere();    }}
LegendeDie abstrakte Klasse Figur.