studyklar
GdI 2 · Übungsblatt 5 · Aufgabe 4

Dreiecke als Objekte: zeichnen, verschieben, neu zeichnen

Auf Blatt 4 war ein Dreieck nur ein Methodenaufruf: gezeichnet und dann vergessen. Jetzt wird jedes Dreieck ein Objekt, das seine Lage kennt. Darum kann man es später verschieben und neu zeichnen. Rechts steht die Datei des aktuellen Teils, die Zeilen zum Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 4

Es wird wieder die Klasse grafik.Zeichenflaeche( ) mit der statischen Methode zeichnePixel( ) verwendet. Es sollen wieder Dreiecke gezeichnet werden. Der Code zum Zeichnen eines Dreiecks findet sich in der Klasse grafik.DreieckApp.

Der weitere Code in dieser Klasse wird in Aufgabenteil b) benötigt.

a) Erstellen Sie eine Klasse Dreieck. Sie soll Attribute für die notwendigen Angaben zur Festlegung der Position und Größe eines gleichseitigen Dreiecks und einen Konstruktor zur Befüllung dieser Attribute mit Werten enthalten. Wenn ein neues Dreieck-Objekt angelegt wird, soll das betreffende Dreieck auf der Zeichenfläche dargestellt werden.

Legen Sie in der main-Methode der Klasse „DreieckApp“ mindestens vier Dreieck-Objekte an.

Die while-Schleife können Sie vorerst auskommentieren.

b) Fügen Sie der Klasse Dreieck eine Methode „verschiebe“ hinzu, mit der der das Dreieck um einen gewünschten x- und einen gewünschten y-Wert verschoben werden kann. Das verschobene Dreieck soll auch wieder gezeichnet werden, so dass das Dreieck zweimal zu sehen ist: Einmal an der ursprünglichen Stelle, einmal an der neuen Stelle.

Entfernen Sie die Kommentar-Markierung der while-Schleife. Speichern Sie alle Dreiecke in der Klasse DreieckApp in einem Array „dreiecke“. Die über die Konsole eingegebenen Nummer können Sie als Index verwenden um auf das gewünschte Dreieck zuzugreifen, z. B. dreiecke[2].

c) Nun soll das verschobene Dreieck an der ursprünglichen Stelle gelöscht werden. Da sich ein Dreieck mit anderen Dreiecken überlappen kann, wäre es keine gute Lösung, einfach das ursprüngliche Dreieck in Weiß zu zeichnen. Stattdessen soll die Zeichenfläche komplett geleert werden (mit der Methode „Zeichenflaeche.leere( )), um anschließend alle Dreiecke neu zu zeichnen.

Hinweis: Falls Sie aus mehreren Methoden auf das Array „dreiecke“ zugreifen wollen, müssen Sie es außerhalb der main-Methode als statisches Attribut der Klasse DreieckApp speichern.

Die Klasse grafik.Zeichenflaeche öffnet ein Fenster mit 1000 × 800 Pixeln. Der Ursprung (0, 0) liegt links unten, x wächst nach rechts, y nach oben. Zeichenflaeche.zeichnePixel(x, y) färbt ein Pixel. Die Klasse liegt uns nicht vor; geprüft haben wir mit einem Nachbau, der dieselben Methoden hat und das Bild als Raster auf der Konsole ausgibt. Die Bilder unten zeigen die Ecken aus diesen Läufen.

Aus Blatt 4, Aufgabe 3 („Linien, Rechteck und Quadrat Pixel für Pixel zeichnen“) und Aufgabe 4 („Ineinander geschachtelte Dreiecke: mit Schleife und rekursiv“): Dort wurden Linien und Dreiecke Pixel für Pixel mit zeichnePixel gezeichnet, mit statischen Methoden in DreieckApp.
Merke: Ein Objekt hat Daten (Attribute) und Verhalten (Methoden). Das Dreieck weiß, wo es liegt, und kann sich selbst zeichnen und verschieben.
  1. a) Klasse Dreieck: Lage speichern, beim Anlegen zeichnen; vier Dreiecke.
  2. b) verschiebe; Dreiecke im Array; über die Konsole wählen und verschieben.
  3. c) Statt doppelt: Fläche leeren und alle Dreiecke neu zeichnen.

Welche Angaben ein Dreieck braucht

package grafik; public class Dreieck {     private int xMitte, yMitte, seitenlaenge;

Ein gleichseitiges Dreieck hat drei gleich lange Seiten. Für seine Größe reicht also eine Zahl, die Seitenlänge. Für seine Lage reicht ein Punkt, der Mittelpunkt (xMitte, yMitte).

Diese drei Werte werden Attribute. So behält jedes Dreieck-Objekt seine eigene Lage, auch nachdem es gezeichnet wurde. Das brauchen wir in Teil b) zum Verschieben.

Der Konstruktor speichert und zeichnet

    public Dreieck(int xMitte, int yMitte, int seitenlaenge) {        this.xMitte = xMitte;        this.yMitte = yMitte;        this.seitenlaenge = seitenlaenge;        zeichne();    }

Der Konstruktor schreibt die drei Werte mit this in die Attribute. Danach ruft er zeichne() auf. So erscheint jedes Dreieck, sobald es mit new angelegt wird, wie die Aufgabe es verlangt.

zeichne() ist eine Methode desselben Objekts. Darum braucht der Aufruf keinen Punkt davor.

Aus Vorlesung 5, Folie 5 („Konstruktor“): Der Konstruktor heißt wie die Klasse. Heißen Parameter und Attribute gleich, meint this.xMitte das Attribut.
Noch 11 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.

Dreieck.java

Teil a), noch ohne verschiebe

Abbildung 1Dreieck.java

Teil a), noch ohne verschiebe

package grafik; public class Dreieck {     private int xMitte, yMitte, seitenlaenge;     public Dreieck(int xMitte, int yMitte, int seitenlaenge) {        this.xMitte = xMitte;        this.yMitte = yMitte;        this.seitenlaenge = seitenlaenge;        zeichne();    }     public void zeichne() {        // Bestimmung linke Ecke:        int x = xMitte - seitenlaenge / 2;        int y = yMitte - (int) Math.round(seitenlaenge * 0.289);        // Untere Linie:        for (int deltaX = 0; deltaX <= seitenlaenge; deltaX++) {            Zeichenflaeche.zeichnePixel(x + deltaX, y);        }        // Seiten:        for (double deltaX = 0; deltaX < seitenlaenge / 2; deltaX += 0.5) {            int deltaY = (int) (1.732 * deltaX);            Zeichenflaeche.zeichnePixel(x + deltaX, y + deltaY);            Zeichenflaeche.zeichnePixel(x + seitenlaenge - deltaX - 1, y + deltaY);        }    }}
LegendeDie ganze Klasse Dreieck.