## Class Picture

- java.lang.Object
- - Picture

-     public class Picture
      extends java.lang.Object

  Bildklasse für die Simulation von Processing-Befehlen Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet werden kann. Zusätzlich kann ein Bildanzeiger über jede Änderung des Bildes informiert werden, um "Zurück"-Befehle zu ermöglichen. Der Bildanzeiger ist entweder eine normale Java ScrollPane oder ein Actor aus Greenfoot. Die Dokumentation der einzelnen Zeichenmethoden ist der Processing-Reference (https://processing.org/reference/ steht unter CC-Lizenz: https://creativecommons.org/) entnommen und mit Deepl.com ins Deutsche übersetzt.
  Version:
    1.0 from 23.01.2019
  Author:
    Thomas Schaller (ZPG Informatik Klasse 9)

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static int` | `CENTER`
    `static int` | `CORNER`
    `static int` | `CORNERS`
    `static int` | `RADIUS`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `Picture()` Erzeugt ein Bild mit Standardgröße 500x400
    `Picture(int width, int height)` Erzeugt ein Bild der angegeben Größe
    `Picture(int width, int height, java.lang.String background)` Erzeugt ein Bild der angegebenen Größe mit festgelegtem Hintergrund
    `Picture(java.lang.String filename)` Erzeugt ein Bild aus einer Datei

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `background(int c)` Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
    `void` | `background(int r, int g, int b)` Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
    `void` | `clear()` Löscht den Inhalt des Bildes.
    `void` | `delay(int millis)` Hilfsfunktion zum Verzögern der Ausgabe
    `void` | `ellipse(int a, int b, int c, int d)` Zeichnet eine Ellipse/Kreis auf das Bild.
    `void` | `ellipseMode(int mode)` Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
    `void` | `fill(int fillcolor)` Legt die Farbe fest, mit der Formen gefüllt werden.
    `void` | `fill(int r, int g, int b)` Legt die Farbe fest, mit der Formen gefüllt werden.
    `void` | `fill(java.lang.String fillcolor)` Legt die Farbe fest, mit der Formen gefüllt werden.
    `int` | `getHeight()` Liefert die Höhe des Bildes zurück.
    `java.awt.image.BufferedImage` | `getImage()` Direktes Abfragen des Bildes (für interne Zwecke)
    `java.awt.Color[][]` | `getPixelArray()` Liefert das Bild als zweidimensionales Pixel-Array.
    `int` | `getWidth()` Liefert die Breite des Bildes zurück.
    `void` | `line(int x1, int y1, int x2, int y2)` Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
    `void` | `load(java.lang.String filename)` Lädt ein Bild aus dem Dateisystem.
    `void` | `noFill()` Legt fest, dass die Formen nicht gefüllt werden sollen.
    `void` | `noStroke()` Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
    `void` | `point(int x, int y)` Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
    `void` | `polygon(int[] x, int[] y)` Zeichnet ein Polygon auf das Bild.
    `void` | `quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)` Zeichnet ein Viereck auf das Bild.
    `void` | `rect(int a, int b, int c, int d)` Zeichnet ein Rechteck auf das Bild.
    `void` | `rectMode(int mode)` Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken.
    `void` | `refresh()` Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert.
    `void` | `save(java.lang.String filename)` Speichert ein Bild.
    `void` | `setAutoRefresh(boolean autoRefresh)` Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in der Oberfläche aktualisiert wird.
    `void` | `setImage(java.awt.image.BufferedImage b)` Direktes Setzen des Bildes (für interne Zwecke)
    `void` | `setObserver(PictureViewer observer)` Legt fest, wer das Bild anzeigt.
    `void` | `setPixelArray(java.awt.Color[][] pixel)` Setzt das Bild neu auf Basis des Pixel-Arrays.
    `void` | `size(int width, int height)` Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten.
    `void` | `stroke(int pencolor)` Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
    `void` | `stroke(int r, int g, int b)` Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
    `void` | `stroke(java.lang.String pencolor)` Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
    `void` | `strokeWeight(double width)` Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest.
    `void` | `text(java.lang.String s, int x, int y)` Gibt einen Text an den gegebenen Koordinaten aus Zur Ausgabe des Textes wird der ausgewählte Font verwendet.
    `void` | `textFont(java.awt.Font font)` Legt die Schriftart für Textausgaben fest.
    `void` | `triangle(int x1, int y1, int x2, int y2, int x3, int y3)` Zeichnet ein Dreieck auf das Bild.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### CENTER

          public static final int CENTER

      See Also:
        Constant Field Values

    - #### CORNER

          public static final int CORNER

      See Also:
        Constant Field Values

    - #### CORNERS

          public static final int CORNERS

      See Also:
        Constant Field Values

    - #### RADIUS

          public static final int RADIUS

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### Picture

          public Picture()

      Erzeugt ein Bild mit Standardgröße 500x400

    - #### Picture

          public Picture(int width,
                         int height)

      Erzeugt ein Bild der angegeben Größe
      Parameters:
        `width` - Breite des Bildes
        `height` - Höhe des Bildes

    - #### Picture

          public Picture(int width,
                         int height,
                         java.lang.String background)

      Erzeugt ein Bild der angegebenen Größe mit festgelegtem Hintergrund
      Parameters:
        `width` - Breite des Bildes
        `height` - Höhe des Bildes
        `background` - Farbe des Hintergrunds

    - #### Picture

          public Picture(java.lang.String filename)

      Erzeugt ein Bild aus einer Datei
      Parameters:
        `filename` - Dateiname des Bildes

  - ### Method Detail

    - #### background

          public void background(int c)

      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. Es ist nicht möglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberfläche zu verwenden.
      Parameters:
        `c` - Farbe für den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiß, sonst: c wird als 3-Byte RGB-Wert interpretiert)

    - #### background

          public void background(int r,
                                 int g,
                                 int b)

      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. Es ist nicht möglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberfläche zu verwenden.
      Parameters:
        `r` - Rotanteil (0-255) der Hintergrundfarbe
        `g` - Grünanteil (0-255) der Hintergrundfarbe
        `b` - Blauanteil (0-255) der Hintergrundfarbe

    - #### clear

          public void clear()

      Löscht den Inhalt des Bildes. Der Hintergrund wird mit der Hintergrundfarbe neu gefüllt.

    - #### delay

          public void delay(int millis)

      Hilfsfunktion zum Verzögern der Ausgabe
      Parameters:
        `millis` - Wartezeit in Millisekunden

    - #### ellipse

          public void ellipse(int a,
                              int b,
                              int c,
                              int d)

      Zeichnet eine Ellipse/Kreis auf das Bild. Standardmäßig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Höhe. Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion `ellipseMode()` geändert werden. Durch den Befehl `fill()` /`noFill()` kann die Füllfarbe des Rechtecks gewählt werden, durch `stroke()`/`noStroke()` die Rahmenfarbe.
      Parameters:
        `a` - meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geändert werden).
        `b` - meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geändert werden).
        `c` - meist die Breite des Rechtecks (kann durch ellipseMode() geändert werden).
        `d` - meist die Höhe des Rechtecks (kann durch ellipseMode() geändert werden).

    - #### ellipseMode

          public void ellipseMode(int mode)

      Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. Ändert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise ändert, wie Parameter, die an ellipse() übergeben werden, interpretiert werden. Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, während der dritte und vierte Parameter seine Breite und Höhe sind. ellipseMode(Bild.CORNER) interpretiert die ersten beiden Parameter von ellipse() als die Position einer Ecke und die dritten und vierten Parameter als Breite und Höhe der Form. ellipseMode(Bild.CORNERS) interpretiert die ersten beiden Parameter von ellipse() als die Position einer Ecke und die dritten und vierten Parameter als die Position der gegenüberliegenden Ecke. ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, verwendet aber den dritten und vierten Parameter, um die Hälfte der Breite und Höhe der Formen festzulegen.
      Parameters:
        `mode` - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)

    - #### fill

          public void fill(int fillcolor)

      Legt die Farbe fest, mit der Formen gefüllt werden. Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben.
      Parameters:
        `fillcolor` - Füllfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiß, sonst: c wird als 3-Byte RGB-Wert interpretiert)

    - #### fill

          public void fill(int r,
                           int g,
                           int b)

      Legt die Farbe fest, mit der Formen gefüllt werden. Diese Farbe wird komponentenweise als RGB-Wert angegeben.
      Parameters:
        `r` - Rotanteil (0-255) der Füllfarbe
        `g` - Grünanteil (0-255) der Füllfarbe
        `b` - Blauanteil (0-255) der Füllfarbe

    - #### fill

          public void fill(java.lang.String fillcolor)

      Legt die Farbe fest, mit der Formen gefüllt werden. Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei für die roten, grünen und blauen Komponenten, um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
      Parameters:
        `fillcolor` - Füllfarbe in Hexadezimaldarstellung

    - #### getHeight

          public int getHeight()

      Liefert die Höhe des Bildes zurück.
      Returns:
        Höhe des Bildes

    - #### getImage

          public java.awt.image.BufferedImage getImage()

      Direktes Abfragen des Bildes (für interne Zwecke)
      Returns:
        Bild, das gerade gespeichert ist.

    - #### getPixelArray

          public java.awt.Color[][] getPixelArray()

      Liefert das Bild als zweidimensionales Pixel-Array.
      Returns:
        zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen.

    - #### getWidth

          public int getWidth()

      Liefert die Breite des Bildes zurück.
      Returns:
        Breite des Bildes

    - #### line

          public void line(int x1,
                           int y1,
                           int x2,
                           int y2)

      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. Um eine Linie einzufärben, verwenden Sie die `stroke()` Funktion. Eine Zeile kann nicht gefüllt werden, daher hat die Funktion fill() keinen Einfluss auf die Farbe einer Zeile. Linien werden standardmäßig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion `strokeWeight()` geändert werden.
      Parameters:
        `x1` - x-Koordinate des 1. Punktes
        `y1` - y-Koordinate des 1. Punktes
        `x2` - x-Koordinate des 2. Punktes
        `y2` - y-Koordinate des 2. Punktes

    - #### load

          public void load(java.lang.String filename)

      Lädt ein Bild aus dem Dateisystem. Lädt ein Bild von einem Datenträger und setzt Stiftfarbe und Füllfarbe auf Standardwerte zurück.
      Parameters:
        `filename` - Dateiname des Bildes

    - #### noFill

          public void noFill()

      Legt fest, dass die Formen nicht gefüllt werden sollen.

    - #### noStroke

          public void noStroke()

      Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.

    - #### point

          public void point(int x,
                            int y)

      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. Der erste Parameter ist der x-Wert für den Punkt, der zweite Wert ist der y-Wert für den Punkt.
      Parameters:
        `x` - x-Koordinate des Punktes
        `y` - y-Koordinate des Punktes

    - #### polygon

          public void polygon(int[] x,
                              int[] y)

      Zeichnet ein Polygon auf das Bild. Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. Durch den Befehl `fill()` /`noFill()` kann die Füllfarbe des Rechtecks gewählt werden, durch `stroke()`/`noStroke()` die Rahmenfarbe.
      Parameters:
        `x` - Liste der x-Koordinaten der Punkte.
        `y` - Liste der y-Koordinaten der Punkte.

    - #### quad

          public void quad(int x1,
                           int y1,
                           int x2,
                           int y2,
                           int x3,
                           int y3,
                           int x4,
                           int y4)

      Zeichnet ein Viereck auf das Bild. Ein Viereck ist ein vierseitiges Polygon. Es ist ähnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten sind nicht auf neunzig Grad beschränkt. Das erste Paar von Parametern (x1,y1) setzt den ersten Scheitelpunkt und die nachfolgenden Paare sollten im Uhrzeigersinn oder gegen den Uhrzeigersinn um die definierte Form herum verlaufen. Durch den Befehl `fill()` /`noFill()` kann die Füllfarbe des Rechtecks gewählt werden, durch `stroke()`/`noStroke()` die Rahmenfarbe.
      Parameters:
        `x1` - meist die x-Koordinate des 1. Punkts.
        `y1` - meist die y-Koordinate des 1. Punkts.
        `x2` - meist die x-Koordinate des 2. Punkts.
        `y2` - meist die y-Koordinate des 2. Punkts.
        `x3` - meist die x-Koordinate des 3. Punkts.
        `y3` - meist die y-Koordinate des 3. Punkts.
        `x4` - meist die x-Koordinate des 3. Punkts.
        `y4` - meist die y-Koordinate des 3. Punkts.

    - #### rect

          public void rect(int a,
                           int b,
                           int c,
                           int d)

      Zeichnet ein Rechteck auf das Bild. Standardmäßig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Höhe. Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion `rectMode()` geändert werden. Durch den Befehl `fill()` /`noFill()` kann die Füllfarbe des Rechtecks gewählt werden, durch `stroke()`/`noStroke()` die Rahmenfarbe.
      Parameters:
        `a` - meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geändert werden).
        `b` - meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geändert werden).
        `c` - meist die Breite des Rechtecks (kann durch rectMode() geändert werden).
        `d` - meist die Höhe des Rechtecks (kann durch rectMode() geändert werden).

    - #### rectMode

          public void rectMode(int mode)

      Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken. Ändert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise ändert, wie Parameter, die an rect() übergeben werden, interpretiert werden. Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, während der dritte und vierte Parameter seine Breite und Höhe sind. rectMode(Bild.CORNERS) interpretiert die ersten beiden Parameter von rect() als die Position einer Ecke und die dritten und vierten Parameter als die Position der gegenüberliegenden Ecke. rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, während der dritte und vierte Parameter seine Breite und Höhe sind. rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, verwendet aber den dritten und vierten Parameter, um die Hälfte der Breite und Höhe der Formen festzulegen.
      Parameters:
        `mode` - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)

    - #### refresh

          public void refresh()

      Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert.

    - #### save

          public void save(java.lang.String filename)

      Speichert ein Bild. Speichert ein Bild auf einem Datenträger. Zulässig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. Standardmäßig wird die Dateiendung .png ergänzt, wenn keine angegeben ist.
      Parameters:
        `filename` - Dateiname des Bildes

    - #### setAutoRefresh

          public void setAutoRefresh(boolean autoRefresh)

      Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in der Oberfläche aktualisiert wird. Die Einstellung "false" beschleunigt das Zeichnen aufwändiger Bilder und verhindert "Flackern". Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgelöst werden.
      Parameters:
        `autorefresh` - true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen

    - #### setImage

          public void setImage(java.awt.image.BufferedImage b)

      Direktes Setzen des Bildes (für interne Zwecke)
      Parameters:
        `b` - Bild, das gespeichert werden soll.

    - #### setObserver

          public void setObserver(PictureViewer observer)

      Legt fest, wer das Bild anzeigt. Diese ermöglicht die Benachrichtung des Observers, wenn sich das Bild ändert.
      Parameters:
        `observer` - Anzeiger des Bildes

    - #### setPixelArray

          public void setPixelArray(java.awt.Color[][] pixel)

      Setzt das Bild neu auf Basis des Pixel-Arrays. Die Größe des Bildes wird nicht automatisch an das Array angepasst.
      Parameters:
        `pixel` - zweidimensionales Array von Color-Objekten

    - #### size

          public void size(int width,
                           int height)

      Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten. Die eingebauten Variablen Breite und Höhe werden durch die an diese Funktion übergebenen Parameter festgelegt. So weist beispielsweise der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Höhe 480 zu.
      Parameters:
        `width` - Breite des Bildes
        `height` - Höhe des Bildes

    - #### stroke

          public void stroke(int pencolor)

      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden. Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben
      Parameters:
        `pencolor` - Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiß, sonst: c wird als 3-Byte RGB-Wert interpretiert)

    - #### stroke

          public void stroke(int r,
                             int g,
                             int b)

      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden. Diese Farbe wird komponentenweise als RGB-Wert angegeben
      Parameters:
        `r` - Rotanteil (0-255) der Stiftfarbe
        `g` - Grünanteil (0-255) der Stiftfarbe
        `b` - Blauanteil (0-255) der Stiftfarbe

    - #### stroke

          public void stroke(java.lang.String pencolor)

      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden. Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei für die roten, grünen und blauen Komponenten, um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
      Parameters:
        `pencolor` - Stiftfarbe in Hexadezimaldarstellung

    - #### strokeWeight

          public void strokeWeight(double width)

      Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest. Alle Breiten werden in Pixeleinheiten angegeben.
      Parameters:
        `width` - Breite in Pixel

    - #### text

          public void text(java.lang.String s,
                           int x,
                           int y)

      Gibt einen Text an den gegebenen Koordinaten aus Zur Ausgabe des Textes wird der ausgewählte Font verwendet. Dieser muss vorher mit `textFont()` festgelegt.
      Parameters:
        `s` - Text, der angezeigt werden soll
        `x` - x-Koordinate des Textanfangs
        `y` - y-Koordinate der Grundlinie des Textes.

    - #### textFont

          public void textFont(java.awt.Font font)

      Legt die Schriftart für Textausgaben fest. Jeder übliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden.
      Parameters:
        `font` - ein Font-Objekt

    - #### triangle

          public void triangle(int x1,
                               int y1,
                               int x2,
                               int y2,
                               int x3,
                               int y3)

      Zeichnet ein Dreieck auf das Bild. Ein Dreieck ist eine Ebene, die durch die Verbindung von drei Punkten entsteht. Die ersten beiden Argumente spezifizieren den ersten Punkt, die mittleren beiden Argumente spezifizieren den zweiten Punkt und die letzten beiden Argumente spezifizieren den dritten Punkt. Durch den Befehl `fill()` /`noFill()` kann die Füllfarbe des Rechtecks gewählt werden, durch `stroke()`/`noStroke()` die Rahmenfarbe.
      Parameters:
        `x1` - meist die x-Koordinate des 1. Punkts.
        `y1` - meist die y-Koordinate des 1. Punkts.
        `x2` - meist die x-Koordinate des 2. Punkts.
        `y2` - meist die y-Koordinate des 2. Punkts.
        `x3` - meist die x-Koordinate des 3. Punkts.
        `y3` - meist die y-Koordinate des 3. Punkts.