studyklar
GdI 2 · Übungsblatt 4 · Aufgabe 3

Linien, Rechteck und Quadrat Pixel für Pixel zeichnen

Ein Programm darf hier nur einen einzigen Zeichenbefehl benutzen: ein Pixel an der Stelle (x, y) färben. Daraus entstehen Schritt für Schritt Linien, Methoden für Linien, ein Rechteck und ein Quadrat. Rechts steht das Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben; im Lösungsweg zeigt ein Bild, was gezeichnet wird. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 3

Für diese und die folgenden Aufgaben benötigen Sie die Klasse Zeichenflaeche aus dem Package grafik. Entweder legen Sie Ihre Klassen ebenfalls im Package grafik an, oder Sie importieren die Klasse Zeichenfläche folgendermaßen: import grafik.Zeichenflaeche;

Diese Klasse stellt ein Fenster der Größe 1000 x 800 Pixel zur Verfügung. Mit der Methode „Zeichenflaeche.zeichnePixel(x, y)“ können Sie das Pixel an der Stelle (x, y) einfärben. Der Koordinatenursprung der Zeichenfläche ist links unten. Zum Zeichnen soll ausschließlich die genannte Methode „Zeichenflaeche.zeichnePixel( )“ verwendet werden.

a) Schreiben Sie Programmcode, der eine waagrechte Linie zeichnet. Position und Länge sind frei wählbar.

b) Schreiben Sie Programmcode, der eine senkrechte Linie zeichnet. Position und Länge sind frei wählbar.

c) Schreiben Sie je eine Methode zum Zeichnen einer waagrechten und zum Zeichnen einer senkrechten Linie mit den Start-Koordinaten und der Länge als Parameter.

d) Schreiben Sie eine Methode zum Zeichnen eines Rechtecks mit den Koordinaten der linken unteren Ecke sowie Breite und Höhe als Parameter. Nutzen Sie hierbei die bereits geschriebenen Methoden.

e) Schreiben Sie eine Methode zum Zeichnen eines Quadrats mit den Koordinaten der linken unteren Ecke sowie der Seitenlänge als Parameter. Nutzen Sie hierbei die bereits geschriebenen Methoden.

f) Ändern Sie die Methode zum Zeichnen einer waagrechten Linie. Sie soll nun überprüfen, ob die Länge positiv ist und Start- und Endpunkte in der Zeichenfläche liegen (die Koordinatenwerte der Zeichenfläche beginnen bei 0 und schließen 1000 bzw. 800 nicht mit ein). Nur in diesem Fall wird die Linie gezeichnet. Zudem soll die Methode den Wert „true“ zurückgeben, um der aufrufenden Methode mitzuteilen, dass das Zeichnen geklappt hat. Sind die oben genannten Voraussetzungen nicht erfüllt, so soll die Methode nichts zeichnen und den Wert „false“ zurückgeben.

Die Klasse grafik.Zeichenflaeche ist vorgegeben, liegt uns aber nicht vor. Zum Ausprobieren haben wir sie durch eine eigene ersetzt, die die gefärbten Pixel sammelt, als Bild speichert und zählt. Positionen und Längen sind frei wählbar; die Zahlen im Programm sind unsere Wahl.

In f) verlangt die Aufgabe eine positive Länge, also größer als 0. Die Musterlösung prüft laenge >= 0 und zeichnet bei Länge 0 noch ein Pixel. Wir prüfen laenge > 0, wie in der Aufgabe verlangt.

Merke: Große Aufgaben aus kleinen Methoden bauen. Die Linie ist die kleinste Einheit, das Rechteck besteht aus vier Linien, das Quadrat ist ein besonderes Rechteck.
  1. a), b) Je eine Linie direkt in main, mit einer Schleife.
  2. c) Dieselben Schleifen als Methoden mit Parametern.
  3. d), e) Rechteck und Quadrat aus den Methoden zusammensetzen.
  4. f) Die waagrechte Linie prüft vorher, ob sie auf die Fläche passt.

Die Zeichenfläche und ihr einziger Befehl

import grafik.Zeichenflaeche;

Die Zeichenfläche ist 1000 Pixel breit und 800 hoch. Jedes Pixel hat zwei Koordinaten: x zählt nach rechts, y nach oben. Der Punkt (0, 0) liegt links unten, wie im Koordinatensystem aus der Schule. Erlaubt sind x von 0 bis 999 und y von 0 bis 799.

Zeichenflaeche.zeichnePixel(x, y) färbt genau ein Pixel. Vor dem Punkt steht der Name der Klasse, weil die Methode zu einer anderen Klasse gehört. Der import in Zeile 1 macht diese Klasse aus dem Paket grafik bekannt. Ein Paket ist ein Ordner für Klassen.

Eine waagrechte Linie: y bleibt, x läuft

        // a) eine waagrechte Linie        int xStart = 200;        int yStart = 200;        int laenge = 400;        for (int x = xStart; x <= xStart + laenge; x++) {            Zeichenflaeche.zeichnePixel(x, yStart);        }
a)

Eine waagrechte Linie besteht aus Pixeln auf derselben Höhe. Also bleibt y fest, und x läuft vom Startpunkt nach rechts. Wir starten bei (200, 200) mit der Länge 400.

Die Schleife färbt jedes Pixel von x = 200 bis x = 600. Wegen <= ist das Endpixel 600 dabei. Das sind 600 − 200 + 1 = 401 Pixel; die Länge 400 ist der Abstand vom ersten zum letzten Pixel.

Aus Vorlesung 2, Folie 19 („for-Schleife“): for (Start; Bedingung; Schritt): Erst Start, dann der Rumpf, solange die Bedingung wahr ist; nach jedem Durchlauf der Schritt, hier x++.
Noch 10 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.

Teile a) bis e)

Linien, Rechteck, Quadrat

Abbildung 1Teile a) bis e)

Linien, Rechteck, Quadrat

import grafik.Zeichenflaeche; public class GrafikApp {     public static void main(String[] args) {        // a) eine waagrechte Linie        int xStart = 200;        int yStart = 200;        int laenge = 400;        for (int x = xStart; x <= xStart + laenge; x++) {            Zeichenflaeche.zeichnePixel(x, yStart);        }         // b) eine senkrechte Linie        xStart = 200;        yStart = 300;        int hoehe = 300;        for (int y = yStart; y <= yStart + hoehe; y++) {            Zeichenflaeche.zeichnePixel(xStart, y);        }         // c) bis e) mit Methoden        zeichneWaagrechte(300, 700, 500);        zeichneSenkrechte(900, 100, 600);        zeichneRechteck(400, 300, 300, 200);        zeichneQuadrat(500, 50, 100);    }     private static void zeichneWaagrechte(int xStart, int yStart, int laenge) {        for (int x = xStart; x <= xStart + laenge; x++) {            Zeichenflaeche.zeichnePixel(x, yStart);        }    }     private static void zeichneSenkrechte(int xStart, int yStart, int laenge) {        for (int y = yStart; y <= yStart + laenge; y++) {            Zeichenflaeche.zeichnePixel(xStart, y);        }    }     private static void zeichneRechteck(int x, int y, int breite, int hoehe) {        zeichneWaagrechte(x, y, breite);        zeichneSenkrechte(x, y, hoehe);        zeichneWaagrechte(x, y + hoehe, breite);        zeichneSenkrechte(x + breite, y, hoehe);    }     private static void zeichneQuadrat(int x, int y, int seite) {        zeichneRechteck(x, y, seite, seite);    }}
LegendeDas ganze Programm.