diff --git a/1_hintergrund/00_alg_stoffverteilungsplan.odt b/1_hintergrund/00_alg_stoffverteilungsplan.odt new file mode 100644 index 0000000..4fc9ff8 Binary files /dev/null and b/1_hintergrund/00_alg_stoffverteilungsplan.odt differ diff --git a/1_hintergrund/01_alg_unterrichtsverlauf.odt b/1_hintergrund/01_alg_unterrichtsverlauf.odt new file mode 100644 index 0000000..015a68f Binary files /dev/null and b/1_hintergrund/01_alg_unterrichtsverlauf.odt differ diff --git a/1_hintergrund/02_alg_hintergrund_digitale_bildbearbeitung.odt b/1_hintergrund/02_alg_hintergrund_digitale_bildbearbeitung.odt new file mode 100644 index 0000000..27338ae Binary files /dev/null and b/1_hintergrund/02_alg_hintergrund_digitale_bildbearbeitung.odt differ diff --git a/1_hintergrund/03_alg_hintergrund_gui_programmierung.odt b/1_hintergrund/03_alg_hintergrund_gui_programmierung.odt new file mode 100644 index 0000000..13932e7 Binary files /dev/null and b/1_hintergrund/03_alg_hintergrund_gui_programmierung.odt differ diff --git a/2_kopiervorlagen/01_alg_bilderalsarray.odt b/2_kopiervorlagen/01_alg_bilderalsarray.odt new file mode 100644 index 0000000..abf72a7 Binary files /dev/null and b/2_kopiervorlagen/01_alg_bilderalsarray.odt differ diff --git a/2_kopiervorlagen/02_alg_farbmodell.odt b/2_kopiervorlagen/02_alg_farbmodell.odt new file mode 100644 index 0000000..af899d6 Binary files /dev/null and b/2_kopiervorlagen/02_alg_farbmodell.odt differ diff --git a/2_kopiervorlagen/03_alg_faltung.odt b/2_kopiervorlagen/03_alg_faltung.odt new file mode 100644 index 0000000..dca906a Binary files /dev/null and b/2_kopiervorlagen/03_alg_faltung.odt differ diff --git a/2_kopiervorlagen/04_alg_faltung_puzzle.odt b/2_kopiervorlagen/04_alg_faltung_puzzle.odt new file mode 100644 index 0000000..917c730 Binary files /dev/null and b/2_kopiervorlagen/04_alg_faltung_puzzle.odt differ diff --git a/2_kopiervorlagen/05_alg_gui_erstellen.odt b/2_kopiervorlagen/05_alg_gui_erstellen.odt new file mode 100644 index 0000000..b47fbd9 Binary files /dev/null and b/2_kopiervorlagen/05_alg_gui_erstellen.odt differ diff --git a/2_kopiervorlagen/06_alg_gui_methode_von_kontrollelementen.odt b/2_kopiervorlagen/06_alg_gui_methode_von_kontrollelementen.odt new file mode 100644 index 0000000..d28ec80 Binary files /dev/null and b/2_kopiervorlagen/06_alg_gui_methode_von_kontrollelementen.odt differ diff --git a/2_kopiervorlagen/07_alg_gui_erstellen2.odt b/2_kopiervorlagen/07_alg_gui_erstellen2.odt new file mode 100644 index 0000000..bf760ae Binary files /dev/null and b/2_kopiervorlagen/07_alg_gui_erstellen2.odt differ diff --git a/2_kopiervorlagen/08_alg_stricheln_tupfen.odt b/2_kopiervorlagen/08_alg_stricheln_tupfen.odt new file mode 100644 index 0000000..31b6c5a Binary files /dev/null and b/2_kopiervorlagen/08_alg_stricheln_tupfen.odt differ diff --git a/2_kopiervorlagen/09_alg_hsb_farbmodell.odt b/2_kopiervorlagen/09_alg_hsb_farbmodell.odt new file mode 100644 index 0000000..af66ec0 Binary files /dev/null and b/2_kopiervorlagen/09_alg_hsb_farbmodell.odt differ diff --git a/2_kopiervorlagen/10_alg_histogramm.odt b/2_kopiervorlagen/10_alg_histogramm.odt new file mode 100644 index 0000000..b9ab365 Binary files /dev/null and b/2_kopiervorlagen/10_alg_histogramm.odt differ diff --git a/2_kopiervorlagen/11_alg_histogramm_ab.odt b/2_kopiervorlagen/11_alg_histogramm_ab.odt new file mode 100644 index 0000000..5b5e33d Binary files /dev/null and b/2_kopiervorlagen/11_alg_histogramm_ab.odt differ diff --git a/2_kopiervorlagen/12_alg_bildkombinationen.odt b/2_kopiervorlagen/12_alg_bildkombinationen.odt new file mode 100644 index 0000000..7bea9d5 Binary files /dev/null and b/2_kopiervorlagen/12_alg_bildkombinationen.odt differ diff --git a/2_kopiervorlagen/13_alg_bitplanes.odt b/2_kopiervorlagen/13_alg_bitplanes.odt new file mode 100644 index 0000000..c41789b Binary files /dev/null and b/2_kopiervorlagen/13_alg_bitplanes.odt differ diff --git a/2_kopiervorlagen/14_alg_bildgroesse.odt b/2_kopiervorlagen/14_alg_bildgroesse.odt new file mode 100644 index 0000000..d74934f Binary files /dev/null and b/2_kopiervorlagen/14_alg_bildgroesse.odt differ diff --git a/2_kopiervorlagen/15_alg_bilderdrehen.odt b/2_kopiervorlagen/15_alg_bilderdrehen.odt new file mode 100644 index 0000000..08e503b Binary files /dev/null and b/2_kopiervorlagen/15_alg_bilderdrehen.odt differ diff --git a/3_vorlagen_tauschordner/01_faltung.ods b/3_vorlagen_tauschordner/01_faltung.ods new file mode 100644 index 0000000..d9775cb Binary files /dev/null and b/3_vorlagen_tauschordner/01_faltung.ods differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/LICENSE.txt b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/Beispielbild.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/Beispielbild.java new file mode 100644 index 0000000..11da2dc --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/Beispielbild.java @@ -0,0 +1,28 @@ +import imp.*; +import java.io.File; +/** + * Klasse für Beispielbilder + * + * @author Thomas Schaller + * @version v1.0 (28.11.2019) + */ +public class Beispielbild extends Picture +{ + + /** + * Konstruktor: öffnet das Bild katze.jpg + */ + public Beispielbild() + { + super("iris.jpg"); + } + + public void load(String dateiname) { + super.load("images/"+dateiname); + } + + public void save(String dateiname) { + super.save("images/"+dateiname); + } + +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/GeometrischeBildoperationen.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/GeometrischeBildoperationen.java new file mode 100644 index 0000000..a25b385 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/GeometrischeBildoperationen.java @@ -0,0 +1,40 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen zur Änderung der Pixelpositionen eines Pictures + * z.B. drehen, spiegeln usw. + * + * @author Thomas Schaller + * @version 1.1 (28.11.2019) + */ +public class GeometrischeBildoperationen +{ + /** spiegeleHorizontal spiegelt das Bild, so dass rechts und links getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelHorizontal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(breite-1)-x][y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + + +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/allclasses.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/allclasses.html new file mode 100644 index 0000000..47b80da --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/allclasses.html @@ -0,0 +1,20 @@ + + + + + +All Classes + + + + + + +

All Classes

+
+ +
+ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/constant-values.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/constant-values.html new file mode 100644 index 0000000..67a232a --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/constant-values.html @@ -0,0 +1,73 @@ + + + + + +Constant Field Values + + + + + + + + +
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+ + +
+

imp.*

+
    +
  • + + + + + + + + + + + + + + + + + + + +
    imp.PictureViewer 
    Modifier and TypeConstant FieldValue
    + +public static final intFIT-1
    + +public static final intNORMAL1
    +
  • +
+
+
+
+ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/element-list b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/element-list new file mode 100644 index 0000000..6711e1c --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/element-list @@ -0,0 +1 @@ +imp diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/Picture.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/Picture.html new file mode 100644 index 0000000..7f2a95d --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/Picture.html @@ -0,0 +1,1276 @@ + + + + + +Picture + + + + + + + + + +
+
+
Package imp
+

Class Picture

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • imp.Picture
    • +
    +
  • +
+
+
    +
  • +
    +
    public class Picture
    +extends java.lang.Object
    +
    Bildklasse fuer die Simulation von Processing-Befehlen + + Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + werden kann. + Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt.
    +
    +
    Version:
    +
    1.0 from 23.01.2019
    +
    Author:
    +
    Thomas Schaller (ZPG Informatik Klasse 9)
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intCENTER 
      static intCORNER 
      static intCORNERS 
      static intRADIUS 
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Picture() +
      Erzeugt ein Bild mit Standardgroesse 500x400
      +
      Picture​(int width, + int height) +
      Erzeugt ein Bild der angegeben Groesse
      +
      Picture​(int width, + int height, + java.lang.String background) +
      Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
      +
      Picture​(java.lang.String filename) +
      Erzeugt ein Bild aus einer Datei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Loescht den Inhalt des Bildes.
      +
      voiddelay​(int millis) +
      Hilfsfunktion zum Verzoegern der Ausgabe
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidforceRepaint() +
      Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
      +
      intgetHeight() +
      Liefert die Hoehe des Bildes zurueck.
      +
      java.awt.image.BufferedImagegetImage() +
      Direktes Abfragen des Bildes (fuer interne Zwecke)
      +
      imp.PictureViewergetObserver() 
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      intgetWidth() +
      Liefert die Breite des Bildes zurueck.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Laedt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefuellt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird.
      +
      voidsetImage​(java.awt.image.BufferedImage b) +
      Direktes Setzen des Bildes (fuer interne Zwecke)
      +
      voidsetObserver​(imp.PictureViewer observer) +
      Legt fest, wer das Bild anzeigt.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetTitle​(java.lang.String titel) 
      voidshowInFrame() 
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String s, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart fuer Textausgaben fest.
      +
      voidtriangle​(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, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Picture

        +
        public Picture()
        +
        Erzeugt ein Bild mit Standardgroesse 500x400
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height)
        +
        Erzeugt ein Bild der angegeben Groesse
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(java.lang.String filename)
        +
        Erzeugt ein Bild aus einer Datei
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height,
        +               java.lang.String background)
        +
        Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        background - Farbe des Hintergrunds
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        showInFrame

        +
        public void showInFrame()
        +
      • +
      + + + +
        +
      • +

        setObserver

        +
        public void setObserver​(imp.PictureViewer observer)
        +
        Legt fest, wer das Bild anzeigt. + Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert.
        +
        +
        Parameters:
        +
        observer - Anzeiger des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getObserver

        +
        public imp.PictureViewer getObserver()
        +
      • +
      + + + +
        +
      • +

        setImage

        +
        public void setImage​(java.awt.image.BufferedImage b)
        +
        Direktes Setzen des Bildes (fuer interne Zwecke)
        +
        +
        Parameters:
        +
        b - Bild, das gespeichert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        getImage

        +
        public java.awt.image.BufferedImage getImage()
        +
        Direktes Abfragen des Bildes (fuer interne Zwecke)
        +
        +
        Returns:
        +
        Bild, das gerade gespeichert ist.
        +
        +
      • +
      + + + +
        +
      • +

        size

        +
        public void size​(int width,
        +                 int height)
        +
        Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu.
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getWidth

        +
        public int getWidth()
        +
        Liefert die Breite des Bildes zurueck.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getHeight

        +
        public int getHeight()
        +
        Liefert die Hoehe des Bildes zurueck.
        +
        +
        Returns:
        +
        Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        setTitle

        +
        public void setTitle​(java.lang.String titel)
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden.
        +
        +
        Parameters:
        +
        autorefresh - true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen
        +
        +
      • +
      + + + +
        +
      • +

        forceRepaint

        +
        public void forceRepaint()
        +
        Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Loescht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt.
        +
      • +
      + + + +
        +
      • +

        rectMode

        +
        public void rectMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        ellipseMode

        +
        public void ellipseMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        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 einzufaerben, verwenden Sie die stroke() Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + strokeWeight() geaendert 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
        +
        +
      • +
      + + + +
        +
      • +

        rect

        +
        public void rect​(int a,
        +                 int b,
        +                 int c,
        +                 int d)
        +
        Zeichnet ein Rechteck auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion rectMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        b - meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch rectMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        ellipse

        +
        public void ellipse​(int a,
        +                    int b,
        +                    int c,
        +                    int d)
        +
        Zeichnet eine Ellipse/Kreis auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion ellipseMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        b - meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + sind nicht auf neunzig Grad beschraenkt. 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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        x - Liste der x-Koordinaten der Punkte.
        +
        y - Liste der y-Koordinaten der Punkte.
        +
        +
      • +
      + + + +
        +
      • +

        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 fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt.
        +
        +
        Parameters:
        +
        x - x-Koordinate des Punktes
        +
        y - y-Koordinate des Punktes
        +
        +
      • +
      + + + +
        +
      • +

        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 ausgewaehlte 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 fuer Textausgaben fest. + Jeder uebliche 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
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(java.lang.String pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        pencolor - Stiftfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(int pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 weiss, 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 Raender um Formen gezeichnet werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Stiftfarbe
        +
        g - Gruenanteil (0-255) der Stiftfarbe
        +
        b - Blauanteil (0-255) der Stiftfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        strokeWeight

        +
        public void strokeWeight​(double width)
        +
        Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + Alle Breiten werden in Pixeleinheiten angegeben.
        +
        +
        Parameters:
        +
        width - Breite in Pixel
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(java.lang.String fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(int fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 gefuellt werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Fuellfarbe
        +
        g - Gruenanteil (0-255) der Fuellfarbe
        +
        b - Blauanteil (0-255) der Fuellfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefuellt werden sollen.
        +
      • +
      + + + +
        +
      • +

        background

        +
        public void background​(int c)
        +
        Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        c - Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Hintergrundfarbe
        +
        g - Gruenanteil (0-255) der Hintergrundfarbe
        +
        b - Blauanteil (0-255) der Hintergrundfarbe
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        public void load​(java.lang.String filename)
        +
        Laedt ein Bild aus dem Dateisystem. + Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        public void save​(java.lang.String filename)
        +
        Speichert ein Bild. + Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        setPixelArray

        +
        public void setPixelArray​(java.awt.Color[][] pixel)
        +
        Setzt das Bild neu auf Basis des Pixel-Arrays. + Die Groesse des Bildes wird nicht automatisch an das Array angepasst.
        +
        +
        Parameters:
        +
        pixel - zweidimensionales Array von Color-Objekten
        +
        +
      • +
      + + + +
        +
      • +

        delay

        +
        public void delay​(int millis)
        +
        Hilfsfunktion zum Verzoegern der Ausgabe
        +
        +
        Parameters:
        +
        millis - Wartezeit in Millisekunden
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/PictureViewer.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/PictureViewer.html new file mode 100644 index 0000000..af51632 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/PictureViewer.html @@ -0,0 +1,1371 @@ + + + + + +PictureViewer + + + + + + + + + +
+
+
Package imp
+

Class PictureViewer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • java.awt.Window
        • +
        • +
            +
          • java.awt.Frame
          • +
          • +
              +
            • javax.swing.JFrame
            • +
            • +
                +
              • imp.PictureViewer
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants
    +
    +
    +
    public class PictureViewer
    +extends javax.swing.JFrame
    +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen. Zusätzlich können + mehrere Verarbeitungsschritte gespeichert werden, um ein + "zurück"-Funktion zu ermöglichen.
    +
    +
    Version:
    +
    V1.0 vom 10.02.2019
    +
    Author:
    +
    Thomas Schaller
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JFrame

        +javax.swing.JFrame.AccessibleJFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Frame

        +java.awt.Frame.AccessibleAWTFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Window

        +java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFIT 
      static intNORMAL 
      protected imp.Picturepicture 
      +
        +
      • + + +

        Fields inherited from class javax.swing.JFrame

        +accessibleContext, rootPane, rootPaneCheckingEnabled
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Frame

        +ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
        +
      • + + +

        Fields inherited from interface javax.swing.WindowConstants

        +DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      PictureViewer() +
      Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
      +
      PictureViewer​(int width, + int height) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(int width, + int height, + java.lang.String background) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(imp.Picture p) 
      PictureViewer​(java.lang.String filename) +
      Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidback() +
      Ruft das letzte abgespeicherte Bild aus der History wieder auf.
      +
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Löscht den Inhalt des Bildes.
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      intgetImageHeight() +
      Liefert die Höhe des Bildes zurück.
      +
      intgetImageWidth() +
      Liefert die Breite des Bildes zurück.
      +
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Lädt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefüllt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidpushImage() +
      Speichert das übergebene Bild in der History.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidrefresh() +
      Sorgt für die Aktualisierung der Bildschrimanzeige.
      +
      voidrepaint() +
      Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Setzt die automatische Neuanzeige des Bildes.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetZoom​(double zoom) +
      Setzt den Zoom-Faktor für das Bild.
      +
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String t, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewählte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart für Textausgaben fest.
      +
      voidtriangle​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +
      Zeichnet ein Dreieck auf das Bild.
      +
      +
        +
      • + + +

        Methods inherited from class javax.swing.JFrame

        +addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Frame

        +addNotify, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Window

        +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, toBack, toFront
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, list, list, paintComponents, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, hasFocus, imageUpdate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, list, list, list, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.MenuContainer

        +getFont
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer()
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height,
        +                     java.lang.String background)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        background - Farbe des Hintergrunds als HEX-String (z.B. "FF3A45")
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(java.lang.String filename)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
        +
        +
        Parameters:
        +
        filename - Name des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(imp.Picture p)
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        pushImage

        +
        public void pushImage()
        +
        Speichert das übergebene Bild in der History.
        +
        +
        Parameters:
        +
        b - zu speicherndes Bild
        +
        +
      • +
      + + + +
        +
      • +

        back

        +
        public void back()
        +
        Ruft das letzte abgespeicherte Bild aus der History wieder auf.
        +
      • +
      + + + +
        +
      • +

        setZoom

        +
        public void setZoom​(double zoom)
        +
        Setzt den Zoom-Faktor für das Bild. + Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich.
        +
        +
        Parameters:
        +
        factor - Zoomfaktor (1.0 = 100%).
        +
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Setzt die automatische Neuanzeige des Bildes. + Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + die Methode refresh() auf.
        +
        +
        Parameters:
        +
        autoRefresh - true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        refresh

        +
        public void refresh()
        +
        Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + Anzeige automatisiert werden.
        +
      • +
      + + + +
        +
      • +

        repaint

        +
        public void repaint()
        +
        Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
        +
        +
        Overrides:
        +
        repaint in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        getImageWidth

        +
        public int getImageWidth()
        +
        Liefert die Breite des Bildes zurück.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getImageHeight

        +
        public int getImageHeight()
        +
        Liefert die Höhe des Bildes zurück.
        +
        +
        Returns:
        +
        Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefüllt werden sollen.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Löscht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefüllt.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        text

        +
        public void text​(java.lang.String t,
        +                 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:
        +
        t - 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
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/package-summary.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/package-summary.html new file mode 100644 index 0000000..4d7557e --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/imp/package-summary.html @@ -0,0 +1,54 @@ + + + + + +imp + + + + + + + + +
+
+

Package imp

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    PictureViewer +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen.
    +
    +
  • +
+
+
+ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/index.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/index.html new file mode 100644 index 0000000..ddcb119 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/index.html @@ -0,0 +1,23 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + +
+ +

imp/package-summary.html

+
+ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/logfile.txt b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/logfile.txt new file mode 100644 index 0000000..f39208c --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/logfile.txt @@ -0,0 +1,40 @@ +Class documentation +<---- javadoc command: ----> +E:\Programme\Informatik\BlueJ4.2\BlueJ\jdk\bin\javadoc.exe +-author +-version +-nodeprecated +-package +-Xdoclint:none +-noindex +-notree +-nohelp +-nonavbar +-source +11 +-classpath +E:\Programme\Informatik\BlueJ4.2\bluej\lib\bluejcore.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\junit-4.11.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\hamcrest-core-1.3.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\lang-stride.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.base.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.controls.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.fxml.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.graphics.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.media.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.properties.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.swing.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.web.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\+libs\jdom-1.1.3.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk +-d +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc +-encoding +windows-1252 +-charset +windows-1252 +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java +<---- end of javadoc command ----> +Loading source file F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java... +Constructing Javadoc information... +Standard Doclet version 11.0.2 +Building tree for all the packages and classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\PictureViewer.html... +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:123: warning - @param argument "b" is not a parameter name. +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:163: warning - @param argument "factor" is not a parameter name. +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\package-summary.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\constant-values.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\serialized-form.html... +Building index for all the packages and classes... +Building index for all classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\index.html... +2 warnings diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/script.js b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/script.js new file mode 100644 index 0000000..d33d3ab --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/script.js @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'jquery/jszip/dist/jszip.js'); + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils.js'); + if (window.navigator.userAgent.indexOf('MSIE ') > 0 || window.navigator.userAgent.indexOf('Trident/') > 0 || + window.navigator.userAgent.indexOf('Edge/') > 0) { + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); + } + createElem(doc, tag, 'search.js'); + + $.get(pathtoroot + "module-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "package-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "type-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "member-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "tag-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + }); + }); + if (!moduleSearchIndex) { + createElem(doc, tag, 'module-search-index.js'); + } + if (!packageSearchIndex) { + createElem(doc, tag, 'package-search-index.js'); + } + if (!typeSearchIndex) { + createElem(doc, tag, 'type-search-index.js'); + } + if (!memberSearchIndex) { + createElem(doc, tag, 'member-search-index.js'); + } + if (!tagSearchIndex) { + createElem(doc, tag, 'tag-search-index.js'); + } + $(window).resize(function() { + $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + }); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} + +function updateModuleFrame(pFrame, cFrame) { + top.packageFrame.location = pFrame; + top.classFrame.location = cFrame; +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/serialized-form.html b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/serialized-form.html new file mode 100644 index 0000000..26abcce --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/serialized-form.html @@ -0,0 +1,71 @@ + + + + + +Serialized Form + + + + + + + + +
+
+

Serialized Form

+
+
+
    +
  • +
    +

    Package imp

    +
      +
    • + + +

      Class imp.PictureViewer extends javax.swing.JFrame implements Serializable

      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          history

          +
          java.util.Vector<java.awt.image.BufferedImage> history
          +
        • +
        • +

          imagePane

          +
          javax.swing.JLabel imagePane
          +
        • +
        • +

          picture

          +
          imp.Picture picture
          +
        • +
        • +

          zoom

          +
          double zoom
          +
        • +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+ + diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/stylesheet.css b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/stylesheet.css new file mode 100644 index 0000000..c027275 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/doc/stylesheet.css @@ -0,0 +1,906 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +a[name]:before, a[name]:target, a[id]:before, a[id]:target { + content:""; + display:inline-block; + position:relative; + padding-top:129px; + margin-top:-129px; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} + +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.navPadding { + padding-top: 107px; +} +.fixedNav { + position:fixed; + width:100%; + z-index:999; + background-color:#ffffff; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch { + float:right; + margin:0 0 0 0; + padding:0; +} +ul.navListSearch li { + list-style:none; + float:right; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch li label { + position:relative; + right:-16px; +} +ul.subNavList li { + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Styles for page header and footer. + */ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexNav { + position:relative; + font-size:12px; + background-color:#dee3e9; +} +.indexNav ul { + margin-top:0; + padding:5px; +} +.indexNav ul li { + display:inline; + list-style-type:none; + padding-right:10px; + text-transform:uppercase; +} +.indexNav h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* + * Styles for page layout containers. + */ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, +.allClassesContainer, .allPackagesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary, +.requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption, +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.constantsSummary caption a:link, .deprecatedSummary caption a:link, +.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link, +.usesSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover, +.usesSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.constantsSummary caption a:active, .deprecatedSummary caption a:active, +.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active, +.usesSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.constantsSummary caption a:visited, .deprecatedSummary caption a:visited, +.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited, +.usesSummary caption a:visited { + color:#FFFFFF; +} +.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active, +.useSummary caption a:visited { + color:#1f389c; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, +.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, +.usesSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span, +.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span, +.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab, +.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab, +.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab, +.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd, +.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd, +.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd, +.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; +} +.rowColor th, .altColor th { + font-weight:normal; +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td, +.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, +.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, +.constantsSummary td { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th, +.packagesSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + font-size:13px; +} +td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast { + font-size:13px; +} +.constantsSummary th, .packagesSummary th { + font-size:13px; +} +.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, +.providesSummary td.colLast { + white-space:normal; + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.requiresSummary td.colFirst, .requiresSummary th.colFirst, +.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, +.usesSummary td.colFirst, .usesSummary th.colFirst, +.providesSummary td.colFirst, .providesSummary th.colFirst, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName, +.typeSummary td.colFirst, .typeSummary th.colFirst { + vertical-align:top; +} +.packagesSummary th.colLast, .packagesSummary td.colLast { + white-space:normal; +} +td.colFirst a:link, td.colFirst a:visited, +td.colSecond a:link, td.colSecond a:visited, +th.colFirst a:link, th.colFirst a:visited, +th.colSecond a:link, th.colSecond a:visited, +th.colConstructorName a:link, th.colConstructorName a:visited, +th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, +.constantValuesContainer td a:link, .constantValuesContainer td a:visited, +.allClassesContainer td a:link, .allClassesContainer td a:visited, +.allPackagesContainer td a:link, .allPackagesContainer td a:visited { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor, .altColor th { + background-color:#FFFFFF; +} +.rowColor, .rowColor th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.colLast div { + padding-top:0px; +} +td.colLast a { + padding-bottom:3px; +} +/* + * Styles for formatting effect. + */ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, +.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType, +.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel, +.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} +.deprecationBlock { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} +div.contentContainer ul.blockList li.blockList h2 { + padding-bottom:0px; +} +/* + * Styles for IFRAME. + */ +.mainContainer { + margin:0 auto; + padding:0; + height:100%; + width:100%; + position:fixed; + top:0; + left:0; +} +.leftContainer { + height:100%; + position:fixed; + width:320px; +} +.leftTop { + position:relative; + float:left; + width:315px; + top:0; + left:0; + height:30%; + border-right:6px solid #ccc; + border-bottom:6px solid #ccc; +} +.leftBottom { + position:relative; + float:left; + width:315px; + bottom:0; + left:0; + height:70%; + border-right:6px solid #ccc; + border-top:1px solid #000; +} +.rightContainer { + position:absolute; + left:320px; + top:0; + bottom:0; + height:100%; + right:0; + border-left:1px solid #000; +} +.rightIframe { + margin:0; + padding:0; + height:100%; + right:30px; + width:100%; + overflow:visible; + margin-bottom:30px; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.resultItem { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.resultHighlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:17px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.searchTagDescResult { + font-style:italic; + font-size:11px; +} +.searchTagHolderResult { + font-style:italic; + font-size:12px; +} +.searchTagResult:before, .searchTagResult:target { + color:red; +} +.moduleGraph span { + display:none; + position:absolute; +} +.moduleGraph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.methodSignature { + white-space:normal; +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum1.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum1.jpg new file mode 100644 index 0000000..7b35aab Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum1.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum2.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum2.jpg new file mode 100644 index 0000000..eec8a6d Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/baum2.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise.txt b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise.txt new file mode 100644 index 0000000..4317f8f --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise.txt @@ -0,0 +1,20 @@ +Eigenes Werk: +Baum1.jpg +Baum2.jpg +Iris.jpg +Katze.jpg +maske1.jpg +maske2.jpg +rosen_normal.jpg +rosen_ueberbelichtet.jpg +rosen_unterbelichtet.jpg + +Pixabay Licence: +https://pixabay.com/de/illustations/haus-häuser-finde-den-unterschied-3208132/ +unterschiedfinden1.png +unterschiedfinden2.png + +CC-BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5/deed.de) +Frenelsche Zonenplatte, +Georg Wiora via Wikimedia Commons +https://commons.wikimedia.org/wiki/File:Zonenplatte_Cosinus.png diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise2.txt b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise2.txt new file mode 100644 index 0000000..6ccd5c4 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/bildnachweise2.txt @@ -0,0 +1,21 @@ +Eigenes Werk: +Baum1.jpg +Baum2.jpg +Iris.jpg +Katze.jpg +maske1.jpg +maske2.jpg +rosen_normal.jpg +rosen_ueberbelichtet.jpg +rosen_unterbelichtet.jpg +testbild.png + +Pixabay Licence: +https://pixabay.com/de/illustations/haus-häuser-finde-den-unterschied-3208132/ +unterschiedfinden1.png +unterschiedfinden2.png + +CC-BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5/deed.de) +Frenelsche Zonenplatte, +Georg Wiora via Wikimedia Commons +https://commons.wikimedia.org/wiki/File:Zonenplatte_Cosinus.png diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/iris.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/iris.jpg new file mode 100644 index 0000000..94a072f Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/iris.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/katze.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/katze.jpg new file mode 100644 index 0000000..9215552 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/katze.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske1.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske1.jpg new file mode 100644 index 0000000..0014f30 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske1.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske2.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske2.jpg new file mode 100644 index 0000000..caf22ae Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/maske2.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_normal.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_normal.jpg new file mode 100644 index 0000000..76ebf34 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_normal.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_ueberbelichtet.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_ueberbelichtet.jpg new file mode 100644 index 0000000..e99fc12 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_ueberbelichtet.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_unterbelichtet.jpg b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_unterbelichtet.jpg new file mode 100644 index 0000000..8802f29 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/rosen_unterbelichtet.jpg differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/testbild.png b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/testbild.png new file mode 100644 index 0000000..c2dadda Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/testbild.png differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden1.png b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden1.png new file mode 100644 index 0000000..29c6c7e Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden1.png differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden2.png b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden2.png new file mode 100644 index 0000000..3e2ba53 Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/unterschiedfinden2.png differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/zonenplatte_cosinus.png b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/zonenplatte_cosinus.png new file mode 100644 index 0000000..43d2dfe Binary files /dev/null and b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/images/zonenplatte_cosinus.png differ diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/HSB.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/HSB.java new file mode 100644 index 0000000..b3ec83a --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/HSB.java @@ -0,0 +1,36 @@ +package imp; + +import java.awt.Color; + + +/** + * Write a description of class PixelColor here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class HSB +{ + + + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; +} + + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; +} + + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; +} + + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + + +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Picture.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Picture.java new file mode 100644 index 0000000..100fee8 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Picture.java @@ -0,0 +1,747 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + showInFrame(); + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + showInFrame(); + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + if(observer != null) observer.resize(); + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + public void setTitle (String titel) { + getObserver().setTitle(titel); + } + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + if(observer != null) observer.resize(); + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new java.awt.Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/PictureViewer.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/PictureViewer.java new file mode 100644 index 0000000..34b52bb --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/PictureViewer.java @@ -0,0 +1,221 @@ +package imp; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import javax.swing.*; +import javax.swing.event.*; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; + +/** + * Der PictureViewer ist ein JFrame, der in der Lage ist ein + * Objekt der Klasse Picture anzuzeigen. Zusätzlich können + * mehrere Verarbeitungsschritte gespeichert werden, um ein + * "zurück"-Funktion zu ermöglichen. + * + * @author Thomas Schaller + * @version V1.2 vom 06.12.2019 + */ +public class PictureViewer extends JFrame implements MouseWheelListener +{ + public static final int FIT = -1; + public static final int NORMAL = 1; + + private static final int ANZ_BACK = 0; + + private double zoom; + protected Picture picture = null; + private Vector history; + private JLabel imagePane = new JLabel(); + private JScrollPane scrollPane; + // private boolean antialiasing; + + /** + * Erzeugt ein ScrollPanel der Größe 500x400 + */ + public PictureViewer() { + this(800,500); + } + + /** + * Erzeugt ein ScrollPanel der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(new Picture(width, height)); + } + + public PictureViewer(Picture p) { + picture = p; + picture.setObserver(this); + this.history = new Vector(); + this.zoom = NORMAL; + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout()); + imagePane.setPreferredSize(new Dimension(p.getWidth(), p.getHeight())); + scrollPane = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); + scrollPane.setViewportView( imagePane ); + + cp.add(scrollPane, BorderLayout.CENTER); + pack(); + this.setVisible(true); + + repaint(); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (d.width - getSize().width); + //int x = 0; + int y = 0; + setLocation(x, y); + + scrollPane.addMouseWheelListener(this); + } + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + BufferedImage b = new BufferedImage(picture.getWidth(), picture.getHeight(), picture.getImage().getType()); + Graphics g = b.getGraphics(); + g.drawImage(picture.getImage(), 0, 0, null); + g.dispose(); + + history.add(b); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + private void popImage() { + int anz = history.size(); + if(anz>0) { + BufferedImage i = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(i); + repaint(); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + popImage(); + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double zoom) { + if(zoom>0.01 && zoom<10.0) { + this.zoom = zoom; + } + // else this.zoom = NORMAL; + resize(); + repaint(); + } + + // public void setAntialiasing(boolean antialiasing) { + // this.antialiasing = antialiasing; + // } + + /** + * Setzt die automatische Neuanzeige des Bildes. + * Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + * die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + * vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + * eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + * die Methode refresh() auf. + * @param autoRefresh true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll. + */ + public void setAutoRefresh(boolean autoRefresh) { + picture.setAutoRefresh(autoRefresh); + } + + /** + * Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + * wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + * Anzeige automatisiert werden. + */ + public void refresh() { + repaint(); + } + + /** + * Passt die Framegröße an das anzuzeigende Bild an. + */ + public void resize() { + int pref_x = (int) (picture.getWidth()*zoom); + int pref_y = (int) (picture.getHeight()*zoom); + imagePane.setPreferredSize(new Dimension(pref_x,pref_y)); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + if((pref_x > d.getWidth()-30) || (pref_y > d.getHeight()-100)) { + pref_x = Math.min(pref_x, (int) d.getWidth()-30); + pref_y = Math.min(pref_y, (int) d.getHeight()-100); + scrollPane.setPreferredSize(new Dimension(pref_x,pref_y)); + } else scrollPane.setPreferredSize(null); + + imagePane.revalidate(); + pack(); + } + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + + public void repaint() { + double faktor = zoom; + + if (zoom == FIT) { + double faktorw = (double) imagePane.getWidth() / picture.getWidth(); + double faktorh = (double) imagePane.getHeight() / picture.getHeight(); + faktor = Math.min(faktorw, faktorh); + } + int disp_width = (int) (picture.getWidth()*faktor); + int disp_height = (int) (picture.getHeight()*faktor); + + BufferedImage image = new BufferedImage(disp_width, disp_height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) image.getGraphics(); + + if(picture.isAntialiasing()) { + picture.antialise(); + } + else g.getRenderingHints().clear(); + + g.drawImage(picture.getImage(),0,0,disp_width, disp_height, 0, 0, picture.getWidth(), picture.getHeight(), null); + g.setColor(new java.awt.Color(0,0,0)); + g.setStroke(new BasicStroke((float) 1)); + g.drawRect(0,0,disp_width-1, disp_height-1); + + imagePane.setIcon(new ImageIcon(image)); + imagePane.repaint(); + + } + + /** Setzt ZoomFaktor über MouseWheel + * + */ + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + if ( notches < 0) { + setZoom(zoom * 1.1); + } else { + setZoom(zoom * 1.0/1.1); + } + } +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Table.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/XML.java b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/package.bluej b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/package.bluej new file mode 100644 index 0000000..0d38879 --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/imp/package.bluej @@ -0,0 +1,71 @@ +#BlueJ package file +dependency1.from=PictureViewer +dependency1.to=Picture +dependency1.type=UsesDependency +dependency2.from=Table +dependency2.to=TableRow +dependency2.type=UsesDependency +dependency3.from=Picture +dependency3.to=PictureViewer +dependency3.type=UsesDependency +objectbench.height=89 +objectbench.width=565 +package.divider.horizontal=0.6 +package.divider.vertical=0.808 +package.editor.height=397 +package.editor.width=475 +package.editor.x=561 +package.editor.y=305 +package.frame.height=600 +package.frame.width=605 +package.numDependencies=3 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=PictureViewer +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=Table +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=120 +target2.y=110 +target3.height=50 +target3.name=HSB +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=10 +target3.y=90 +target4.height=50 +target4.name=Picture +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=180 +target4.y=250 +target5.height=50 +target5.name=XML +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=220 +target5.y=130 +target6.height=50 +target6.name=TableRow +target6.showInterface=false +target6.type=ClassTarget +target6.width=90 +target6.x=220 +target6.y=60 diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/package.bluej b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/package.bluej new file mode 100644 index 0000000..d9574aa --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/package.bluej @@ -0,0 +1,46 @@ +#BlueJ package file +editor.fx.0.height=739 +editor.fx.0.width=816 +editor.fx.0.x=552 +editor.fx.0.y=100 +objectbench.height=142 +objectbench.width=815 +package.divider.horizontal=0.5995115995115995 +package.divider.vertical=0.6902286902286903 +package.editor.height=325 +package.editor.width=725 +package.editor.x=326 +package.editor.y=348 +package.frame.height=581 +package.frame.width=855 +package.numDependencies=0 +package.numTargets=3 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +project.invoke.thread=FX +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Beispielbild +target1.showInterface=false +target1.type=ClassTarget +target1.width=100 +target1.x=20 +target1.y=110 +target2.height=62 +target2.name=imp +target2.type=PackageTarget +target2.width=80 +target2.x=80 +target2.y=10 +target3.height=50 +target3.name=GeometrischeBildoperationen +target3.showInterface=false +target3.type=ClassTarget +target3.width=210 +target3.x=260 +target3.y=110 diff --git a/3_vorlagen_tauschordner/01_geometrische_bildoperationen/readme.txt b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/readme.txt new file mode 100644 index 0000000..5ed6d4e --- /dev/null +++ b/3_vorlagen_tauschordner/01_geometrische_bildoperationen/readme.txt @@ -0,0 +1,12 @@ +Sollte es bei der Ausführung des Projekts zu folgender Fehlermeldung kommen: +java.lang.IllegalStateException: Toolkit not initialized + at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273) + at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268) + at javafx.application.Platform.runLater(Platform.java:83) + at bluej.runtime.ExecServer.runOnTargetThread(ExecServer.java:902) + at bluej.runtime.ExecServer.access$700(ExecServer.java:78) + at bluej.runtime.ExecServer$3.run(ExecServer.java:787) + +dann lösen Sie das Problem, indem Sie entweder +a) die neuste BlueJ-Version installieren. +b) in BlueJ unter Werkzeuge->Einstellungen->Diverses->Run user code in this project on thread: "Default" wählen (BlueJ Version 4.1.2) diff --git a/3_vorlagen_tauschordner/01_gui_erstellen_0.mp4 b/3_vorlagen_tauschordner/01_gui_erstellen_0.mp4 new file mode 100644 index 0000000..0813640 Binary files /dev/null and b/3_vorlagen_tauschordner/01_gui_erstellen_0.mp4 differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/LICENSE.txt b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/BildbearbeitungGUI.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/BildbearbeitungGUI.java new file mode 100644 index 0000000..0834996 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/BildbearbeitungGUI.java @@ -0,0 +1,28 @@ +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class BildbearbeitungGUI extends Application { + + @Override + public void start(Stage primaryStage) { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("view/Test.fxml")); + VBox root = (VBox) loader.load(); + Scene scene = new Scene(root); + + primaryStage.setScene(scene); + primaryStage.show(); + } + catch(Exception e) { + System.out.println(e); + e.printStackTrace(); + } + } + public static void main(String[] args) { + launch(args); + } +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise.txt b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise.txt new file mode 100644 index 0000000..4317f8f --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise.txt @@ -0,0 +1,20 @@ +Eigenes Werk: +Baum1.jpg +Baum2.jpg +Iris.jpg +Katze.jpg +maske1.jpg +maske2.jpg +rosen_normal.jpg +rosen_ueberbelichtet.jpg +rosen_unterbelichtet.jpg + +Pixabay Licence: +https://pixabay.com/de/illustations/haus-häuser-finde-den-unterschied-3208132/ +unterschiedfinden1.png +unterschiedfinden2.png + +CC-BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5/deed.de) +Frenelsche Zonenplatte, +Georg Wiora via Wikimedia Commons +https://commons.wikimedia.org/wiki/File:Zonenplatte_Cosinus.png diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise2.txt b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise2.txt new file mode 100644 index 0000000..6ccd5c4 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/bildnachweise2.txt @@ -0,0 +1,21 @@ +Eigenes Werk: +Baum1.jpg +Baum2.jpg +Iris.jpg +Katze.jpg +maske1.jpg +maske2.jpg +rosen_normal.jpg +rosen_ueberbelichtet.jpg +rosen_unterbelichtet.jpg +testbild.png + +Pixabay Licence: +https://pixabay.com/de/illustations/haus-häuser-finde-den-unterschied-3208132/ +unterschiedfinden1.png +unterschiedfinden2.png + +CC-BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5/deed.de) +Frenelsche Zonenplatte, +Georg Wiora via Wikimedia Commons +https://commons.wikimedia.org/wiki/File:Zonenplatte_Cosinus.png diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/iris.jpg b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/iris.jpg new file mode 100644 index 0000000..94a072f Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/iris.jpg differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/katze.jpg b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/katze.jpg new file mode 100644 index 0000000..9215552 Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/katze.jpg differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_normal.jpg b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_normal.jpg new file mode 100644 index 0000000..76ebf34 Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_normal.jpg differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_ueberbelichtet.jpg b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_ueberbelichtet.jpg new file mode 100644 index 0000000..e99fc12 Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_ueberbelichtet.jpg differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_unterbelichtet.jpg b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_unterbelichtet.jpg new file mode 100644 index 0000000..8802f29 Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/rosen_unterbelichtet.jpg differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/testbild.png b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/testbild.png new file mode 100644 index 0000000..c2dadda Binary files /dev/null and b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/images/testbild.png differ diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/HSB.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/HSB.java new file mode 100644 index 0000000..b3ec83a --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/HSB.java @@ -0,0 +1,36 @@ +package imp; + +import java.awt.Color; + + +/** + * Write a description of class PixelColor here. + * + * @author (your name) + * @version (a version number or a date) + */ +public class HSB +{ + + + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; +} + + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; +} + + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; +} + + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + + +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/NumberTextField.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/NumberTextField.java new file mode 100644 index 0000000..643ae60 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/NumberTextField.java @@ -0,0 +1,43 @@ +package imp; + +import javafx.scene.control.TextField; + +public class NumberTextField extends TextField { + + @Override public void replaceText(int start, int end, String text) { + if (text.matches("[0-9.]") || text == "") { + super.replaceText(start, end, text); + } + } + + @Override public void replaceSelection(String text) { + if (text.matches("[0-9.]") || text == "") { + super.replaceSelection(text); + } + } + + public double getDoubleValue() { + try{ + return Double.parseDouble(this.getText()); + } catch(Exception e) { + return 0.0; + } + } + + public int getIntValue() { + try{ + return Integer.parseInt(this.getText()); + } catch(Exception e) { + return 0; + } + } + + public void setValue(double v) { + setText(""+v); + } + + public void setValue(int v) { + setText(""+v); + } + +} \ No newline at end of file diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Picture.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Picture.java new file mode 100644 index 0000000..3148dee --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Picture.java @@ -0,0 +1,744 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/PictureViewer.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/PictureViewer.java new file mode 100644 index 0000000..801421d --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/PictureViewer.java @@ -0,0 +1,206 @@ +package imp; + +/** + * Zeigt ein Bild in einem Scrollbereich an. + * Es ist möglich das Bild zu zoomen und mehrere Versionen des Bildes zu speichern, um eine "Rückgängig" Operation durchzuführen. + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import javafx.scene.control.ScrollPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.embed.swing.SwingFXUtils; +import java.util.Vector; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.WritableRaster; + +public class PictureViewer extends ScrollPane +{ + + // das aktuelle Bild + private Picture picture; + + // Bilder für den Züruck-Modus speichern + private static final int ANZ_BACK = 20; + private Vector history; + + // Zeichenfläche + private Image scrollImageIcon; + private ImageView imageLabel; + + // Zoom Faktor + private double zoomFactor; + public static final int FIT = -1; + public static final int NORMAL = 1; + + + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der Größe 1000x1000 + */ + public PictureViewer() { + this(1000,1000); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + * @param background Farbe des Hintergrunds als HEX-String (z.B. "FF3A45") + */ + public PictureViewer(int width, int height, String background) { + this(new Picture(width,height, background)); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei + * @param filename Name des Bildes + */ + public PictureViewer(String filename) { + this(new Picture(filename)); + } + + /** + * Erzeugt ein ScrollPanel und zeigt das Bild-Objekt an + * @param picture anzuzeigendes Bild + */ + public PictureViewer(Picture picture) + { + this.picture=picture; + + zoomFactor=1; + + scrollImageIcon = SwingFXUtils.toFXImage(picture.getImage(), null); + //new Image(picture.getImage().getScaledInstance(picture.getImage().getWidth(), picture.getImage().getHeight(), Image.SCALE_FAST)); + imageLabel = new ImageView(scrollImageIcon); + imageLabel.setPreserveRatio(true); +// imageLabel.setVerticalAlignment(JLabel.CENTER); +// imageLabel.setHorizontalAlignment(JLabel.CENTER); + setContent(imageLabel); + +// this.setBorder(BorderFactory.createLineBorder(Color.black)); + picture.setObserver(this); + history = new Vector(); + + } + + + /** + * Setzt das anzuzeigende Bild neu + * @param picture anzuzeigendes Bild + * @param saveOldImage soll das aktuelle Bild in der Historie gespeichert werden + */ + public void setImage(Picture picture, boolean saveOldImage) { + if (saveOldImage) pushImage(); + this.picture = picture; + repaint(); + } + + /** + * Liefert das angezeigte Bild + * @return angezeigtes Bild + */ + public Picture getImage() { + return this.picture; + } + + + + + /** + * Erzeugt eine Kopie eines BufferedImage. + * @param Originalbild + * @return Kopie des Bildes + */ + private BufferedImage deepCopy(BufferedImage bi) { + ColorModel cm = bi.getColorModel(); + boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); + WritableRaster raster = bi.copyData(null); + return new BufferedImage(cm, raster, isAlphaPremultiplied, null).getSubimage(0, 0, bi.getWidth(), bi.getHeight()); + } + + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + history.add(deepCopy(picture.getImage())); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + int anz = history.size(); + if(anz>0) { + BufferedImage img = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(img); + repaint(); + } + } + + + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + public void repaint() { + if( picture != null) { + double factor= zoomFactor; + if (zoomFactor == FIT) { + double factorw = ((double) getWidth()-2) / picture.getWidth(); + double factorh = ((double) getHeight()-2) / picture.getHeight(); + factor = Math.min(factorw, factorh); + } + int width = (int) (picture.getWidth()*factor); + int height = (int) (picture.getHeight()*factor); + + scrollImageIcon = SwingFXUtils.toFXImage(picture.getImage(), null); + imageLabel.setFitWidth(width); + imageLabel.setFitHeight(height); + imageLabel.setImage(scrollImageIcon); + + //new Image(picture.getImage().getScaledInstance(picture.getImage().getWidth(), picture.getImage().getHeight(), Image.SCALE_FAST)); +// imageLabel = new ImageView(scrollImageIcon); + + // scrollImageIcon.setImage(picture.getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT)); + // revalidate(); + } + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double factor) + { + zoomFactor = factor; + repaint(); + } + + + + + + +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Table.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/XML.java b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/package.bluej b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/package.bluej new file mode 100644 index 0000000..00021b9 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/imp/package.bluej @@ -0,0 +1,78 @@ +#BlueJ package file +dependency1.from=PictureViewer +dependency1.to=Picture +dependency1.type=UsesDependency +dependency2.from=Picture +dependency2.to=PictureViewer +dependency2.type=UsesDependency +dependency3.from=Table +dependency3.to=TableRow +dependency3.type=UsesDependency +objectbench.height=84 +objectbench.width=804 +package.divider.horizontal=0.6 +package.divider.vertical=0.818 +package.editor.height=402 +package.editor.width=714 +package.editor.x=430 +package.editor.y=27 +package.frame.height=600 +package.frame.width=844 +package.numDependencies=3 +package.numTargets=7 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=PictureViewer +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=NumberTextField +target2.showInterface=false +target2.type=ClassTarget +target2.width=130 +target2.x=380 +target2.y=70 +target3.height=50 +target3.name=Table +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=120 +target3.y=110 +target4.height=50 +target4.name=HSB +target4.showInterface=false +target4.type=ClassTarget +target4.width=90 +target4.x=40 +target4.y=200 +target5.height=50 +target5.name=Picture +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=180 +target5.y=250 +target6.height=50 +target6.name=XML +target6.showInterface=false +target6.type=ClassTarget +target6.width=80 +target6.x=220 +target6.y=130 +target7.height=50 +target7.name=TableRow +target7.showInterface=false +target7.type=ClassTarget +target7.width=90 +target7.x=220 +target7.y=60 diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/package.bluej b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/package.bluej new file mode 100644 index 0000000..5c69294 --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/package.bluej @@ -0,0 +1,39 @@ +#BlueJ package file +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 +objectbench.height=93 +objectbench.width=760 +package.divider.horizontal=0.6 +package.divider.vertical=0.8 +package.editor.height=393 +package.editor.width=670 +package.editor.x=712 +package.editor.y=240 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=2 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +project.invoke.thread=FX +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=BildbearbeitungGUI +target1.showInterface=false +target1.type=ClassTarget +target1.width=150 +target1.x=20 +target1.y=90 +target2.height=62 +target2.name=imp +target2.type=PackageTarget +target2.width=80 +target2.x=70 +target2.y=10 diff --git a/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/readme.txt b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/readme.txt new file mode 100644 index 0000000..5ed6d4e --- /dev/null +++ b/3_vorlagen_tauschordner/02_bildbearbeitungsprogramm/readme.txt @@ -0,0 +1,12 @@ +Sollte es bei der Ausführung des Projekts zu folgender Fehlermeldung kommen: +java.lang.IllegalStateException: Toolkit not initialized + at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273) + at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268) + at javafx.application.Platform.runLater(Platform.java:83) + at bluej.runtime.ExecServer.runOnTargetThread(ExecServer.java:902) + at bluej.runtime.ExecServer.access$700(ExecServer.java:78) + at bluej.runtime.ExecServer$3.run(ExecServer.java:787) + +dann lösen Sie das Problem, indem Sie entweder +a) die neuste BlueJ-Version installieren. +b) in BlueJ unter Werkzeuge->Einstellungen->Diverses->Run user code in this project on thread: "Default" wählen (BlueJ Version 4.1.2) diff --git a/3_vorlagen_tauschordner/02_gui_erstellen_1.mp4 b/3_vorlagen_tauschordner/02_gui_erstellen_1.mp4 new file mode 100644 index 0000000..f2e4a35 Binary files /dev/null and b/3_vorlagen_tauschordner/02_gui_erstellen_1.mp4 differ diff --git a/3_vorlagen_tauschordner/03_gui_erstellen_2.mp4 b/3_vorlagen_tauschordner/03_gui_erstellen_2.mp4 new file mode 100644 index 0000000..7acf603 Binary files /dev/null and b/3_vorlagen_tauschordner/03_gui_erstellen_2.mp4 differ diff --git a/3_vorlagen_tauschordner/04_gui_erstellen_3.mp4 b/3_vorlagen_tauschordner/04_gui_erstellen_3.mp4 new file mode 100644 index 0000000..bcef1c3 Binary files /dev/null and b/3_vorlagen_tauschordner/04_gui_erstellen_3.mp4 differ diff --git a/3_vorlagen_tauschordner/05_gui_erstellen_4.mp4 b/3_vorlagen_tauschordner/05_gui_erstellen_4.mp4 new file mode 100644 index 0000000..b54ebba Binary files /dev/null and b/3_vorlagen_tauschordner/05_gui_erstellen_4.mp4 differ diff --git a/3_vorlagen_tauschordner/06_gui_erstellen_5.mp4 b/3_vorlagen_tauschordner/06_gui_erstellen_5.mp4 new file mode 100644 index 0000000..b4e14fa Binary files /dev/null and b/3_vorlagen_tauschordner/06_gui_erstellen_5.mp4 differ diff --git a/3_vorlagen_tauschordner/07_gui_erstellen_6.mp4 b/3_vorlagen_tauschordner/07_gui_erstellen_6.mp4 new file mode 100644 index 0000000..ac6dd10 Binary files /dev/null and b/3_vorlagen_tauschordner/07_gui_erstellen_6.mp4 differ diff --git a/3_vorlagen_tauschordner/08_gui_erstellen_7.mp4 b/3_vorlagen_tauschordner/08_gui_erstellen_7.mp4 new file mode 100644 index 0000000..a41e696 Binary files /dev/null and b/3_vorlagen_tauschordner/08_gui_erstellen_7.mp4 differ diff --git a/3_vorlagen_tauschordner/09_gui_erstellen_8.mp4 b/3_vorlagen_tauschordner/09_gui_erstellen_8.mp4 new file mode 100644 index 0000000..daf7146 Binary files /dev/null and b/3_vorlagen_tauschordner/09_gui_erstellen_8.mp4 differ diff --git a/3_vorlagen_tauschordner/10_gui_erstellen_9.mp4 b/3_vorlagen_tauschordner/10_gui_erstellen_9.mp4 new file mode 100644 index 0000000..78d9a6a Binary files /dev/null and b/3_vorlagen_tauschordner/10_gui_erstellen_9.mp4 differ diff --git a/3_vorlagen_tauschordner/10_optionenanzeigen.java b/3_vorlagen_tauschordner/10_optionenanzeigen.java new file mode 100644 index 0000000..2ff9b3f --- /dev/null +++ b/3_vorlagen_tauschordner/10_optionenanzeigen.java @@ -0,0 +1,22 @@ + void optionenAnzeigen(String fxmlFile) { + try { // try-catch ist notwendig, um Fehler durch fehlende Dateien abzufangen. + + // + if(hauptbereich.getChildren().size()>1) { + viewer.back(); // + hauptbereich.getChildren().remove(1); // + } + + // + FXMLLoader loader = new FXMLLoader( + getClass().getResource("view/"+fxmlFile)); + loader.setController(this); + VBox filterFenster = (VBox) loader.load(); + + // + hauptbereich.getChildren().add(filterFenster); + } + catch(Exception e) { + System.out.println(e); + } + } \ No newline at end of file diff --git a/3_vorlagen_tauschordner/11_gui_erstellen_10.mp4 b/3_vorlagen_tauschordner/11_gui_erstellen_10.mp4 new file mode 100644 index 0000000..1d78c6f Binary files /dev/null and b/3_vorlagen_tauschordner/11_gui_erstellen_10.mp4 differ diff --git a/3_vorlagen_tauschordner/12_histogramme.ods b/3_vorlagen_tauschordner/12_histogramme.ods new file mode 100644 index 0000000..d90006a Binary files /dev/null and b/3_vorlagen_tauschordner/12_histogramme.ods differ diff --git a/3_vorlagen_tauschordner/13_drehungxachse.ggb b/3_vorlagen_tauschordner/13_drehungxachse.ggb new file mode 100644 index 0000000..5851a79 Binary files /dev/null and b/3_vorlagen_tauschordner/13_drehungxachse.ggb differ diff --git a/3_vorlagen_tauschordner/14_drehungyachse.ggb b/3_vorlagen_tauschordner/14_drehungyachse.ggb new file mode 100644 index 0000000..ba0c9f8 Binary files /dev/null and b/3_vorlagen_tauschordner/14_drehungyachse.ggb differ diff --git a/3_vorlagen_tauschordner/15_drehungallgemein.ggb b/3_vorlagen_tauschordner/15_drehungallgemein.ggb new file mode 100644 index 0000000..acae3b2 Binary files /dev/null and b/3_vorlagen_tauschordner/15_drehungallgemein.ggb differ diff --git a/3_vorlagen_tauschordner/16_impkomponenten/16_impkomponenten.jar b/3_vorlagen_tauschordner/16_impkomponenten/16_impkomponenten.jar new file mode 100644 index 0000000..61cbfd5 Binary files /dev/null and b/3_vorlagen_tauschordner/16_impkomponenten/16_impkomponenten.jar differ diff --git a/4_loesungen/01_alg_bilderalsarray_loesung.odt b/4_loesungen/01_alg_bilderalsarray_loesung.odt new file mode 100644 index 0000000..22a5110 Binary files /dev/null and b/4_loesungen/01_alg_bilderalsarray_loesung.odt differ diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/LICENSE.txt b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/+libs/jdom-1.1.3.jar differ diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/Beispielbild.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/Beispielbild.java new file mode 100644 index 0000000..11da2dc --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/Beispielbild.java @@ -0,0 +1,28 @@ +import imp.*; +import java.io.File; +/** + * Klasse für Beispielbilder + * + * @author Thomas Schaller + * @version v1.0 (28.11.2019) + */ +public class Beispielbild extends Picture +{ + + /** + * Konstruktor: öffnet das Bild katze.jpg + */ + public Beispielbild() + { + super("iris.jpg"); + } + + public void load(String dateiname) { + super.load("images/"+dateiname); + } + + public void save(String dateiname) { + super.save("images/"+dateiname); + } + +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/GeometrischeBildoperationen.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/GeometrischeBildoperationen.java new file mode 100644 index 0000000..9aaaebc --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/GeometrischeBildoperationen.java @@ -0,0 +1,115 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen zur Änderung der Pixelpositionen eines Pictures + * z.B. drehen, spiegeln usw. + * + * @author Thomas Schaller + * @version 1.1 (28.11.2019) + */ +public class GeometrischeBildoperationen +{ + /** spiegeleHorizontal spiegelt das Bild, so dass rechts und links getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelHorizontal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(breite-1)-x][y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** spiegeleHorizontal spiegelt das Bild, so dass oben und unten getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelVertikal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[x][(hoehe-1)-y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + /** dreheRechts dreht das Bild um 90° nach rechts + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + + public Picture dreheRechts(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[y][(breite-1)-x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** dreheLinks dreht das Bild um 90° nach links + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture dreheLinks(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(hoehe-1)-y][x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + + } + + /** drehe180 dreht das Bild um 180° + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture drehe180(Picture originalbild) { + Picture bild90 = dreheLinks(originalbild); + Picture bild180 = dreheLinks(bild90); + return bild180; + } + +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/allclasses.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/allclasses.html new file mode 100644 index 0000000..47b80da --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/allclasses.html @@ -0,0 +1,20 @@ + + + + + +All Classes + + + + + + +

All Classes

+
+ +
+ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/constant-values.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/constant-values.html new file mode 100644 index 0000000..67a232a --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/constant-values.html @@ -0,0 +1,73 @@ + + + + + +Constant Field Values + + + + + + + + +
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+ + +
+

imp.*

+
    +
  • + + + + + + + + + + + + + + + + + + + +
    imp.PictureViewer 
    Modifier and TypeConstant FieldValue
    + +public static final intFIT-1
    + +public static final intNORMAL1
    +
  • +
+
+
+
+ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/element-list b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/element-list new file mode 100644 index 0000000..6711e1c --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/element-list @@ -0,0 +1 @@ +imp diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/Picture.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/Picture.html new file mode 100644 index 0000000..7f2a95d --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/Picture.html @@ -0,0 +1,1276 @@ + + + + + +Picture + + + + + + + + + +
+
+
Package imp
+

Class Picture

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • imp.Picture
    • +
    +
  • +
+
+
    +
  • +
    +
    public class Picture
    +extends java.lang.Object
    +
    Bildklasse fuer die Simulation von Processing-Befehlen + + Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + werden kann. + Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt.
    +
    +
    Version:
    +
    1.0 from 23.01.2019
    +
    Author:
    +
    Thomas Schaller (ZPG Informatik Klasse 9)
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intCENTER 
      static intCORNER 
      static intCORNERS 
      static intRADIUS 
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Picture() +
      Erzeugt ein Bild mit Standardgroesse 500x400
      +
      Picture​(int width, + int height) +
      Erzeugt ein Bild der angegeben Groesse
      +
      Picture​(int width, + int height, + java.lang.String background) +
      Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
      +
      Picture​(java.lang.String filename) +
      Erzeugt ein Bild aus einer Datei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Loescht den Inhalt des Bildes.
      +
      voiddelay​(int millis) +
      Hilfsfunktion zum Verzoegern der Ausgabe
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidforceRepaint() +
      Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
      +
      intgetHeight() +
      Liefert die Hoehe des Bildes zurueck.
      +
      java.awt.image.BufferedImagegetImage() +
      Direktes Abfragen des Bildes (fuer interne Zwecke)
      +
      imp.PictureViewergetObserver() 
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      intgetWidth() +
      Liefert die Breite des Bildes zurueck.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Laedt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefuellt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird.
      +
      voidsetImage​(java.awt.image.BufferedImage b) +
      Direktes Setzen des Bildes (fuer interne Zwecke)
      +
      voidsetObserver​(imp.PictureViewer observer) +
      Legt fest, wer das Bild anzeigt.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetTitle​(java.lang.String titel) 
      voidshowInFrame() 
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String s, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart fuer Textausgaben fest.
      +
      voidtriangle​(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, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Picture

        +
        public Picture()
        +
        Erzeugt ein Bild mit Standardgroesse 500x400
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height)
        +
        Erzeugt ein Bild der angegeben Groesse
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(java.lang.String filename)
        +
        Erzeugt ein Bild aus einer Datei
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height,
        +               java.lang.String background)
        +
        Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        background - Farbe des Hintergrunds
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        showInFrame

        +
        public void showInFrame()
        +
      • +
      + + + +
        +
      • +

        setObserver

        +
        public void setObserver​(imp.PictureViewer observer)
        +
        Legt fest, wer das Bild anzeigt. + Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert.
        +
        +
        Parameters:
        +
        observer - Anzeiger des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getObserver

        +
        public imp.PictureViewer getObserver()
        +
      • +
      + + + +
        +
      • +

        setImage

        +
        public void setImage​(java.awt.image.BufferedImage b)
        +
        Direktes Setzen des Bildes (fuer interne Zwecke)
        +
        +
        Parameters:
        +
        b - Bild, das gespeichert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        getImage

        +
        public java.awt.image.BufferedImage getImage()
        +
        Direktes Abfragen des Bildes (fuer interne Zwecke)
        +
        +
        Returns:
        +
        Bild, das gerade gespeichert ist.
        +
        +
      • +
      + + + +
        +
      • +

        size

        +
        public void size​(int width,
        +                 int height)
        +
        Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu.
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getWidth

        +
        public int getWidth()
        +
        Liefert die Breite des Bildes zurueck.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getHeight

        +
        public int getHeight()
        +
        Liefert die Hoehe des Bildes zurueck.
        +
        +
        Returns:
        +
        Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        setTitle

        +
        public void setTitle​(java.lang.String titel)
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden.
        +
        +
        Parameters:
        +
        autorefresh - true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen
        +
        +
      • +
      + + + +
        +
      • +

        forceRepaint

        +
        public void forceRepaint()
        +
        Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Loescht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt.
        +
      • +
      + + + +
        +
      • +

        rectMode

        +
        public void rectMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        ellipseMode

        +
        public void ellipseMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        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 einzufaerben, verwenden Sie die stroke() Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + strokeWeight() geaendert 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
        +
        +
      • +
      + + + +
        +
      • +

        rect

        +
        public void rect​(int a,
        +                 int b,
        +                 int c,
        +                 int d)
        +
        Zeichnet ein Rechteck auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion rectMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        b - meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch rectMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        ellipse

        +
        public void ellipse​(int a,
        +                    int b,
        +                    int c,
        +                    int d)
        +
        Zeichnet eine Ellipse/Kreis auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion ellipseMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        b - meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + sind nicht auf neunzig Grad beschraenkt. 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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        x - Liste der x-Koordinaten der Punkte.
        +
        y - Liste der y-Koordinaten der Punkte.
        +
        +
      • +
      + + + +
        +
      • +

        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 fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt.
        +
        +
        Parameters:
        +
        x - x-Koordinate des Punktes
        +
        y - y-Koordinate des Punktes
        +
        +
      • +
      + + + +
        +
      • +

        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 ausgewaehlte 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 fuer Textausgaben fest. + Jeder uebliche 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
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(java.lang.String pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        pencolor - Stiftfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(int pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 weiss, 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 Raender um Formen gezeichnet werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Stiftfarbe
        +
        g - Gruenanteil (0-255) der Stiftfarbe
        +
        b - Blauanteil (0-255) der Stiftfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        strokeWeight

        +
        public void strokeWeight​(double width)
        +
        Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + Alle Breiten werden in Pixeleinheiten angegeben.
        +
        +
        Parameters:
        +
        width - Breite in Pixel
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(java.lang.String fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(int fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 gefuellt werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Fuellfarbe
        +
        g - Gruenanteil (0-255) der Fuellfarbe
        +
        b - Blauanteil (0-255) der Fuellfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefuellt werden sollen.
        +
      • +
      + + + +
        +
      • +

        background

        +
        public void background​(int c)
        +
        Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        c - Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Hintergrundfarbe
        +
        g - Gruenanteil (0-255) der Hintergrundfarbe
        +
        b - Blauanteil (0-255) der Hintergrundfarbe
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        public void load​(java.lang.String filename)
        +
        Laedt ein Bild aus dem Dateisystem. + Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        public void save​(java.lang.String filename)
        +
        Speichert ein Bild. + Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        setPixelArray

        +
        public void setPixelArray​(java.awt.Color[][] pixel)
        +
        Setzt das Bild neu auf Basis des Pixel-Arrays. + Die Groesse des Bildes wird nicht automatisch an das Array angepasst.
        +
        +
        Parameters:
        +
        pixel - zweidimensionales Array von Color-Objekten
        +
        +
      • +
      + + + +
        +
      • +

        delay

        +
        public void delay​(int millis)
        +
        Hilfsfunktion zum Verzoegern der Ausgabe
        +
        +
        Parameters:
        +
        millis - Wartezeit in Millisekunden
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/PictureViewer.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/PictureViewer.html new file mode 100644 index 0000000..af51632 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/PictureViewer.html @@ -0,0 +1,1371 @@ + + + + + +PictureViewer + + + + + + + + + +
+
+
Package imp
+

Class PictureViewer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • java.awt.Window
        • +
        • +
            +
          • java.awt.Frame
          • +
          • +
              +
            • javax.swing.JFrame
            • +
            • +
                +
              • imp.PictureViewer
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants
    +
    +
    +
    public class PictureViewer
    +extends javax.swing.JFrame
    +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen. Zusätzlich können + mehrere Verarbeitungsschritte gespeichert werden, um ein + "zurück"-Funktion zu ermöglichen.
    +
    +
    Version:
    +
    V1.0 vom 10.02.2019
    +
    Author:
    +
    Thomas Schaller
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JFrame

        +javax.swing.JFrame.AccessibleJFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Frame

        +java.awt.Frame.AccessibleAWTFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Window

        +java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFIT 
      static intNORMAL 
      protected imp.Picturepicture 
      +
        +
      • + + +

        Fields inherited from class javax.swing.JFrame

        +accessibleContext, rootPane, rootPaneCheckingEnabled
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Frame

        +ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
        +
      • + + +

        Fields inherited from interface javax.swing.WindowConstants

        +DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      PictureViewer() +
      Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
      +
      PictureViewer​(int width, + int height) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(int width, + int height, + java.lang.String background) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(imp.Picture p) 
      PictureViewer​(java.lang.String filename) +
      Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidback() +
      Ruft das letzte abgespeicherte Bild aus der History wieder auf.
      +
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Löscht den Inhalt des Bildes.
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      intgetImageHeight() +
      Liefert die Höhe des Bildes zurück.
      +
      intgetImageWidth() +
      Liefert die Breite des Bildes zurück.
      +
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Lädt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefüllt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidpushImage() +
      Speichert das übergebene Bild in der History.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidrefresh() +
      Sorgt für die Aktualisierung der Bildschrimanzeige.
      +
      voidrepaint() +
      Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Setzt die automatische Neuanzeige des Bildes.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetZoom​(double zoom) +
      Setzt den Zoom-Faktor für das Bild.
      +
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String t, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewählte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart für Textausgaben fest.
      +
      voidtriangle​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +
      Zeichnet ein Dreieck auf das Bild.
      +
      +
        +
      • + + +

        Methods inherited from class javax.swing.JFrame

        +addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Frame

        +addNotify, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Window

        +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, toBack, toFront
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, list, list, paintComponents, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, hasFocus, imageUpdate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, list, list, list, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.MenuContainer

        +getFont
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer()
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height,
        +                     java.lang.String background)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        background - Farbe des Hintergrunds als HEX-String (z.B. "FF3A45")
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(java.lang.String filename)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
        +
        +
        Parameters:
        +
        filename - Name des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(imp.Picture p)
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        pushImage

        +
        public void pushImage()
        +
        Speichert das übergebene Bild in der History.
        +
        +
        Parameters:
        +
        b - zu speicherndes Bild
        +
        +
      • +
      + + + +
        +
      • +

        back

        +
        public void back()
        +
        Ruft das letzte abgespeicherte Bild aus der History wieder auf.
        +
      • +
      + + + +
        +
      • +

        setZoom

        +
        public void setZoom​(double zoom)
        +
        Setzt den Zoom-Faktor für das Bild. + Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich.
        +
        +
        Parameters:
        +
        factor - Zoomfaktor (1.0 = 100%).
        +
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Setzt die automatische Neuanzeige des Bildes. + Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + die Methode refresh() auf.
        +
        +
        Parameters:
        +
        autoRefresh - true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        refresh

        +
        public void refresh()
        +
        Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + Anzeige automatisiert werden.
        +
      • +
      + + + +
        +
      • +

        repaint

        +
        public void repaint()
        +
        Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
        +
        +
        Overrides:
        +
        repaint in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        getImageWidth

        +
        public int getImageWidth()
        +
        Liefert die Breite des Bildes zurück.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getImageHeight

        +
        public int getImageHeight()
        +
        Liefert die Höhe des Bildes zurück.
        +
        +
        Returns:
        +
        Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefüllt werden sollen.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Löscht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefüllt.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        text

        +
        public void text​(java.lang.String t,
        +                 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:
        +
        t - 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
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/package-summary.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/package-summary.html new file mode 100644 index 0000000..4d7557e --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/imp/package-summary.html @@ -0,0 +1,54 @@ + + + + + +imp + + + + + + + + +
+
+

Package imp

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    PictureViewer +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen.
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/index.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/index.html new file mode 100644 index 0000000..ddcb119 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/index.html @@ -0,0 +1,23 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + +
+ +

imp/package-summary.html

+
+ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/logfile.txt b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/logfile.txt new file mode 100644 index 0000000..f39208c --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/logfile.txt @@ -0,0 +1,40 @@ +Class documentation +<---- javadoc command: ----> +E:\Programme\Informatik\BlueJ4.2\BlueJ\jdk\bin\javadoc.exe +-author +-version +-nodeprecated +-package +-Xdoclint:none +-noindex +-notree +-nohelp +-nonavbar +-source +11 +-classpath +E:\Programme\Informatik\BlueJ4.2\bluej\lib\bluejcore.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\junit-4.11.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\hamcrest-core-1.3.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\lang-stride.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.base.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.controls.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.fxml.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.graphics.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.media.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.properties.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.swing.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.web.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\+libs\jdom-1.1.3.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk +-d +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc +-encoding +windows-1252 +-charset +windows-1252 +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java +<---- end of javadoc command ----> +Loading source file F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java... +Constructing Javadoc information... +Standard Doclet version 11.0.2 +Building tree for all the packages and classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\PictureViewer.html... +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:123: warning - @param argument "b" is not a parameter name. +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:163: warning - @param argument "factor" is not a parameter name. +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\package-summary.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\constant-values.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\serialized-form.html... +Building index for all the packages and classes... +Building index for all classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\index.html... +2 warnings diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/script.js b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/script.js new file mode 100644 index 0000000..d33d3ab --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/script.js @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'jquery/jszip/dist/jszip.js'); + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils.js'); + if (window.navigator.userAgent.indexOf('MSIE ') > 0 || window.navigator.userAgent.indexOf('Trident/') > 0 || + window.navigator.userAgent.indexOf('Edge/') > 0) { + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); + } + createElem(doc, tag, 'search.js'); + + $.get(pathtoroot + "module-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "package-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "type-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "member-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "tag-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + }); + }); + if (!moduleSearchIndex) { + createElem(doc, tag, 'module-search-index.js'); + } + if (!packageSearchIndex) { + createElem(doc, tag, 'package-search-index.js'); + } + if (!typeSearchIndex) { + createElem(doc, tag, 'type-search-index.js'); + } + if (!memberSearchIndex) { + createElem(doc, tag, 'member-search-index.js'); + } + if (!tagSearchIndex) { + createElem(doc, tag, 'tag-search-index.js'); + } + $(window).resize(function() { + $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + }); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} + +function updateModuleFrame(pFrame, cFrame) { + top.packageFrame.location = pFrame; + top.classFrame.location = cFrame; +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/serialized-form.html b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/serialized-form.html new file mode 100644 index 0000000..26abcce --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/serialized-form.html @@ -0,0 +1,71 @@ + + + + + +Serialized Form + + + + + + + + +
+
+

Serialized Form

+
+
+
    +
  • +
    +

    Package imp

    +
      +
    • + + +

      Class imp.PictureViewer extends javax.swing.JFrame implements Serializable

      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          history

          +
          java.util.Vector<java.awt.image.BufferedImage> history
          +
        • +
        • +

          imagePane

          +
          javax.swing.JLabel imagePane
          +
        • +
        • +

          picture

          +
          imp.Picture picture
          +
        • +
        • +

          zoom

          +
          double zoom
          +
        • +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/stylesheet.css b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/stylesheet.css new file mode 100644 index 0000000..c027275 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/doc/stylesheet.css @@ -0,0 +1,906 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +a[name]:before, a[name]:target, a[id]:before, a[id]:target { + content:""; + display:inline-block; + position:relative; + padding-top:129px; + margin-top:-129px; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} + +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.navPadding { + padding-top: 107px; +} +.fixedNav { + position:fixed; + width:100%; + z-index:999; + background-color:#ffffff; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch { + float:right; + margin:0 0 0 0; + padding:0; +} +ul.navListSearch li { + list-style:none; + float:right; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch li label { + position:relative; + right:-16px; +} +ul.subNavList li { + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Styles for page header and footer. + */ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexNav { + position:relative; + font-size:12px; + background-color:#dee3e9; +} +.indexNav ul { + margin-top:0; + padding:5px; +} +.indexNav ul li { + display:inline; + list-style-type:none; + padding-right:10px; + text-transform:uppercase; +} +.indexNav h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* + * Styles for page layout containers. + */ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, +.allClassesContainer, .allPackagesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary, +.requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption, +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.constantsSummary caption a:link, .deprecatedSummary caption a:link, +.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link, +.usesSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover, +.usesSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.constantsSummary caption a:active, .deprecatedSummary caption a:active, +.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active, +.usesSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.constantsSummary caption a:visited, .deprecatedSummary caption a:visited, +.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited, +.usesSummary caption a:visited { + color:#FFFFFF; +} +.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active, +.useSummary caption a:visited { + color:#1f389c; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, +.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, +.usesSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span, +.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span, +.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab, +.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab, +.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab, +.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd, +.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd, +.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd, +.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; +} +.rowColor th, .altColor th { + font-weight:normal; +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td, +.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, +.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, +.constantsSummary td { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th, +.packagesSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + font-size:13px; +} +td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast { + font-size:13px; +} +.constantsSummary th, .packagesSummary th { + font-size:13px; +} +.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, +.providesSummary td.colLast { + white-space:normal; + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.requiresSummary td.colFirst, .requiresSummary th.colFirst, +.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, +.usesSummary td.colFirst, .usesSummary th.colFirst, +.providesSummary td.colFirst, .providesSummary th.colFirst, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName, +.typeSummary td.colFirst, .typeSummary th.colFirst { + vertical-align:top; +} +.packagesSummary th.colLast, .packagesSummary td.colLast { + white-space:normal; +} +td.colFirst a:link, td.colFirst a:visited, +td.colSecond a:link, td.colSecond a:visited, +th.colFirst a:link, th.colFirst a:visited, +th.colSecond a:link, th.colSecond a:visited, +th.colConstructorName a:link, th.colConstructorName a:visited, +th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, +.constantValuesContainer td a:link, .constantValuesContainer td a:visited, +.allClassesContainer td a:link, .allClassesContainer td a:visited, +.allPackagesContainer td a:link, .allPackagesContainer td a:visited { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor, .altColor th { + background-color:#FFFFFF; +} +.rowColor, .rowColor th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.colLast div { + padding-top:0px; +} +td.colLast a { + padding-bottom:3px; +} +/* + * Styles for formatting effect. + */ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, +.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType, +.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel, +.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} +.deprecationBlock { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} +div.contentContainer ul.blockList li.blockList h2 { + padding-bottom:0px; +} +/* + * Styles for IFRAME. + */ +.mainContainer { + margin:0 auto; + padding:0; + height:100%; + width:100%; + position:fixed; + top:0; + left:0; +} +.leftContainer { + height:100%; + position:fixed; + width:320px; +} +.leftTop { + position:relative; + float:left; + width:315px; + top:0; + left:0; + height:30%; + border-right:6px solid #ccc; + border-bottom:6px solid #ccc; +} +.leftBottom { + position:relative; + float:left; + width:315px; + bottom:0; + left:0; + height:70%; + border-right:6px solid #ccc; + border-top:1px solid #000; +} +.rightContainer { + position:absolute; + left:320px; + top:0; + bottom:0; + height:100%; + right:0; + border-left:1px solid #000; +} +.rightIframe { + margin:0; + padding:0; + height:100%; + right:30px; + width:100%; + overflow:visible; + margin-bottom:30px; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.resultItem { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.resultHighlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:17px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.searchTagDescResult { + font-style:italic; + font-size:11px; +} +.searchTagHolderResult { + font-style:italic; + font-size:12px; +} +.searchTagResult:before, .searchTagResult:target { + color:red; +} +.moduleGraph span { + display:none; + position:absolute; +} +.moduleGraph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.methodSignature { + white-space:normal; +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/HSB.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/HSB.java new file mode 100644 index 0000000..5337124 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/HSB.java @@ -0,0 +1,55 @@ +package imp; + +import java.awt.Color; + +/** + * Hilfsklasse für das HSB-Farbmodell + * + * @author Thomas Schaller + * @version V1.0 14.01.2020 + */ + +public class HSB +{ + /** + * Liefert den Farbton als Winkel zwischen 0.0° und 360.0°. + * @param Color c Farbe, deren Farbton bestimmt werden soll. + * @return Farbton + */ + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; + } + + /** + * Liefert die Sättigung als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Sättigung bestimmt werden soll. + * @return Sättigung + */ + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; + } + + /** + * Liefert die Helligkeit als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Helligkeit bestimmt werden soll. + * @return Sättigung + */ + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; + } + + /** + * Liefert ein Java-Color-Objekt mit den angegebenen HSB-Werten. + * @param h Farbton (Hue) + * @param s Sättigung (Saturation) + * @param b Brightness (Helligkeit) + * @return Java-Color-Objekt + */ + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Picture.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Picture.java new file mode 100644 index 0000000..100fee8 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Picture.java @@ -0,0 +1,747 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + showInFrame(); + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + showInFrame(); + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + if(observer != null) observer.resize(); + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + public void setTitle (String titel) { + getObserver().setTitle(titel); + } + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + if(observer != null) observer.resize(); + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new java.awt.Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/PictureViewer.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/PictureViewer.java new file mode 100644 index 0000000..34b52bb --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/PictureViewer.java @@ -0,0 +1,221 @@ +package imp; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import javax.swing.*; +import javax.swing.event.*; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; + +/** + * Der PictureViewer ist ein JFrame, der in der Lage ist ein + * Objekt der Klasse Picture anzuzeigen. Zusätzlich können + * mehrere Verarbeitungsschritte gespeichert werden, um ein + * "zurück"-Funktion zu ermöglichen. + * + * @author Thomas Schaller + * @version V1.2 vom 06.12.2019 + */ +public class PictureViewer extends JFrame implements MouseWheelListener +{ + public static final int FIT = -1; + public static final int NORMAL = 1; + + private static final int ANZ_BACK = 0; + + private double zoom; + protected Picture picture = null; + private Vector history; + private JLabel imagePane = new JLabel(); + private JScrollPane scrollPane; + // private boolean antialiasing; + + /** + * Erzeugt ein ScrollPanel der Größe 500x400 + */ + public PictureViewer() { + this(800,500); + } + + /** + * Erzeugt ein ScrollPanel der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(new Picture(width, height)); + } + + public PictureViewer(Picture p) { + picture = p; + picture.setObserver(this); + this.history = new Vector(); + this.zoom = NORMAL; + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout()); + imagePane.setPreferredSize(new Dimension(p.getWidth(), p.getHeight())); + scrollPane = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); + scrollPane.setViewportView( imagePane ); + + cp.add(scrollPane, BorderLayout.CENTER); + pack(); + this.setVisible(true); + + repaint(); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (d.width - getSize().width); + //int x = 0; + int y = 0; + setLocation(x, y); + + scrollPane.addMouseWheelListener(this); + } + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + BufferedImage b = new BufferedImage(picture.getWidth(), picture.getHeight(), picture.getImage().getType()); + Graphics g = b.getGraphics(); + g.drawImage(picture.getImage(), 0, 0, null); + g.dispose(); + + history.add(b); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + private void popImage() { + int anz = history.size(); + if(anz>0) { + BufferedImage i = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(i); + repaint(); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + popImage(); + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double zoom) { + if(zoom>0.01 && zoom<10.0) { + this.zoom = zoom; + } + // else this.zoom = NORMAL; + resize(); + repaint(); + } + + // public void setAntialiasing(boolean antialiasing) { + // this.antialiasing = antialiasing; + // } + + /** + * Setzt die automatische Neuanzeige des Bildes. + * Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + * die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + * vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + * eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + * die Methode refresh() auf. + * @param autoRefresh true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll. + */ + public void setAutoRefresh(boolean autoRefresh) { + picture.setAutoRefresh(autoRefresh); + } + + /** + * Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + * wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + * Anzeige automatisiert werden. + */ + public void refresh() { + repaint(); + } + + /** + * Passt die Framegröße an das anzuzeigende Bild an. + */ + public void resize() { + int pref_x = (int) (picture.getWidth()*zoom); + int pref_y = (int) (picture.getHeight()*zoom); + imagePane.setPreferredSize(new Dimension(pref_x,pref_y)); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + if((pref_x > d.getWidth()-30) || (pref_y > d.getHeight()-100)) { + pref_x = Math.min(pref_x, (int) d.getWidth()-30); + pref_y = Math.min(pref_y, (int) d.getHeight()-100); + scrollPane.setPreferredSize(new Dimension(pref_x,pref_y)); + } else scrollPane.setPreferredSize(null); + + imagePane.revalidate(); + pack(); + } + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + + public void repaint() { + double faktor = zoom; + + if (zoom == FIT) { + double faktorw = (double) imagePane.getWidth() / picture.getWidth(); + double faktorh = (double) imagePane.getHeight() / picture.getHeight(); + faktor = Math.min(faktorw, faktorh); + } + int disp_width = (int) (picture.getWidth()*faktor); + int disp_height = (int) (picture.getHeight()*faktor); + + BufferedImage image = new BufferedImage(disp_width, disp_height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) image.getGraphics(); + + if(picture.isAntialiasing()) { + picture.antialise(); + } + else g.getRenderingHints().clear(); + + g.drawImage(picture.getImage(),0,0,disp_width, disp_height, 0, 0, picture.getWidth(), picture.getHeight(), null); + g.setColor(new java.awt.Color(0,0,0)); + g.setStroke(new BasicStroke((float) 1)); + g.drawRect(0,0,disp_width-1, disp_height-1); + + imagePane.setIcon(new ImageIcon(image)); + imagePane.repaint(); + + } + + /** Setzt ZoomFaktor über MouseWheel + * + */ + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + if ( notches < 0) { + setZoom(zoom * 1.1); + } else { + setZoom(zoom * 1.0/1.1); + } + } +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Table.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/XML.java b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/package.bluej b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/package.bluej new file mode 100644 index 0000000..b9a9be9 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/imp/package.bluej @@ -0,0 +1,71 @@ +#BlueJ package file +dependency1.from=Table +dependency1.to=TableRow +dependency1.type=UsesDependency +dependency2.from=PictureViewer +dependency2.to=Picture +dependency2.type=UsesDependency +dependency3.from=Picture +dependency3.to=PictureViewer +dependency3.type=UsesDependency +objectbench.height=89 +objectbench.width=565 +package.divider.horizontal=0.6 +package.divider.vertical=0.808 +package.editor.height=397 +package.editor.width=475 +package.editor.x=594 +package.editor.y=183 +package.frame.height=600 +package.frame.width=605 +package.numDependencies=3 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=PictureViewer +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=Table +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=120 +target2.y=110 +target3.height=50 +target3.name=Picture +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=180 +target3.y=250 +target4.height=50 +target4.name=XML +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=220 +target4.y=130 +target5.height=50 +target5.name=HSB +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=10 +target5.y=90 +target6.height=50 +target6.name=TableRow +target6.showInterface=false +target6.type=ClassTarget +target6.width=90 +target6.x=220 +target6.y=60 diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/package.bluej b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/package.bluej new file mode 100644 index 0000000..5f18cbe --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/package.bluej @@ -0,0 +1,45 @@ +#BlueJ package file +editor.fx.0.height=739 +editor.fx.0.width=816 +editor.fx.0.x=552 +editor.fx.0.y=100 +objectbench.height=93 +objectbench.width=760 +package.divider.horizontal=0.599476439790576 +package.divider.vertical=0.8 +package.editor.height=393 +package.editor.width=670 +package.editor.x=455 +package.editor.y=113 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=3 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Beispielbild +target1.showInterface=false +target1.type=ClassTarget +target1.width=100 +target1.x=20 +target1.y=110 +target2.height=62 +target2.name=imp +target2.type=PackageTarget +target2.width=80 +target2.x=80 +target2.y=10 +target3.height=50 +target3.name=GeometrischeBildoperationen +target3.showInterface=false +target3.type=ClassTarget +target3.width=210 +target3.x=230 +target3.y=110 diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej-debuglog.txt b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej-debuglog.txt new file mode 100644 index 0000000..6211b98 --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej-debuglog.txt @@ -0,0 +1,13 @@ +BlueJ run started: Fri Nov 29 10:42:25 CET 2019 +BlueJ version 3.1.4 +Java version 1.8.0_231 +Virtual machine: Java HotSpot(TM) 64-Bit Server VM 25.231-b11 (Oracle Corporation) +Running on: Windows 10 10.0 (amd64) +Java Home: C:\Program Files\Java\jdk1.8.0_231\jre +---- +Detected language "english" based on iso639-2 code "deu" +Opening project: M:\Fortbildung ZPG IMP10\4_loesungen\01_geometrische_bildoperationen +1575020554702: Listening for JDWP connection on address: javadebug +Connected to debug VM via dt_shmem transport... +Communication with debug VM fully established. +Simple GUI Extension terminates diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej.properties b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej.properties new file mode 100644 index 0000000..09b101e --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/bluej.properties @@ -0,0 +1,11 @@ +#BlueJ properties. Settings in this file override "bluej.defs" +#Fri Nov 29 10:42:36 CET 2019 +bluej.editor.fontsize=12 +bluej.startWithTextEval=false +bluej.openPackage1=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +extensions.org.bluej.extensions.submitter.Submitter.settings.saslrealm= +bluej.recentProject0=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +bluej.uid=38075fda-de76-4394-a2d5-304ddf93e08b +bluej.terminal.y=16 +bluej.terminal.x=16 +blackbox.uuid=optout diff --git a/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/moe.properties b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/moe.properties new file mode 100644 index 0000000..1a1f96e --- /dev/null +++ b/4_loesungen/01_geometrische_bildoperationen_lsg/01_geometrische_bildoperationen/userhome/bluej/moe.properties @@ -0,0 +1,2 @@ +#Moe Editor properties. Settings in this file override "moe.defs" +#Fri Nov 29 10:42:36 CET 2019 diff --git a/4_loesungen/02_alg_farbmodell_loesung.odt b/4_loesungen/02_alg_farbmodell_loesung.odt new file mode 100644 index 0000000..60241d9 Binary files /dev/null and b/4_loesungen/02_alg_farbmodell_loesung.odt differ diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/LICENSE.txt b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/jdom-1.1.3.jar b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/+libs/jdom-1.1.3.jar differ diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Beispielbild.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Beispielbild.java new file mode 100644 index 0000000..11da2dc --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Beispielbild.java @@ -0,0 +1,28 @@ +import imp.*; +import java.io.File; +/** + * Klasse für Beispielbilder + * + * @author Thomas Schaller + * @version v1.0 (28.11.2019) + */ +public class Beispielbild extends Picture +{ + + /** + * Konstruktor: öffnet das Bild katze.jpg + */ + public Beispielbild() + { + super("iris.jpg"); + } + + public void load(String dateiname) { + super.load("images/"+dateiname); + } + + public void save(String dateiname) { + super.save("images/"+dateiname); + } + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/GeometrischeBildoperationen.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/GeometrischeBildoperationen.java new file mode 100644 index 0000000..9aaaebc --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/GeometrischeBildoperationen.java @@ -0,0 +1,115 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen zur Änderung der Pixelpositionen eines Pictures + * z.B. drehen, spiegeln usw. + * + * @author Thomas Schaller + * @version 1.1 (28.11.2019) + */ +public class GeometrischeBildoperationen +{ + /** spiegeleHorizontal spiegelt das Bild, so dass rechts und links getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelHorizontal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(breite-1)-x][y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** spiegeleHorizontal spiegelt das Bild, so dass oben und unten getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelVertikal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[x][(hoehe-1)-y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + /** dreheRechts dreht das Bild um 90° nach rechts + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + + public Picture dreheRechts(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[y][(breite-1)-x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** dreheLinks dreht das Bild um 90° nach links + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture dreheLinks(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(hoehe-1)-y][x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + + } + + /** drehe180 dreht das Bild um 180° + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture drehe180(Picture originalbild) { + Picture bild90 = dreheLinks(originalbild); + Picture bild180 = dreheLinks(bild90); + return bild180; + } + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Punktoperationen.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Punktoperationen.java new file mode 100644 index 0000000..b09f554 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/Punktoperationen.java @@ -0,0 +1,205 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen, die auf der Veränderung der Farbinformationen eines Punktes beruhen + * + * @author Thomas Schaller + * @version 1.0 (7.11.2019) + */ +public class Punktoperationen +{ + + public Picture graustufenDurchschnitt(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + // Mittelwert bestimmen + int grau = (int) ((pixel[x][y].getRed()+ pixel[x][y].getGreen() + pixel[x][y].getBlue())/3); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture graustufenMin(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = pixel[x][y].getRed(); + if (grau > pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau > pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture graustufenMax(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = pixel[x][y].getRed(); + if (grau < pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau < pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture graustufenNatuerlich(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = (int) (pixel[x][y].getRed()*299+pixel[x][y].getGreen()*587+pixel[x][y].getBlue()*114)/1000; + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture invertieren(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = 255-pixel[x][y].getRed(); + int gruen = 255-pixel[x][y].getGreen(); + int blau = 255-pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotGruen(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getGreen(); + int gruen = pixel[x][y].getRed(); + int blau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getBlue(); + int gruen = pixel[x][y].getGreen(); + int blau = pixel[x][y].getRed(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschGruenBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getRed(); + int gruen = pixel[x][y].getBlue(); + int blau = pixel[x][y].getGreen(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture farbaenderung(Picture originalbild, double faktor_r, double faktor_g, double faktor_b) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = (int) (pixel[x][y].getRed() * faktor_r); + int gruen = (int) (pixel[x][y].getGreen() * faktor_g); + int blau = (int) (pixel[x][y].getBlue() * faktor_b); + + //Begrenzung auf zulässigen Bereich + if(rot < 0) rot = 0; + if(rot > 255) rot = 255; + if(gruen < 0) gruen = 0; + if(gruen > 255) gruen = 255; + if(blau < 0) blau = 0; + if(blau > 255) blau = 255; + + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/allclasses.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/allclasses.html new file mode 100644 index 0000000..47b80da --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/allclasses.html @@ -0,0 +1,20 @@ + + + + + +All Classes + + + + + + +

All Classes

+
+ +
+ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/constant-values.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/constant-values.html new file mode 100644 index 0000000..67a232a --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/constant-values.html @@ -0,0 +1,73 @@ + + + + + +Constant Field Values + + + + + + + + +
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+ + +
+

imp.*

+
    +
  • + + + + + + + + + + + + + + + + + + + +
    imp.PictureViewer 
    Modifier and TypeConstant FieldValue
    + +public static final intFIT-1
    + +public static final intNORMAL1
    +
  • +
+
+
+
+ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/element-list b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/element-list new file mode 100644 index 0000000..6711e1c --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/element-list @@ -0,0 +1 @@ +imp diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/Picture.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/Picture.html new file mode 100644 index 0000000..7f2a95d --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/Picture.html @@ -0,0 +1,1276 @@ + + + + + +Picture + + + + + + + + + +
+
+
Package imp
+

Class Picture

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • imp.Picture
    • +
    +
  • +
+
+
    +
  • +
    +
    public class Picture
    +extends java.lang.Object
    +
    Bildklasse fuer die Simulation von Processing-Befehlen + + Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + werden kann. + Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt.
    +
    +
    Version:
    +
    1.0 from 23.01.2019
    +
    Author:
    +
    Thomas Schaller (ZPG Informatik Klasse 9)
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intCENTER 
      static intCORNER 
      static intCORNERS 
      static intRADIUS 
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Picture() +
      Erzeugt ein Bild mit Standardgroesse 500x400
      +
      Picture​(int width, + int height) +
      Erzeugt ein Bild der angegeben Groesse
      +
      Picture​(int width, + int height, + java.lang.String background) +
      Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
      +
      Picture​(java.lang.String filename) +
      Erzeugt ein Bild aus einer Datei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Loescht den Inhalt des Bildes.
      +
      voiddelay​(int millis) +
      Hilfsfunktion zum Verzoegern der Ausgabe
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidforceRepaint() +
      Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
      +
      intgetHeight() +
      Liefert die Hoehe des Bildes zurueck.
      +
      java.awt.image.BufferedImagegetImage() +
      Direktes Abfragen des Bildes (fuer interne Zwecke)
      +
      imp.PictureViewergetObserver() 
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      intgetWidth() +
      Liefert die Breite des Bildes zurueck.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Laedt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefuellt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird.
      +
      voidsetImage​(java.awt.image.BufferedImage b) +
      Direktes Setzen des Bildes (fuer interne Zwecke)
      +
      voidsetObserver​(imp.PictureViewer observer) +
      Legt fest, wer das Bild anzeigt.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetTitle​(java.lang.String titel) 
      voidshowInFrame() 
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String s, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart fuer Textausgaben fest.
      +
      voidtriangle​(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, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Picture

        +
        public Picture()
        +
        Erzeugt ein Bild mit Standardgroesse 500x400
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height)
        +
        Erzeugt ein Bild der angegeben Groesse
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(java.lang.String filename)
        +
        Erzeugt ein Bild aus einer Datei
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height,
        +               java.lang.String background)
        +
        Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        background - Farbe des Hintergrunds
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        showInFrame

        +
        public void showInFrame()
        +
      • +
      + + + +
        +
      • +

        setObserver

        +
        public void setObserver​(imp.PictureViewer observer)
        +
        Legt fest, wer das Bild anzeigt. + Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert.
        +
        +
        Parameters:
        +
        observer - Anzeiger des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getObserver

        +
        public imp.PictureViewer getObserver()
        +
      • +
      + + + +
        +
      • +

        setImage

        +
        public void setImage​(java.awt.image.BufferedImage b)
        +
        Direktes Setzen des Bildes (fuer interne Zwecke)
        +
        +
        Parameters:
        +
        b - Bild, das gespeichert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        getImage

        +
        public java.awt.image.BufferedImage getImage()
        +
        Direktes Abfragen des Bildes (fuer interne Zwecke)
        +
        +
        Returns:
        +
        Bild, das gerade gespeichert ist.
        +
        +
      • +
      + + + +
        +
      • +

        size

        +
        public void size​(int width,
        +                 int height)
        +
        Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu.
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getWidth

        +
        public int getWidth()
        +
        Liefert die Breite des Bildes zurueck.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getHeight

        +
        public int getHeight()
        +
        Liefert die Hoehe des Bildes zurueck.
        +
        +
        Returns:
        +
        Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        setTitle

        +
        public void setTitle​(java.lang.String titel)
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden.
        +
        +
        Parameters:
        +
        autorefresh - true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen
        +
        +
      • +
      + + + +
        +
      • +

        forceRepaint

        +
        public void forceRepaint()
        +
        Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Loescht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt.
        +
      • +
      + + + +
        +
      • +

        rectMode

        +
        public void rectMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        ellipseMode

        +
        public void ellipseMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        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 einzufaerben, verwenden Sie die stroke() Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + strokeWeight() geaendert 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
        +
        +
      • +
      + + + +
        +
      • +

        rect

        +
        public void rect​(int a,
        +                 int b,
        +                 int c,
        +                 int d)
        +
        Zeichnet ein Rechteck auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion rectMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        b - meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch rectMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        ellipse

        +
        public void ellipse​(int a,
        +                    int b,
        +                    int c,
        +                    int d)
        +
        Zeichnet eine Ellipse/Kreis auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion ellipseMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        b - meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + sind nicht auf neunzig Grad beschraenkt. 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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        x - Liste der x-Koordinaten der Punkte.
        +
        y - Liste der y-Koordinaten der Punkte.
        +
        +
      • +
      + + + +
        +
      • +

        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 fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt.
        +
        +
        Parameters:
        +
        x - x-Koordinate des Punktes
        +
        y - y-Koordinate des Punktes
        +
        +
      • +
      + + + +
        +
      • +

        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 ausgewaehlte 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 fuer Textausgaben fest. + Jeder uebliche 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
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(java.lang.String pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        pencolor - Stiftfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(int pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 weiss, 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 Raender um Formen gezeichnet werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Stiftfarbe
        +
        g - Gruenanteil (0-255) der Stiftfarbe
        +
        b - Blauanteil (0-255) der Stiftfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        strokeWeight

        +
        public void strokeWeight​(double width)
        +
        Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + Alle Breiten werden in Pixeleinheiten angegeben.
        +
        +
        Parameters:
        +
        width - Breite in Pixel
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(java.lang.String fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(int fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 gefuellt werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Fuellfarbe
        +
        g - Gruenanteil (0-255) der Fuellfarbe
        +
        b - Blauanteil (0-255) der Fuellfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefuellt werden sollen.
        +
      • +
      + + + +
        +
      • +

        background

        +
        public void background​(int c)
        +
        Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        c - Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Hintergrundfarbe
        +
        g - Gruenanteil (0-255) der Hintergrundfarbe
        +
        b - Blauanteil (0-255) der Hintergrundfarbe
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        public void load​(java.lang.String filename)
        +
        Laedt ein Bild aus dem Dateisystem. + Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        public void save​(java.lang.String filename)
        +
        Speichert ein Bild. + Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        setPixelArray

        +
        public void setPixelArray​(java.awt.Color[][] pixel)
        +
        Setzt das Bild neu auf Basis des Pixel-Arrays. + Die Groesse des Bildes wird nicht automatisch an das Array angepasst.
        +
        +
        Parameters:
        +
        pixel - zweidimensionales Array von Color-Objekten
        +
        +
      • +
      + + + +
        +
      • +

        delay

        +
        public void delay​(int millis)
        +
        Hilfsfunktion zum Verzoegern der Ausgabe
        +
        +
        Parameters:
        +
        millis - Wartezeit in Millisekunden
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/PictureViewer.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/PictureViewer.html new file mode 100644 index 0000000..af51632 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/PictureViewer.html @@ -0,0 +1,1371 @@ + + + + + +PictureViewer + + + + + + + + + +
+
+
Package imp
+

Class PictureViewer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • java.awt.Window
        • +
        • +
            +
          • java.awt.Frame
          • +
          • +
              +
            • javax.swing.JFrame
            • +
            • +
                +
              • imp.PictureViewer
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants
    +
    +
    +
    public class PictureViewer
    +extends javax.swing.JFrame
    +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen. Zusätzlich können + mehrere Verarbeitungsschritte gespeichert werden, um ein + "zurück"-Funktion zu ermöglichen.
    +
    +
    Version:
    +
    V1.0 vom 10.02.2019
    +
    Author:
    +
    Thomas Schaller
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JFrame

        +javax.swing.JFrame.AccessibleJFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Frame

        +java.awt.Frame.AccessibleAWTFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Window

        +java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFIT 
      static intNORMAL 
      protected imp.Picturepicture 
      +
        +
      • + + +

        Fields inherited from class javax.swing.JFrame

        +accessibleContext, rootPane, rootPaneCheckingEnabled
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Frame

        +ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
        +
      • + + +

        Fields inherited from interface javax.swing.WindowConstants

        +DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      PictureViewer() +
      Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
      +
      PictureViewer​(int width, + int height) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(int width, + int height, + java.lang.String background) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(imp.Picture p) 
      PictureViewer​(java.lang.String filename) +
      Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidback() +
      Ruft das letzte abgespeicherte Bild aus der History wieder auf.
      +
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Löscht den Inhalt des Bildes.
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      intgetImageHeight() +
      Liefert die Höhe des Bildes zurück.
      +
      intgetImageWidth() +
      Liefert die Breite des Bildes zurück.
      +
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Lädt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefüllt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidpushImage() +
      Speichert das übergebene Bild in der History.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidrefresh() +
      Sorgt für die Aktualisierung der Bildschrimanzeige.
      +
      voidrepaint() +
      Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Setzt die automatische Neuanzeige des Bildes.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetZoom​(double zoom) +
      Setzt den Zoom-Faktor für das Bild.
      +
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String t, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewählte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart für Textausgaben fest.
      +
      voidtriangle​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +
      Zeichnet ein Dreieck auf das Bild.
      +
      +
        +
      • + + +

        Methods inherited from class javax.swing.JFrame

        +addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Frame

        +addNotify, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Window

        +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, toBack, toFront
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, list, list, paintComponents, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, hasFocus, imageUpdate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, list, list, list, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.MenuContainer

        +getFont
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer()
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height,
        +                     java.lang.String background)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        background - Farbe des Hintergrunds als HEX-String (z.B. "FF3A45")
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(java.lang.String filename)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
        +
        +
        Parameters:
        +
        filename - Name des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(imp.Picture p)
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        pushImage

        +
        public void pushImage()
        +
        Speichert das übergebene Bild in der History.
        +
        +
        Parameters:
        +
        b - zu speicherndes Bild
        +
        +
      • +
      + + + +
        +
      • +

        back

        +
        public void back()
        +
        Ruft das letzte abgespeicherte Bild aus der History wieder auf.
        +
      • +
      + + + +
        +
      • +

        setZoom

        +
        public void setZoom​(double zoom)
        +
        Setzt den Zoom-Faktor für das Bild. + Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich.
        +
        +
        Parameters:
        +
        factor - Zoomfaktor (1.0 = 100%).
        +
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Setzt die automatische Neuanzeige des Bildes. + Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + die Methode refresh() auf.
        +
        +
        Parameters:
        +
        autoRefresh - true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        refresh

        +
        public void refresh()
        +
        Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + Anzeige automatisiert werden.
        +
      • +
      + + + +
        +
      • +

        repaint

        +
        public void repaint()
        +
        Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
        +
        +
        Overrides:
        +
        repaint in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        getImageWidth

        +
        public int getImageWidth()
        +
        Liefert die Breite des Bildes zurück.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getImageHeight

        +
        public int getImageHeight()
        +
        Liefert die Höhe des Bildes zurück.
        +
        +
        Returns:
        +
        Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefüllt werden sollen.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Löscht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefüllt.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        text

        +
        public void text​(java.lang.String t,
        +                 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:
        +
        t - 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
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/package-summary.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/package-summary.html new file mode 100644 index 0000000..4d7557e --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/imp/package-summary.html @@ -0,0 +1,54 @@ + + + + + +imp + + + + + + + + +
+
+

Package imp

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    PictureViewer +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen.
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/index.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/index.html new file mode 100644 index 0000000..ddcb119 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/index.html @@ -0,0 +1,23 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + +
+ +

imp/package-summary.html

+
+ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/logfile.txt b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/logfile.txt new file mode 100644 index 0000000..f39208c --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/logfile.txt @@ -0,0 +1,40 @@ +Class documentation +<---- javadoc command: ----> +E:\Programme\Informatik\BlueJ4.2\BlueJ\jdk\bin\javadoc.exe +-author +-version +-nodeprecated +-package +-Xdoclint:none +-noindex +-notree +-nohelp +-nonavbar +-source +11 +-classpath +E:\Programme\Informatik\BlueJ4.2\bluej\lib\bluejcore.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\junit-4.11.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\hamcrest-core-1.3.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\lang-stride.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.base.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.controls.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.fxml.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.graphics.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.media.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.properties.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.swing.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.web.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\+libs\jdom-1.1.3.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk +-d +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc +-encoding +windows-1252 +-charset +windows-1252 +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java +<---- end of javadoc command ----> +Loading source file F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java... +Constructing Javadoc information... +Standard Doclet version 11.0.2 +Building tree for all the packages and classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\PictureViewer.html... +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:123: warning - @param argument "b" is not a parameter name. +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:163: warning - @param argument "factor" is not a parameter name. +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\package-summary.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\constant-values.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\serialized-form.html... +Building index for all the packages and classes... +Building index for all classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\index.html... +2 warnings diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/script.js b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/script.js new file mode 100644 index 0000000..d33d3ab --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/script.js @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'jquery/jszip/dist/jszip.js'); + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils.js'); + if (window.navigator.userAgent.indexOf('MSIE ') > 0 || window.navigator.userAgent.indexOf('Trident/') > 0 || + window.navigator.userAgent.indexOf('Edge/') > 0) { + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); + } + createElem(doc, tag, 'search.js'); + + $.get(pathtoroot + "module-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "package-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "type-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "member-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "tag-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + }); + }); + if (!moduleSearchIndex) { + createElem(doc, tag, 'module-search-index.js'); + } + if (!packageSearchIndex) { + createElem(doc, tag, 'package-search-index.js'); + } + if (!typeSearchIndex) { + createElem(doc, tag, 'type-search-index.js'); + } + if (!memberSearchIndex) { + createElem(doc, tag, 'member-search-index.js'); + } + if (!tagSearchIndex) { + createElem(doc, tag, 'tag-search-index.js'); + } + $(window).resize(function() { + $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + }); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} + +function updateModuleFrame(pFrame, cFrame) { + top.packageFrame.location = pFrame; + top.classFrame.location = cFrame; +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/serialized-form.html b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/serialized-form.html new file mode 100644 index 0000000..26abcce --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/serialized-form.html @@ -0,0 +1,71 @@ + + + + + +Serialized Form + + + + + + + + +
+
+

Serialized Form

+
+
+
    +
  • +
    +

    Package imp

    +
      +
    • + + +

      Class imp.PictureViewer extends javax.swing.JFrame implements Serializable

      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          history

          +
          java.util.Vector<java.awt.image.BufferedImage> history
          +
        • +
        • +

          imagePane

          +
          javax.swing.JLabel imagePane
          +
        • +
        • +

          picture

          +
          imp.Picture picture
          +
        • +
        • +

          zoom

          +
          double zoom
          +
        • +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/stylesheet.css b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/stylesheet.css new file mode 100644 index 0000000..c027275 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/doc/stylesheet.css @@ -0,0 +1,906 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +a[name]:before, a[name]:target, a[id]:before, a[id]:target { + content:""; + display:inline-block; + position:relative; + padding-top:129px; + margin-top:-129px; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} + +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.navPadding { + padding-top: 107px; +} +.fixedNav { + position:fixed; + width:100%; + z-index:999; + background-color:#ffffff; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch { + float:right; + margin:0 0 0 0; + padding:0; +} +ul.navListSearch li { + list-style:none; + float:right; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch li label { + position:relative; + right:-16px; +} +ul.subNavList li { + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Styles for page header and footer. + */ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexNav { + position:relative; + font-size:12px; + background-color:#dee3e9; +} +.indexNav ul { + margin-top:0; + padding:5px; +} +.indexNav ul li { + display:inline; + list-style-type:none; + padding-right:10px; + text-transform:uppercase; +} +.indexNav h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* + * Styles for page layout containers. + */ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, +.allClassesContainer, .allPackagesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary, +.requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption, +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.constantsSummary caption a:link, .deprecatedSummary caption a:link, +.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link, +.usesSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover, +.usesSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.constantsSummary caption a:active, .deprecatedSummary caption a:active, +.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active, +.usesSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.constantsSummary caption a:visited, .deprecatedSummary caption a:visited, +.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited, +.usesSummary caption a:visited { + color:#FFFFFF; +} +.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active, +.useSummary caption a:visited { + color:#1f389c; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, +.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, +.usesSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span, +.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span, +.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab, +.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab, +.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab, +.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd, +.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd, +.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd, +.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; +} +.rowColor th, .altColor th { + font-weight:normal; +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td, +.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, +.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, +.constantsSummary td { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th, +.packagesSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + font-size:13px; +} +td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast { + font-size:13px; +} +.constantsSummary th, .packagesSummary th { + font-size:13px; +} +.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, +.providesSummary td.colLast { + white-space:normal; + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.requiresSummary td.colFirst, .requiresSummary th.colFirst, +.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, +.usesSummary td.colFirst, .usesSummary th.colFirst, +.providesSummary td.colFirst, .providesSummary th.colFirst, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName, +.typeSummary td.colFirst, .typeSummary th.colFirst { + vertical-align:top; +} +.packagesSummary th.colLast, .packagesSummary td.colLast { + white-space:normal; +} +td.colFirst a:link, td.colFirst a:visited, +td.colSecond a:link, td.colSecond a:visited, +th.colFirst a:link, th.colFirst a:visited, +th.colSecond a:link, th.colSecond a:visited, +th.colConstructorName a:link, th.colConstructorName a:visited, +th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, +.constantValuesContainer td a:link, .constantValuesContainer td a:visited, +.allClassesContainer td a:link, .allClassesContainer td a:visited, +.allPackagesContainer td a:link, .allPackagesContainer td a:visited { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor, .altColor th { + background-color:#FFFFFF; +} +.rowColor, .rowColor th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.colLast div { + padding-top:0px; +} +td.colLast a { + padding-bottom:3px; +} +/* + * Styles for formatting effect. + */ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, +.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType, +.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel, +.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} +.deprecationBlock { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} +div.contentContainer ul.blockList li.blockList h2 { + padding-bottom:0px; +} +/* + * Styles for IFRAME. + */ +.mainContainer { + margin:0 auto; + padding:0; + height:100%; + width:100%; + position:fixed; + top:0; + left:0; +} +.leftContainer { + height:100%; + position:fixed; + width:320px; +} +.leftTop { + position:relative; + float:left; + width:315px; + top:0; + left:0; + height:30%; + border-right:6px solid #ccc; + border-bottom:6px solid #ccc; +} +.leftBottom { + position:relative; + float:left; + width:315px; + bottom:0; + left:0; + height:70%; + border-right:6px solid #ccc; + border-top:1px solid #000; +} +.rightContainer { + position:absolute; + left:320px; + top:0; + bottom:0; + height:100%; + right:0; + border-left:1px solid #000; +} +.rightIframe { + margin:0; + padding:0; + height:100%; + right:30px; + width:100%; + overflow:visible; + margin-bottom:30px; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.resultItem { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.resultHighlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:17px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.searchTagDescResult { + font-style:italic; + font-size:11px; +} +.searchTagHolderResult { + font-style:italic; + font-size:12px; +} +.searchTagResult:before, .searchTagResult:target { + color:red; +} +.moduleGraph span { + display:none; + position:absolute; +} +.moduleGraph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.methodSignature { + white-space:normal; +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/HSB.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/HSB.java new file mode 100644 index 0000000..5337124 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/HSB.java @@ -0,0 +1,55 @@ +package imp; + +import java.awt.Color; + +/** + * Hilfsklasse für das HSB-Farbmodell + * + * @author Thomas Schaller + * @version V1.0 14.01.2020 + */ + +public class HSB +{ + /** + * Liefert den Farbton als Winkel zwischen 0.0° und 360.0°. + * @param Color c Farbe, deren Farbton bestimmt werden soll. + * @return Farbton + */ + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; + } + + /** + * Liefert die Sättigung als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Sättigung bestimmt werden soll. + * @return Sättigung + */ + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; + } + + /** + * Liefert die Helligkeit als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Helligkeit bestimmt werden soll. + * @return Sättigung + */ + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; + } + + /** + * Liefert ein Java-Color-Objekt mit den angegebenen HSB-Werten. + * @param h Farbton (Hue) + * @param s Sättigung (Saturation) + * @param b Brightness (Helligkeit) + * @return Java-Color-Objekt + */ + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Picture.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Picture.java new file mode 100644 index 0000000..100fee8 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Picture.java @@ -0,0 +1,747 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + showInFrame(); + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + showInFrame(); + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + if(observer != null) observer.resize(); + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + public void setTitle (String titel) { + getObserver().setTitle(titel); + } + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + if(observer != null) observer.resize(); + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new java.awt.Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/PictureViewer.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/PictureViewer.java new file mode 100644 index 0000000..34b52bb --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/PictureViewer.java @@ -0,0 +1,221 @@ +package imp; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import javax.swing.*; +import javax.swing.event.*; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; + +/** + * Der PictureViewer ist ein JFrame, der in der Lage ist ein + * Objekt der Klasse Picture anzuzeigen. Zusätzlich können + * mehrere Verarbeitungsschritte gespeichert werden, um ein + * "zurück"-Funktion zu ermöglichen. + * + * @author Thomas Schaller + * @version V1.2 vom 06.12.2019 + */ +public class PictureViewer extends JFrame implements MouseWheelListener +{ + public static final int FIT = -1; + public static final int NORMAL = 1; + + private static final int ANZ_BACK = 0; + + private double zoom; + protected Picture picture = null; + private Vector history; + private JLabel imagePane = new JLabel(); + private JScrollPane scrollPane; + // private boolean antialiasing; + + /** + * Erzeugt ein ScrollPanel der Größe 500x400 + */ + public PictureViewer() { + this(800,500); + } + + /** + * Erzeugt ein ScrollPanel der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(new Picture(width, height)); + } + + public PictureViewer(Picture p) { + picture = p; + picture.setObserver(this); + this.history = new Vector(); + this.zoom = NORMAL; + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout()); + imagePane.setPreferredSize(new Dimension(p.getWidth(), p.getHeight())); + scrollPane = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); + scrollPane.setViewportView( imagePane ); + + cp.add(scrollPane, BorderLayout.CENTER); + pack(); + this.setVisible(true); + + repaint(); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (d.width - getSize().width); + //int x = 0; + int y = 0; + setLocation(x, y); + + scrollPane.addMouseWheelListener(this); + } + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + BufferedImage b = new BufferedImage(picture.getWidth(), picture.getHeight(), picture.getImage().getType()); + Graphics g = b.getGraphics(); + g.drawImage(picture.getImage(), 0, 0, null); + g.dispose(); + + history.add(b); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + private void popImage() { + int anz = history.size(); + if(anz>0) { + BufferedImage i = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(i); + repaint(); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + popImage(); + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double zoom) { + if(zoom>0.01 && zoom<10.0) { + this.zoom = zoom; + } + // else this.zoom = NORMAL; + resize(); + repaint(); + } + + // public void setAntialiasing(boolean antialiasing) { + // this.antialiasing = antialiasing; + // } + + /** + * Setzt die automatische Neuanzeige des Bildes. + * Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + * die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + * vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + * eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + * die Methode refresh() auf. + * @param autoRefresh true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll. + */ + public void setAutoRefresh(boolean autoRefresh) { + picture.setAutoRefresh(autoRefresh); + } + + /** + * Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + * wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + * Anzeige automatisiert werden. + */ + public void refresh() { + repaint(); + } + + /** + * Passt die Framegröße an das anzuzeigende Bild an. + */ + public void resize() { + int pref_x = (int) (picture.getWidth()*zoom); + int pref_y = (int) (picture.getHeight()*zoom); + imagePane.setPreferredSize(new Dimension(pref_x,pref_y)); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + if((pref_x > d.getWidth()-30) || (pref_y > d.getHeight()-100)) { + pref_x = Math.min(pref_x, (int) d.getWidth()-30); + pref_y = Math.min(pref_y, (int) d.getHeight()-100); + scrollPane.setPreferredSize(new Dimension(pref_x,pref_y)); + } else scrollPane.setPreferredSize(null); + + imagePane.revalidate(); + pack(); + } + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + + public void repaint() { + double faktor = zoom; + + if (zoom == FIT) { + double faktorw = (double) imagePane.getWidth() / picture.getWidth(); + double faktorh = (double) imagePane.getHeight() / picture.getHeight(); + faktor = Math.min(faktorw, faktorh); + } + int disp_width = (int) (picture.getWidth()*faktor); + int disp_height = (int) (picture.getHeight()*faktor); + + BufferedImage image = new BufferedImage(disp_width, disp_height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) image.getGraphics(); + + if(picture.isAntialiasing()) { + picture.antialise(); + } + else g.getRenderingHints().clear(); + + g.drawImage(picture.getImage(),0,0,disp_width, disp_height, 0, 0, picture.getWidth(), picture.getHeight(), null); + g.setColor(new java.awt.Color(0,0,0)); + g.setStroke(new BasicStroke((float) 1)); + g.drawRect(0,0,disp_width-1, disp_height-1); + + imagePane.setIcon(new ImageIcon(image)); + imagePane.repaint(); + + } + + /** Setzt ZoomFaktor über MouseWheel + * + */ + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + if ( notches < 0) { + setZoom(zoom * 1.1); + } else { + setZoom(zoom * 1.0/1.1); + } + } +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Table.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/XML.java b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/package.bluej b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/package.bluej new file mode 100644 index 0000000..b9a9be9 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/imp/package.bluej @@ -0,0 +1,71 @@ +#BlueJ package file +dependency1.from=Table +dependency1.to=TableRow +dependency1.type=UsesDependency +dependency2.from=PictureViewer +dependency2.to=Picture +dependency2.type=UsesDependency +dependency3.from=Picture +dependency3.to=PictureViewer +dependency3.type=UsesDependency +objectbench.height=89 +objectbench.width=565 +package.divider.horizontal=0.6 +package.divider.vertical=0.808 +package.editor.height=397 +package.editor.width=475 +package.editor.x=594 +package.editor.y=183 +package.frame.height=600 +package.frame.width=605 +package.numDependencies=3 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=PictureViewer +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=Table +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=120 +target2.y=110 +target3.height=50 +target3.name=Picture +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=180 +target3.y=250 +target4.height=50 +target4.name=XML +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=220 +target4.y=130 +target5.height=50 +target5.name=HSB +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=10 +target5.y=90 +target6.height=50 +target6.name=TableRow +target6.showInterface=false +target6.type=ClassTarget +target6.width=90 +target6.x=220 +target6.y=60 diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/package.bluej b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/package.bluej new file mode 100644 index 0000000..e857410 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/package.bluej @@ -0,0 +1,52 @@ +#BlueJ package file +editor.fx.0.height=739 +editor.fx.0.width=816 +editor.fx.0.x=907 +editor.fx.0.y=136 +objectbench.height=93 +objectbench.width=760 +package.divider.horizontal=0.599476439790576 +package.divider.vertical=0.8 +package.editor.height=393 +package.editor.width=670 +package.editor.x=455 +package.editor.y=113 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=4 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Beispielbild +target1.showInterface=false +target1.type=ClassTarget +target1.width=100 +target1.x=20 +target1.y=110 +target2.height=50 +target2.name=Punktoperationen +target2.showInterface=false +target2.type=ClassTarget +target2.width=140 +target2.x=220 +target2.y=180 +target3.height=62 +target3.name=imp +target3.type=PackageTarget +target3.width=80 +target3.x=80 +target3.y=10 +target4.height=50 +target4.name=GeometrischeBildoperationen +target4.showInterface=false +target4.type=ClassTarget +target4.width=210 +target4.x=220 +target4.y=110 diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej-debuglog.txt b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej-debuglog.txt new file mode 100644 index 0000000..6211b98 --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej-debuglog.txt @@ -0,0 +1,13 @@ +BlueJ run started: Fri Nov 29 10:42:25 CET 2019 +BlueJ version 3.1.4 +Java version 1.8.0_231 +Virtual machine: Java HotSpot(TM) 64-Bit Server VM 25.231-b11 (Oracle Corporation) +Running on: Windows 10 10.0 (amd64) +Java Home: C:\Program Files\Java\jdk1.8.0_231\jre +---- +Detected language "english" based on iso639-2 code "deu" +Opening project: M:\Fortbildung ZPG IMP10\4_loesungen\01_geometrische_bildoperationen +1575020554702: Listening for JDWP connection on address: javadebug +Connected to debug VM via dt_shmem transport... +Communication with debug VM fully established. +Simple GUI Extension terminates diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej.properties b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej.properties new file mode 100644 index 0000000..09b101e --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/bluej.properties @@ -0,0 +1,11 @@ +#BlueJ properties. Settings in this file override "bluej.defs" +#Fri Nov 29 10:42:36 CET 2019 +bluej.editor.fontsize=12 +bluej.startWithTextEval=false +bluej.openPackage1=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +extensions.org.bluej.extensions.submitter.Submitter.settings.saslrealm= +bluej.recentProject0=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +bluej.uid=38075fda-de76-4394-a2d5-304ddf93e08b +bluej.terminal.y=16 +bluej.terminal.x=16 +blackbox.uuid=optout diff --git a/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/moe.properties b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/moe.properties new file mode 100644 index 0000000..1a1f96e --- /dev/null +++ b/4_loesungen/02_pixeloperationen_lsg/02_pixeloperationen/userhome/bluej/moe.properties @@ -0,0 +1,2 @@ +#Moe Editor properties. Settings in this file override "moe.defs" +#Fri Nov 29 10:42:36 CET 2019 diff --git a/4_loesungen/03_alg_faltung_loesung.odt b/4_loesungen/03_alg_faltung_loesung.odt new file mode 100644 index 0000000..d902f03 Binary files /dev/null and b/4_loesungen/03_alg_faltung_loesung.odt differ diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/LICENSE.txt b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/jdom-1.1.3.jar b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/+libs/jdom-1.1.3.jar differ diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Beispielbild.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Beispielbild.java new file mode 100644 index 0000000..11da2dc --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Beispielbild.java @@ -0,0 +1,28 @@ +import imp.*; +import java.io.File; +/** + * Klasse für Beispielbilder + * + * @author Thomas Schaller + * @version v1.0 (28.11.2019) + */ +public class Beispielbild extends Picture +{ + + /** + * Konstruktor: öffnet das Bild katze.jpg + */ + public Beispielbild() + { + super("iris.jpg"); + } + + public void load(String dateiname) { + super.load("images/"+dateiname); + } + + public void save(String dateiname) { + super.save("images/"+dateiname); + } + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/GeometrischeBildoperationen.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/GeometrischeBildoperationen.java new file mode 100644 index 0000000..9aaaebc --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/GeometrischeBildoperationen.java @@ -0,0 +1,115 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen zur Änderung der Pixelpositionen eines Pictures + * z.B. drehen, spiegeln usw. + * + * @author Thomas Schaller + * @version 1.1 (28.11.2019) + */ +public class GeometrischeBildoperationen +{ + /** spiegeleHorizontal spiegelt das Bild, so dass rechts und links getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelHorizontal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(breite-1)-x][y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** spiegeleHorizontal spiegelt das Bild, so dass oben und unten getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelVertikal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[x][(hoehe-1)-y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + /** dreheRechts dreht das Bild um 90° nach rechts + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + + public Picture dreheRechts(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[y][(breite-1)-x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** dreheLinks dreht das Bild um 90° nach links + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture dreheLinks(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(hoehe-1)-y][x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + + } + + /** drehe180 dreht das Bild um 180° + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture drehe180(Picture originalbild) { + Picture bild90 = dreheLinks(originalbild); + Picture bild180 = dreheLinks(bild90); + return bild180; + } + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Mehrpixeloperationen.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Mehrpixeloperationen.java new file mode 100644 index 0000000..f18a7c5 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/Mehrpixeloperationen.java @@ -0,0 +1,358 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; +/** + * Algorithmen, die auf der Veränderung der Farbinformationen eines Punktes und seines Umfeldes + * beruhen. Diese Operationen werden als Faltung bezeichnet. + * + * @author Thomas Schaller + * @version 1.0 (7.11.2019) + */ +public class Mehrpixeloperationen +{ + + Picture faltung(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = filter.length/2; x < originalbild.getWidth() - filter.length/2; x++){ + // Schleife über alle Zeilen + for (int y = filter.length/2; y < originalbild.getHeight() - filter.length/2; y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xx+i][yy+j].getRed(); + gruen += filter[i][j] * pixel[xx+i][yy+j].getGreen(); + blau += filter[i][j] * pixel[xx+i][yy+j].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Pixel außerhalb werden schwarz gesetzt + * + */ + Picture faltung_randbehandlung1(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth(); x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight(); y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // erst mal auf schwarz setzen + Color c = Color.BLACK; + // wenn innerhalb des Bildes, dann Pixelfarbe nutzen + if(xx+i >= 0 && xx+i =0 && yy+j < originalbild.getHeight()) { + c = pixel[xx+i][yy+j]; + } + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * c.getRed(); + gruen += filter[i][j] * c.getGreen(); + blau += filter[i][j] * c.getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Pixel außerhalb werden auf Randfarbe gesetzt + * + */ + Picture faltung_randbehandlung2(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth(); x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight(); y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Bestimme Pixelkoordinaten + int xxx = xx+i; + int yyy = yy+j; + + // Korrigiere Pixelkoordinaten, falls außerhalb + if(xxx<0) xxx=0; + if(xxx>= originalbild.getWidth()) xxx = originalbild.getWidth()-1; + if(yyy<0) yyy=0; + if(yyy>= originalbild.getHeight()) yyy = originalbild.getHeight()-1; + + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xxx][yyy].getRed(); + gruen += filter[i][j] * pixel[xxx][yyy].getGreen(); + blau += filter[i][j] * pixel[xxx][yyy].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Bild wird am Rand nach außen gespiegelt + * + */ + Picture faltung_randbehandlung3(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth() ; x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight() ; y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Bestimme Pixelkoordinaten + int xxx = xx+i; + int yyy = yy+j; + + // Korrigiere Pixelkoordinaten, falls außerhalb + if(xxx<0) xxx=-xxx; + if(xxx>= originalbild.getWidth()) xxx = 2*originalbild.getWidth()-xxx-1; + if(yyy<0) yyy=-yyy; + if(yyy>= originalbild.getHeight()) yyy = 2*originalbild.getHeight()-yyy-1; + + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xxx][yyy].getRed(); + gruen += filter[i][j] * pixel[xxx][yyy].getGreen(); + blau += filter[i][j] * pixel[xxx][yyy].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture weichzeichnen(Picture originalbild) { + double[][] mittelwertfilter ={{1.0/9,1.0/9,1.0/9}, + {1.0/9,1.0/9,1.0/9}, + {1.0/9,1.0/9,1.0/9}}; + return faltung(originalbild,mittelwertfilter); + } + + public Picture schaerfen(Picture originalbild) { + double[][] schaerfen ={{0,-1,0}, + {-1,5,-1}, + {0,-1,0}}; + return faltung(originalbild,schaerfen); + } + + public Picture relief(Picture originalbild) { + double[][] relieffilter ={{-2,-1,0}, + {-1,1,1}, + {0,1,2}}; + return faltung(originalbild,relieffilter); + } + + public Picture kantenfinden(Picture originalbild) { + double[][] kantenfilter ={{0,1,0}, + {1,-4,1}, + {0,1,0}}; + return faltung(originalbild,kantenfilter); + } + + public Picture kantenfindenHorizontal(Picture originalbild) { + double[][] sobelx ={{-1,0,1}, + {-2,0,2}, + {-1,0,1}}; + return faltung(originalbild,sobelx); + } + + public Picture kantenfindenVertikal(Picture originalbild) { + double[][] sobely={{-1,-2,-1}, + {0,0,0}, + {1,2,1}}; + return faltung(originalbild,sobely); + } + + // Ergänzungen: Größere Filter + + public Picture weichzeichnen(Picture originalbild, int groesse) { + // Deklariere die Matrix in der richtigen Größe. + double[][] mittelwertfilter = new double[groesse][groesse]; + // Berechne Anzahl der Zellen. + int anzahl = groesse * groesse; + + // Berechne für jede Zelle der Matrix ... + for(int i=0; i< groesse; i++) { + for(int j=0; j pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau > pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture graustufenMax(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = pixel[x][y].getRed(); + if (grau < pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau < pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture graustufenNatuerlich(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = (int) (pixel[x][y].getRed()*299+pixel[x][y].getGreen()*587+pixel[x][y].getBlue()*114)/1000; + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture invertieren(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = 255-pixel[x][y].getRed(); + int gruen = 255-pixel[x][y].getGreen(); + int blau = 255-pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotGruen(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getGreen(); + int gruen = pixel[x][y].getRed(); + int blau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getBlue(); + int gruen = pixel[x][y].getGreen(); + int blau = pixel[x][y].getRed(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschGruenBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getRed(); + int gruen = pixel[x][y].getBlue(); + int blau = pixel[x][y].getGreen(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture farbaenderung(Picture originalbild, double faktor_r, double faktor_g, double faktor_b) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = (int) (pixel[x][y].getRed() * faktor_r); + int gruen = (int) (pixel[x][y].getGreen() * faktor_g); + int blau = (int) (pixel[x][y].getBlue() * faktor_b); + + //Begrenzung auf zulässigen Bereich + if(rot < 0) rot = 0; + if(rot > 255) rot = 255; + if(gruen < 0) gruen = 0; + if(gruen > 255) gruen = 255; + if(blau < 0) blau = 0; + if(blau > 255) blau = 255; + + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/allclasses.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/allclasses.html new file mode 100644 index 0000000..47b80da --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/allclasses.html @@ -0,0 +1,20 @@ + + + + + +All Classes + + + + + + +

All Classes

+
+ +
+ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/constant-values.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/constant-values.html new file mode 100644 index 0000000..67a232a --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/constant-values.html @@ -0,0 +1,73 @@ + + + + + +Constant Field Values + + + + + + + + +
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+ + +
+

imp.*

+
    +
  • + + + + + + + + + + + + + + + + + + + +
    imp.PictureViewer 
    Modifier and TypeConstant FieldValue
    + +public static final intFIT-1
    + +public static final intNORMAL1
    +
  • +
+
+
+
+ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/element-list b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/element-list new file mode 100644 index 0000000..6711e1c --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/element-list @@ -0,0 +1 @@ +imp diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/Picture.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/Picture.html new file mode 100644 index 0000000..7f2a95d --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/Picture.html @@ -0,0 +1,1276 @@ + + + + + +Picture + + + + + + + + + +
+
+
Package imp
+

Class Picture

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • imp.Picture
    • +
    +
  • +
+
+
    +
  • +
    +
    public class Picture
    +extends java.lang.Object
    +
    Bildklasse fuer die Simulation von Processing-Befehlen + + Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + werden kann. + Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt.
    +
    +
    Version:
    +
    1.0 from 23.01.2019
    +
    Author:
    +
    Thomas Schaller (ZPG Informatik Klasse 9)
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intCENTER 
      static intCORNER 
      static intCORNERS 
      static intRADIUS 
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      Picture() +
      Erzeugt ein Bild mit Standardgroesse 500x400
      +
      Picture​(int width, + int height) +
      Erzeugt ein Bild der angegeben Groesse
      +
      Picture​(int width, + int height, + java.lang.String background) +
      Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
      +
      Picture​(java.lang.String filename) +
      Erzeugt ein Bild aus einer Datei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Loescht den Inhalt des Bildes.
      +
      voiddelay​(int millis) +
      Hilfsfunktion zum Verzoegern der Ausgabe
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefuellt werden.
      +
      voidforceRepaint() +
      Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
      +
      intgetHeight() +
      Liefert die Hoehe des Bildes zurueck.
      +
      java.awt.image.BufferedImagegetImage() +
      Direktes Abfragen des Bildes (fuer interne Zwecke)
      +
      imp.PictureViewergetObserver() 
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      intgetWidth() +
      Liefert die Breite des Bildes zurueck.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Laedt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefuellt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird.
      +
      voidsetImage​(java.awt.image.BufferedImage b) +
      Direktes Setzen des Bildes (fuer interne Zwecke)
      +
      voidsetObserver​(imp.PictureViewer observer) +
      Legt fest, wer das Bild anzeigt.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetTitle​(java.lang.String titel) 
      voidshowInFrame() 
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String s, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart fuer Textausgaben fest.
      +
      voidtriangle​(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, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Picture

        +
        public Picture()
        +
        Erzeugt ein Bild mit Standardgroesse 500x400
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height)
        +
        Erzeugt ein Bild der angegeben Groesse
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(java.lang.String filename)
        +
        Erzeugt ein Bild aus einer Datei
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        Picture

        +
        public Picture​(int width,
        +               int height,
        +               java.lang.String background)
        +
        Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        background - Farbe des Hintergrunds
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        showInFrame

        +
        public void showInFrame()
        +
      • +
      + + + +
        +
      • +

        setObserver

        +
        public void setObserver​(imp.PictureViewer observer)
        +
        Legt fest, wer das Bild anzeigt. + Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert.
        +
        +
        Parameters:
        +
        observer - Anzeiger des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getObserver

        +
        public imp.PictureViewer getObserver()
        +
      • +
      + + + +
        +
      • +

        setImage

        +
        public void setImage​(java.awt.image.BufferedImage b)
        +
        Direktes Setzen des Bildes (fuer interne Zwecke)
        +
        +
        Parameters:
        +
        b - Bild, das gespeichert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        getImage

        +
        public java.awt.image.BufferedImage getImage()
        +
        Direktes Abfragen des Bildes (fuer interne Zwecke)
        +
        +
        Returns:
        +
        Bild, das gerade gespeichert ist.
        +
        +
      • +
      + + + +
        +
      • +

        size

        +
        public void size​(int width,
        +                 int height)
        +
        Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu.
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getWidth

        +
        public int getWidth()
        +
        Liefert die Breite des Bildes zurueck.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getHeight

        +
        public int getHeight()
        +
        Liefert die Hoehe des Bildes zurueck.
        +
        +
        Returns:
        +
        Hoehe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        setTitle

        +
        public void setTitle​(java.lang.String titel)
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden.
        +
        +
        Parameters:
        +
        autorefresh - true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen
        +
        +
      • +
      + + + +
        +
      • +

        forceRepaint

        +
        public void forceRepaint()
        +
        Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Loescht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt.
        +
      • +
      + + + +
        +
      • +

        rectMode

        +
        public void rectMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        ellipseMode

        +
        public void ellipseMode​(int mode)
        +
        Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen.
        +
        +
        Parameters:
        +
        mode - Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS)
        +
        +
      • +
      + + + +
        +
      • +

        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 einzufaerben, verwenden Sie die stroke() Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + strokeWeight() geaendert 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
        +
        +
      • +
      + + + +
        +
      • +

        rect

        +
        public void rect​(int a,
        +                 int b,
        +                 int c,
        +                 int d)
        +
        Zeichnet ein Rechteck auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion rectMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        b - meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch rectMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        ellipse

        +
        public void ellipse​(int a,
        +                    int b,
        +                    int c,
        +                    int d)
        +
        Zeichnet eine Ellipse/Kreis auf das Bild. + Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion ellipseMode() geaendert werden. + Durch den Befehl fill() /noFill() kann die Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        a - meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        b - meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden).
        +
        c - meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        d - meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden).
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + sind nicht auf neunzig Grad beschraenkt. 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 Fuellfarbe des Rechtecks gewaehlt 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.
        +
        +
      • +
      + + + +
        +
      • +

        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 Fuellfarbe des Rechtecks gewaehlt werden, durch stroke()/noStroke() die Rahmenfarbe.
        +
        +
        Parameters:
        +
        x - Liste der x-Koordinaten der Punkte.
        +
        y - Liste der y-Koordinaten der Punkte.
        +
        +
      • +
      + + + +
        +
      • +

        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 fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt.
        +
        +
        Parameters:
        +
        x - x-Koordinate des Punktes
        +
        y - y-Koordinate des Punktes
        +
        +
      • +
      + + + +
        +
      • +

        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 ausgewaehlte 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 fuer Textausgaben fest. + Jeder uebliche 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
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(java.lang.String pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        pencolor - Stiftfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        stroke

        +
        public void stroke​(int pencolor)
        +
        Legt die Farbe fest, mit der Linien und Raender 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 weiss, 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 Raender um Formen gezeichnet werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Stiftfarbe
        +
        g - Gruenanteil (0-255) der Stiftfarbe
        +
        b - Blauanteil (0-255) der Stiftfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        strokeWeight

        +
        public void strokeWeight​(double width)
        +
        Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + Alle Breiten werden in Pixeleinheiten angegeben.
        +
        +
        Parameters:
        +
        width - Breite in Pixel
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(java.lang.String fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden).
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe in Hexadezimaldarstellung
        +
        +
      • +
      + + + +
        +
      • +

        fill

        +
        public void fill​(int fillcolor)
        +
        Legt die Farbe fest, mit der Formen gefuellt werden. + Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        fillcolor - Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 gefuellt werden. + Diese Farbe wird komponentenweise als RGB-Wert angegeben.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Fuellfarbe
        +
        g - Gruenanteil (0-255) der Fuellfarbe
        +
        b - Blauanteil (0-255) der Fuellfarbe
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefuellt werden sollen.
        +
      • +
      + + + +
        +
      • +

        background

        +
        public void background​(int c)
        +
        Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        c - Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, 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 fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden.
        +
        +
        Parameters:
        +
        r - Rotanteil (0-255) der Hintergrundfarbe
        +
        g - Gruenanteil (0-255) der Hintergrundfarbe
        +
        b - Blauanteil (0-255) der Hintergrundfarbe
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        public void load​(java.lang.String filename)
        +
        Laedt ein Bild aus dem Dateisystem. + Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        public void save​(java.lang.String filename)
        +
        Speichert ein Bild. + Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist.
        +
        +
        Parameters:
        +
        filename - Dateiname des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        setPixelArray

        +
        public void setPixelArray​(java.awt.Color[][] pixel)
        +
        Setzt das Bild neu auf Basis des Pixel-Arrays. + Die Groesse des Bildes wird nicht automatisch an das Array angepasst.
        +
        +
        Parameters:
        +
        pixel - zweidimensionales Array von Color-Objekten
        +
        +
      • +
      + + + +
        +
      • +

        delay

        +
        public void delay​(int millis)
        +
        Hilfsfunktion zum Verzoegern der Ausgabe
        +
        +
        Parameters:
        +
        millis - Wartezeit in Millisekunden
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/PictureViewer.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/PictureViewer.html new file mode 100644 index 0000000..af51632 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/PictureViewer.html @@ -0,0 +1,1371 @@ + + + + + +PictureViewer + + + + + + + + + +
+
+
Package imp
+

Class PictureViewer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • java.awt.Window
        • +
        • +
            +
          • java.awt.Frame
          • +
          • +
              +
            • javax.swing.JFrame
            • +
            • +
                +
              • imp.PictureViewer
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants
    +
    +
    +
    public class PictureViewer
    +extends javax.swing.JFrame
    +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen. Zusätzlich können + mehrere Verarbeitungsschritte gespeichert werden, um ein + "zurück"-Funktion zu ermöglichen.
    +
    +
    Version:
    +
    V1.0 vom 10.02.2019
    +
    Author:
    +
    Thomas Schaller
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JFrame

        +javax.swing.JFrame.AccessibleJFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Frame

        +java.awt.Frame.AccessibleAWTFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Window

        +java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFIT 
      static intNORMAL 
      protected imp.Picturepicture 
      +
        +
      • + + +

        Fields inherited from class javax.swing.JFrame

        +accessibleContext, rootPane, rootPaneCheckingEnabled
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Frame

        +ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
        +
      • + + +

        Fields inherited from interface javax.swing.WindowConstants

        +DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      PictureViewer() +
      Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
      +
      PictureViewer​(int width, + int height) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(int width, + int height, + java.lang.String background) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(imp.Picture p) 
      PictureViewer​(java.lang.String filename) +
      Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidback() +
      Ruft das letzte abgespeicherte Bild aus der History wieder auf.
      +
      voidbackground​(int c) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidbackground​(int r, + int g, + int b) +
      Die Funktion background() setzt die Farbe, die für den Hintergrund des Bildes verwendet wird.
      +
      voidclear() +
      Löscht den Inhalt des Bildes.
      +
      voidellipse​(int a, + int b, + int c, + int d) +
      Zeichnet eine Ellipse/Kreis auf das Bild.
      +
      voidellipseMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen.
      +
      voidfill​(int fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      voidfill​(java.lang.String fillcolor) +
      Legt die Farbe fest, mit der Formen gefüllt werden.
      +
      intgetImageHeight() +
      Liefert die Höhe des Bildes zurück.
      +
      intgetImageWidth() +
      Liefert die Breite des Bildes zurück.
      +
      java.awt.Color[][]getPixelArray() +
      Liefert das Bild als zweidimensionales Pixel-Array.
      +
      voidline​(int x1, + int y1, + int x2, + int y2) +
      Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm.
      +
      voidload​(java.lang.String filename) +
      Lädt ein Bild aus dem Dateisystem.
      +
      voidnoFill() +
      Legt fest, dass die Formen nicht gefüllt werden sollen.
      +
      voidnoStroke() +
      Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
      +
      voidpoint​(int x, + int y) +
      Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels.
      +
      voidpolygon​(int[] x, + int[] y) +
      Zeichnet ein Polygon auf das Bild.
      +
      voidpushImage() +
      Speichert das übergebene Bild in der History.
      +
      voidquad​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3, + int x4, + int y4) +
      Zeichnet ein Viereck auf das Bild.
      +
      voidrect​(int a, + int b, + int c, + int d) +
      Zeichnet ein Rechteck auf das Bild.
      +
      voidrectMode​(int mode) +
      Ändert den Koordinaten-Modus beim Zeichnen von Rechtecken.
      +
      voidrefresh() +
      Sorgt für die Aktualisierung der Bildschrimanzeige.
      +
      voidrepaint() +
      Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
      +
      voidsave​(java.lang.String filename) +
      Speichert ein Bild.
      +
      voidsetAutoRefresh​(boolean autoRefresh) +
      Setzt die automatische Neuanzeige des Bildes.
      +
      voidsetPixelArray​(java.awt.Color[][] pixel) +
      Setzt das Bild neu auf Basis des Pixel-Arrays.
      +
      voidsetZoom​(double zoom) +
      Setzt den Zoom-Faktor für das Bild.
      +
      voidsize​(int width, + int height) +
      Definiert die Dimension der Breite und Höhe des Anzeigefensters in Pixeleinheiten.
      +
      voidstroke​(int pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(int r, + int g, + int b) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstroke​(java.lang.String pencolor) +
      Legt die Farbe fest, mit der Linien und Ränder um Formen gezeichnet werden.
      +
      voidstrokeWeight​(double width) +
      Legt die Breite des Strichs für Linien, Punkte und den Rand um Formen fest.
      +
      voidtext​(java.lang.String t, + int x, + int y) +
      Gibt einen Text an den gegebenen Koordinaten aus + Zur Ausgabe des Textes wird der ausgewählte Font verwendet.
      +
      voidtextFont​(java.awt.Font font) +
      Legt die Schriftart für Textausgaben fest.
      +
      voidtriangle​(int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +
      Zeichnet ein Dreieck auf das Bild.
      +
      +
        +
      • + + +

        Methods inherited from class javax.swing.JFrame

        +addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Frame

        +addNotify, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Window

        +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, toBack, toFront
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, list, list, paintComponents, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, hasFocus, imageUpdate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, list, list, list, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.MenuContainer

        +getFont
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer()
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der Größe 500x400
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height,
        +                     java.lang.String background)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        background - Farbe des Hintergrunds als HEX-String (z.B. "FF3A45")
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(java.lang.String filename)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
        +
        +
        Parameters:
        +
        filename - Name des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(imp.Picture p)
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        pushImage

        +
        public void pushImage()
        +
        Speichert das übergebene Bild in der History.
        +
        +
        Parameters:
        +
        b - zu speicherndes Bild
        +
        +
      • +
      + + + +
        +
      • +

        back

        +
        public void back()
        +
        Ruft das letzte abgespeicherte Bild aus der History wieder auf.
        +
      • +
      + + + +
        +
      • +

        setZoom

        +
        public void setZoom​(double zoom)
        +
        Setzt den Zoom-Faktor für das Bild. + Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich.
        +
        +
        Parameters:
        +
        factor - Zoomfaktor (1.0 = 100%).
        +
        +
      • +
      + + + +
        +
      • +

        setAutoRefresh

        +
        public void setAutoRefresh​(boolean autoRefresh)
        +
        Setzt die automatische Neuanzeige des Bildes. + Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + die Methode refresh() auf.
        +
        +
        Parameters:
        +
        autoRefresh - true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll.
        +
        +
      • +
      + + + +
        +
      • +

        refresh

        +
        public void refresh()
        +
        Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + Anzeige automatisiert werden.
        +
      • +
      + + + +
        +
      • +

        repaint

        +
        public void repaint()
        +
        Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
        +
        +
        Overrides:
        +
        repaint in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        getImageWidth

        +
        public int getImageWidth()
        +
        Liefert die Breite des Bildes zurück.
        +
        +
        Returns:
        +
        Breite des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        getImageHeight

        +
        public int getImageHeight()
        +
        Liefert die Höhe des Bildes zurück.
        +
        +
        Returns:
        +
        Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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).
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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)
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noStroke

        +
        public void noStroke()
        +
        Legt fest, dass keine Linien oder Ränder um Formen gezeichnet werden soll.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        noFill

        +
        public void noFill()
        +
        Legt fest, dass die Formen nicht gefüllt werden sollen.
        +
      • +
      + + + +
        +
      • +

        clear

        +
        public void clear()
        +
        Löscht den Inhalt des Bildes. + Der Hintergrund wird mit der Hintergrundfarbe neu gefüllt.
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      + + + +
        +
      • +

        text

        +
        public void text​(java.lang.String t,
        +                 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:
        +
        t - 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
        +
        +
      • +
      + + + +
        +
      • +

        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.
        +
        +
      • +
      + + + +
        +
      • +

        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
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/package-summary.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/package-summary.html new file mode 100644 index 0000000..4d7557e --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/imp/package-summary.html @@ -0,0 +1,54 @@ + + + + + +imp + + + + + + + + +
+
+

Package imp

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    PictureViewer +
    Der PictureViewer ist ein Actor, der in der Lage ist ein + Objekt der Klasse Picture anzuzeigen.
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/index.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/index.html new file mode 100644 index 0000000..ddcb119 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/index.html @@ -0,0 +1,23 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + +
+ +

imp/package-summary.html

+
+ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/logfile.txt b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/logfile.txt new file mode 100644 index 0000000..f39208c --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/logfile.txt @@ -0,0 +1,40 @@ +Class documentation +<---- javadoc command: ----> +E:\Programme\Informatik\BlueJ4.2\BlueJ\jdk\bin\javadoc.exe +-author +-version +-nodeprecated +-package +-Xdoclint:none +-noindex +-notree +-nohelp +-nonavbar +-source +11 +-classpath +E:\Programme\Informatik\BlueJ4.2\bluej\lib\bluejcore.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\junit-4.11.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\hamcrest-core-1.3.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\lang-stride.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.base.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.controls.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.fxml.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.graphics.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.media.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.properties.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.swing.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.web.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\+libs\jdom-1.1.3.jar;F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk +-d +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc +-encoding +windows-1252 +-charset +windows-1252 +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java +<---- end of javadoc command ----> +Loading source file F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java... +Constructing Javadoc information... +Standard Doclet version 11.0.2 +Building tree for all the packages and classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\PictureViewer.html... +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:123: warning - @param argument "b" is not a parameter name. +F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\imp\PictureViewer.java:163: warning - @param argument "factor" is not a parameter name. +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\imp\package-summary.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\constant-values.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\serialized-form.html... +Building index for all the packages and classes... +Building index for all classes... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\allclasses.html... +Generating F:\Informatik\Fortbildung ZPG IMP9\Fortbildungsfassung_überarbeitet\I02_alg\03_vorlagen_tauschordner\blueJVersion_Dirk\doc\index.html... +2 warnings diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/script.js b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/script.js new file mode 100644 index 0000000..d33d3ab --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/script.js @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'jquery/jszip/dist/jszip.js'); + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils.js'); + if (window.navigator.userAgent.indexOf('MSIE ') > 0 || window.navigator.userAgent.indexOf('Trident/') > 0 || + window.navigator.userAgent.indexOf('Edge/') > 0) { + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); + } + createElem(doc, tag, 'search.js'); + + $.get(pathtoroot + "module-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "package-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "type-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "member-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "tag-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + }); + }); + if (!moduleSearchIndex) { + createElem(doc, tag, 'module-search-index.js'); + } + if (!packageSearchIndex) { + createElem(doc, tag, 'package-search-index.js'); + } + if (!typeSearchIndex) { + createElem(doc, tag, 'type-search-index.js'); + } + if (!memberSearchIndex) { + createElem(doc, tag, 'member-search-index.js'); + } + if (!tagSearchIndex) { + createElem(doc, tag, 'tag-search-index.js'); + } + $(window).resize(function() { + $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + }); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} + +function updateModuleFrame(pFrame, cFrame) { + top.packageFrame.location = pFrame; + top.classFrame.location = cFrame; +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/serialized-form.html b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/serialized-form.html new file mode 100644 index 0000000..26abcce --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/serialized-form.html @@ -0,0 +1,71 @@ + + + + + +Serialized Form + + + + + + + + +
+
+

Serialized Form

+
+
+
    +
  • +
    +

    Package imp

    +
      +
    • + + +

      Class imp.PictureViewer extends javax.swing.JFrame implements Serializable

      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          history

          +
          java.util.Vector<java.awt.image.BufferedImage> history
          +
        • +
        • +

          imagePane

          +
          javax.swing.JLabel imagePane
          +
        • +
        • +

          picture

          +
          imp.Picture picture
          +
        • +
        • +

          zoom

          +
          double zoom
          +
        • +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+ + diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/stylesheet.css b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/stylesheet.css new file mode 100644 index 0000000..c027275 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/doc/stylesheet.css @@ -0,0 +1,906 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +a[name]:before, a[name]:target, a[id]:before, a[id]:target { + content:""; + display:inline-block; + position:relative; + padding-top:129px; + margin-top:-129px; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} + +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.navPadding { + padding-top: 107px; +} +.fixedNav { + position:fixed; + width:100%; + z-index:999; + background-color:#ffffff; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch { + float:right; + margin:0 0 0 0; + padding:0; +} +ul.navListSearch li { + list-style:none; + float:right; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch li label { + position:relative; + right:-16px; +} +ul.subNavList li { + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Styles for page header and footer. + */ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexNav { + position:relative; + font-size:12px; + background-color:#dee3e9; +} +.indexNav ul { + margin-top:0; + padding:5px; +} +.indexNav ul li { + display:inline; + list-style-type:none; + padding-right:10px; + text-transform:uppercase; +} +.indexNav h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* + * Styles for page layout containers. + */ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, +.allClassesContainer, .allPackagesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary, +.requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption, +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.constantsSummary caption a:link, .deprecatedSummary caption a:link, +.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link, +.usesSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover, +.usesSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.constantsSummary caption a:active, .deprecatedSummary caption a:active, +.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active, +.usesSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.constantsSummary caption a:visited, .deprecatedSummary caption a:visited, +.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited, +.usesSummary caption a:visited { + color:#FFFFFF; +} +.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active, +.useSummary caption a:visited { + color:#1f389c; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, +.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, +.usesSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span, +.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span, +.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab, +.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab, +.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab, +.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd, +.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd, +.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd, +.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; +} +.rowColor th, .altColor th { + font-weight:normal; +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td, +.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, +.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, +.constantsSummary td { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th, +.packagesSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + font-size:13px; +} +td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast { + font-size:13px; +} +.constantsSummary th, .packagesSummary th { + font-size:13px; +} +.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, +.providesSummary td.colLast { + white-space:normal; + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.requiresSummary td.colFirst, .requiresSummary th.colFirst, +.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, +.usesSummary td.colFirst, .usesSummary th.colFirst, +.providesSummary td.colFirst, .providesSummary th.colFirst, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName, +.typeSummary td.colFirst, .typeSummary th.colFirst { + vertical-align:top; +} +.packagesSummary th.colLast, .packagesSummary td.colLast { + white-space:normal; +} +td.colFirst a:link, td.colFirst a:visited, +td.colSecond a:link, td.colSecond a:visited, +th.colFirst a:link, th.colFirst a:visited, +th.colSecond a:link, th.colSecond a:visited, +th.colConstructorName a:link, th.colConstructorName a:visited, +th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, +.constantValuesContainer td a:link, .constantValuesContainer td a:visited, +.allClassesContainer td a:link, .allClassesContainer td a:visited, +.allPackagesContainer td a:link, .allPackagesContainer td a:visited { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor, .altColor th { + background-color:#FFFFFF; +} +.rowColor, .rowColor th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.colLast div { + padding-top:0px; +} +td.colLast a { + padding-bottom:3px; +} +/* + * Styles for formatting effect. + */ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, +.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType, +.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel, +.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} +.deprecationBlock { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} +div.contentContainer ul.blockList li.blockList h2 { + padding-bottom:0px; +} +/* + * Styles for IFRAME. + */ +.mainContainer { + margin:0 auto; + padding:0; + height:100%; + width:100%; + position:fixed; + top:0; + left:0; +} +.leftContainer { + height:100%; + position:fixed; + width:320px; +} +.leftTop { + position:relative; + float:left; + width:315px; + top:0; + left:0; + height:30%; + border-right:6px solid #ccc; + border-bottom:6px solid #ccc; +} +.leftBottom { + position:relative; + float:left; + width:315px; + bottom:0; + left:0; + height:70%; + border-right:6px solid #ccc; + border-top:1px solid #000; +} +.rightContainer { + position:absolute; + left:320px; + top:0; + bottom:0; + height:100%; + right:0; + border-left:1px solid #000; +} +.rightIframe { + margin:0; + padding:0; + height:100%; + right:30px; + width:100%; + overflow:visible; + margin-bottom:30px; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.resultItem { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.resultHighlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:17px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.searchTagDescResult { + font-style:italic; + font-size:11px; +} +.searchTagHolderResult { + font-style:italic; + font-size:12px; +} +.searchTagResult:before, .searchTagResult:target { + color:red; +} +.moduleGraph span { + display:none; + position:absolute; +} +.moduleGraph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.methodSignature { + white-space:normal; +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/HSB.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/HSB.java new file mode 100644 index 0000000..5337124 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/HSB.java @@ -0,0 +1,55 @@ +package imp; + +import java.awt.Color; + +/** + * Hilfsklasse für das HSB-Farbmodell + * + * @author Thomas Schaller + * @version V1.0 14.01.2020 + */ + +public class HSB +{ + /** + * Liefert den Farbton als Winkel zwischen 0.0° und 360.0°. + * @param Color c Farbe, deren Farbton bestimmt werden soll. + * @return Farbton + */ + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; + } + + /** + * Liefert die Sättigung als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Sättigung bestimmt werden soll. + * @return Sättigung + */ + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; + } + + /** + * Liefert die Helligkeit als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Helligkeit bestimmt werden soll. + * @return Sättigung + */ + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; + } + + /** + * Liefert ein Java-Color-Objekt mit den angegebenen HSB-Werten. + * @param h Farbton (Hue) + * @param s Sättigung (Saturation) + * @param b Brightness (Helligkeit) + * @return Java-Color-Objekt + */ + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Picture.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Picture.java new file mode 100644 index 0000000..100fee8 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Picture.java @@ -0,0 +1,747 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + showInFrame(); + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + showInFrame(); + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + if(observer != null) observer.resize(); + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + public void setTitle (String titel) { + getObserver().setTitle(titel); + } + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + if(observer != null) observer.resize(); + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new java.awt.Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/PictureViewer.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/PictureViewer.java new file mode 100644 index 0000000..34b52bb --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/PictureViewer.java @@ -0,0 +1,221 @@ +package imp; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import javax.swing.*; +import javax.swing.event.*; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; + +/** + * Der PictureViewer ist ein JFrame, der in der Lage ist ein + * Objekt der Klasse Picture anzuzeigen. Zusätzlich können + * mehrere Verarbeitungsschritte gespeichert werden, um ein + * "zurück"-Funktion zu ermöglichen. + * + * @author Thomas Schaller + * @version V1.2 vom 06.12.2019 + */ +public class PictureViewer extends JFrame implements MouseWheelListener +{ + public static final int FIT = -1; + public static final int NORMAL = 1; + + private static final int ANZ_BACK = 0; + + private double zoom; + protected Picture picture = null; + private Vector history; + private JLabel imagePane = new JLabel(); + private JScrollPane scrollPane; + // private boolean antialiasing; + + /** + * Erzeugt ein ScrollPanel der Größe 500x400 + */ + public PictureViewer() { + this(800,500); + } + + /** + * Erzeugt ein ScrollPanel der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(new Picture(width, height)); + } + + public PictureViewer(Picture p) { + picture = p; + picture.setObserver(this); + this.history = new Vector(); + this.zoom = NORMAL; + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + Container cp = getContentPane(); + cp.setLayout(new BorderLayout()); + imagePane.setPreferredSize(new Dimension(p.getWidth(), p.getHeight())); + scrollPane = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); + scrollPane.setViewportView( imagePane ); + + cp.add(scrollPane, BorderLayout.CENTER); + pack(); + this.setVisible(true); + + repaint(); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (d.width - getSize().width); + //int x = 0; + int y = 0; + setLocation(x, y); + + scrollPane.addMouseWheelListener(this); + } + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + BufferedImage b = new BufferedImage(picture.getWidth(), picture.getHeight(), picture.getImage().getType()); + Graphics g = b.getGraphics(); + g.drawImage(picture.getImage(), 0, 0, null); + g.dispose(); + + history.add(b); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + private void popImage() { + int anz = history.size(); + if(anz>0) { + BufferedImage i = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(i); + repaint(); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + popImage(); + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double zoom) { + if(zoom>0.01 && zoom<10.0) { + this.zoom = zoom; + } + // else this.zoom = NORMAL; + resize(); + repaint(); + } + + // public void setAntialiasing(boolean antialiasing) { + // this.antialiasing = antialiasing; + // } + + /** + * Setzt die automatische Neuanzeige des Bildes. + * Mit dieser Methode kann man einstellen, ob nach jedem Zeichenbefehl + * die Anzeige auf dem Bildschirm aktualisiert werden soll. Bei sehr + * vielen Zeichenbefehlen wird die Ausgabe dadurch sehr langsam. Es reicht + * eine Anzeige am Ende der Zeichenbefehle. Rufen Sie dann für das Neuzeichnen + * die Methode refresh() auf. + * @param autoRefresh true, wenn nach jedem Zeichenbefehl die Anzeige aktualisiert werden soll. + */ + public void setAutoRefresh(boolean autoRefresh) { + picture.setAutoRefresh(autoRefresh); + } + + /** + * Sorgt für die Aktualisierung der Bildschrimanzeige. Das aktuelle Bild + * wird dadurch angezeigt. Durch Einstellung von autoRefresh kann die + * Anzeige automatisiert werden. + */ + public void refresh() { + repaint(); + } + + /** + * Passt die Framegröße an das anzuzeigende Bild an. + */ + public void resize() { + int pref_x = (int) (picture.getWidth()*zoom); + int pref_y = (int) (picture.getHeight()*zoom); + imagePane.setPreferredSize(new Dimension(pref_x,pref_y)); + + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + if((pref_x > d.getWidth()-30) || (pref_y > d.getHeight()-100)) { + pref_x = Math.min(pref_x, (int) d.getWidth()-30); + pref_y = Math.min(pref_y, (int) d.getHeight()-100); + scrollPane.setPreferredSize(new Dimension(pref_x,pref_y)); + } else scrollPane.setPreferredSize(null); + + imagePane.revalidate(); + pack(); + } + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + + public void repaint() { + double faktor = zoom; + + if (zoom == FIT) { + double faktorw = (double) imagePane.getWidth() / picture.getWidth(); + double faktorh = (double) imagePane.getHeight() / picture.getHeight(); + faktor = Math.min(faktorw, faktorh); + } + int disp_width = (int) (picture.getWidth()*faktor); + int disp_height = (int) (picture.getHeight()*faktor); + + BufferedImage image = new BufferedImage(disp_width, disp_height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) image.getGraphics(); + + if(picture.isAntialiasing()) { + picture.antialise(); + } + else g.getRenderingHints().clear(); + + g.drawImage(picture.getImage(),0,0,disp_width, disp_height, 0, 0, picture.getWidth(), picture.getHeight(), null); + g.setColor(new java.awt.Color(0,0,0)); + g.setStroke(new BasicStroke((float) 1)); + g.drawRect(0,0,disp_width-1, disp_height-1); + + imagePane.setIcon(new ImageIcon(image)); + imagePane.repaint(); + + } + + /** Setzt ZoomFaktor über MouseWheel + * + */ + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + if ( notches < 0) { + setZoom(zoom * 1.1); + } else { + setZoom(zoom * 1.0/1.1); + } + } +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Table.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/XML.java b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/package.bluej b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/package.bluej new file mode 100644 index 0000000..b9a9be9 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/imp/package.bluej @@ -0,0 +1,71 @@ +#BlueJ package file +dependency1.from=Table +dependency1.to=TableRow +dependency1.type=UsesDependency +dependency2.from=PictureViewer +dependency2.to=Picture +dependency2.type=UsesDependency +dependency3.from=Picture +dependency3.to=PictureViewer +dependency3.type=UsesDependency +objectbench.height=89 +objectbench.width=565 +package.divider.horizontal=0.6 +package.divider.vertical=0.808 +package.editor.height=397 +package.editor.width=475 +package.editor.x=594 +package.editor.y=183 +package.frame.height=600 +package.frame.width=605 +package.numDependencies=3 +package.numTargets=6 +package.showExtends=true +package.showUses=true +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=PictureViewer +target1.showInterface=false +target1.type=ClassTarget +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=Table +target2.showInterface=false +target2.type=ClassTarget +target2.width=80 +target2.x=120 +target2.y=110 +target3.height=50 +target3.name=Picture +target3.showInterface=false +target3.type=ClassTarget +target3.width=80 +target3.x=180 +target3.y=250 +target4.height=50 +target4.name=XML +target4.showInterface=false +target4.type=ClassTarget +target4.width=80 +target4.x=220 +target4.y=130 +target5.height=50 +target5.name=HSB +target5.showInterface=false +target5.type=ClassTarget +target5.width=80 +target5.x=10 +target5.y=90 +target6.height=50 +target6.name=TableRow +target6.showInterface=false +target6.type=ClassTarget +target6.width=90 +target6.x=220 +target6.y=60 diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/package.bluej b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/package.bluej new file mode 100644 index 0000000..c715ec1 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/package.bluej @@ -0,0 +1,59 @@ +#BlueJ package file +editor.fx.0.height=739 +editor.fx.0.width=816 +editor.fx.0.x=1115 +editor.fx.0.y=162 +objectbench.height=93 +objectbench.width=760 +package.divider.horizontal=0.599476439790576 +package.divider.vertical=0.8 +package.editor.height=393 +package.editor.width=670 +package.editor.x=455 +package.editor.y=113 +package.frame.height=600 +package.frame.width=800 +package.numDependencies=0 +package.numTargets=5 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=Beispielbild +target1.showInterface=false +target1.type=ClassTarget +target1.width=100 +target1.x=20 +target1.y=110 +target2.height=50 +target2.name=Punktoperationen +target2.showInterface=false +target2.type=ClassTarget +target2.width=140 +target2.x=270 +target2.y=180 +target3.height=62 +target3.name=imp +target3.type=PackageTarget +target3.width=80 +target3.x=80 +target3.y=10 +target4.height=50 +target4.name=GeometrischeBildoperationen +target4.showInterface=false +target4.type=ClassTarget +target4.width=210 +target4.x=270 +target4.y=110 +target5.height=50 +target5.name=Mehrpixeloperationen +target5.showInterface=false +target5.type=ClassTarget +target5.width=160 +target5.x=270 +target5.y=250 diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej-debuglog.txt b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej-debuglog.txt new file mode 100644 index 0000000..6211b98 --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej-debuglog.txt @@ -0,0 +1,13 @@ +BlueJ run started: Fri Nov 29 10:42:25 CET 2019 +BlueJ version 3.1.4 +Java version 1.8.0_231 +Virtual machine: Java HotSpot(TM) 64-Bit Server VM 25.231-b11 (Oracle Corporation) +Running on: Windows 10 10.0 (amd64) +Java Home: C:\Program Files\Java\jdk1.8.0_231\jre +---- +Detected language "english" based on iso639-2 code "deu" +Opening project: M:\Fortbildung ZPG IMP10\4_loesungen\01_geometrische_bildoperationen +1575020554702: Listening for JDWP connection on address: javadebug +Connected to debug VM via dt_shmem transport... +Communication with debug VM fully established. +Simple GUI Extension terminates diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej.properties b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej.properties new file mode 100644 index 0000000..09b101e --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/bluej.properties @@ -0,0 +1,11 @@ +#BlueJ properties. Settings in this file override "bluej.defs" +#Fri Nov 29 10:42:36 CET 2019 +bluej.editor.fontsize=12 +bluej.startWithTextEval=false +bluej.openPackage1=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +extensions.org.bluej.extensions.submitter.Submitter.settings.saslrealm= +bluej.recentProject0=M\:\\Fortbildung ZPG IMP10\\4_loesungen\\01_geometrische_bildoperationen +bluej.uid=38075fda-de76-4394-a2d5-304ddf93e08b +bluej.terminal.y=16 +bluej.terminal.x=16 +blackbox.uuid=optout diff --git a/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/moe.properties b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/moe.properties new file mode 100644 index 0000000..1a1f96e --- /dev/null +++ b/4_loesungen/03_mehrpixeloperationen_lsg/03_mehrpixeloperationen/userhome/bluej/moe.properties @@ -0,0 +1,2 @@ +#Moe Editor properties. Settings in this file override "moe.defs" +#Fri Nov 29 10:42:36 CET 2019 diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/LICENSE.txt b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/LICENSE.txt new file mode 100644 index 0000000..5a75e93 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/LICENSE.txt @@ -0,0 +1,56 @@ +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar new file mode 100644 index 0000000..a287727 Binary files /dev/null and b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/+libs/jdom-1.1.3.jar differ diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/BildbearbeitungGUI.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/BildbearbeitungGUI.java new file mode 100644 index 0000000..e1d9813 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/BildbearbeitungGUI.java @@ -0,0 +1,29 @@ +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class BildbearbeitungGUI extends Application { + + @Override + public void start(Stage primaryStage) { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("view/gui_erstellen_6.fxml")); + + VBox root = (VBox) loader.load(); + Scene scene = new Scene(root); + + primaryStage.setScene(scene); + primaryStage.show(); + } + catch(Exception e) { + System.out.println(e); + e.printStackTrace(); + } + } + public static void main(String[] args) { + launch(args); + } +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Controller.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Controller.java new file mode 100644 index 0000000..b6f55a6 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Controller.java @@ -0,0 +1,323 @@ +import imp.*; // Alles aus IMP Unterordner +import javafx.fxml.*; // FXML Definitionen +import javafx.scene.control.*; // Jedes Control-Element +import javafx.scene.layout.*; // Alle Layout-Definitionen +import javafx.event.*; // Button und Menu-Events +import javafx.stage.*; // Dateiöffnen / Speichern-Dialog +import java.io.File; // Dateihandling +import javafx.scene.control.Alert.AlertType; + +public class Controller { + + @FXML + private HBox hauptbereich; + + @FXML + private PictureViewer viewer; + + @FXML + private Slider slZoom; + + @FXML + private Label lDateiname; + + // Eigene Attribute + private FileChooser dateidialog; + private GeometrischeBildoperationen algo1; + private Punktoperationen algo2; + private Mehrpixeloperationen algo3; + + + public void initialize() { + dateidialog = new FileChooser(); + dateidialog.setInitialDirectory(new File("images")); + + algo1 = new GeometrischeBildoperationen(); + algo2 = new Punktoperationen(); + algo3 = new Mehrpixeloperationen(); + + slZoom.valueProperty().addListener((observable, oldValue, newValue) -> zoom()); + } + + void zoom() { + // Auslesen von Control-Elementen + double zoom = slZoom.getValue(); + + // Control-Elemente anpassen + viewer.setZoom(zoom); + } + + @FXML + void bZurueck(ActionEvent event) { + viewer.back(); + } + + @FXML + void mBeenden(ActionEvent event) { + // Frage nach Fenster und schließe dieses + Stage stage = (Stage) hauptbereich.getScene().getWindow(); + stage.close(); + } + + @FXML + void mBildOeffnen(ActionEvent event) { + File file = dateidialog.showOpenDialog(null); + if (file != null) { + Picture neuesBild = new Picture(file.getAbsolutePath()); + viewer.setImage(neuesBild, true); + lDateiname.setText(file.getAbsolutePath()); + } + } + + @FXML + void mBildSpeichern(ActionEvent event) { + File file = dateidialog.showSaveDialog(null); + if (file != null) { + Picture aktuellesBild = viewer.getImage(); + aktuellesBild.save(file.getAbsolutePath()); + lDateiname.setText(file.getAbsolutePath()); + } + } + + @FXML + void mDreheLinks(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo1.dreheLinks(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mDreheRechts(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo1.dreheRechts(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mFindeHorizontaleKanten(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.kantenfindenHorizontal(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mFindeKanten(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.kantenfinden(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mFindeVertikaleKanten(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.kantenfindenVertikal(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mGraustufenMaximum(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.graustufenMax(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mGraustufenMinimum(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.graustufenMin(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mGraustufenMittelwert(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.graustufenDurchschnitt(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mGraustufenNatuerlich(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.graustufenNatuerlich(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mNurBlaukanal(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.farbaenderung(aktuellesBild,0.0,0.0,1.0); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mNurGruenkanal(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.farbaenderung(aktuellesBild,0.0,1.0,0.0); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mNurRotkanal(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.farbaenderung(aktuellesBild,1.0,0.0,0.0); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mRelief(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.relief(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mSchaerfen(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.schaerfen(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + + } + + @FXML + void mSpiegleHorizontal(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo1.spiegelHorizontal(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mSpiegleVertikal(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo1.spiegelVertikal(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mTauschGruenBlau(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.tauschGruenBlau(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mTauschRotBlau(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.tauschRotBlau(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mTauschRotGruen(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo2.tauschRotGruen(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + } + + @FXML + void mUeber(ActionEvent event) { + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Über mein Programm ..."); + alert.setHeaderText(null); + alert.setContentText("Dieses Programm wurde erstellt von :\nThomas Schaller (ZPG IMP)\nVersion 1.0, Januar 2020"); + + alert.showAndWait(); + } + + @FXML + void mWeichzeichnen(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.weichzeichnen(aktuellesBild); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + + } + + @FXML + void mWeichzeichnen31x31(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.weichzeichnen(aktuellesBild,31); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + + } + + @FXML + void mWeichzeichnenGauss31x31(ActionEvent event) { + // Auslesen von Control-Elementen + Picture aktuellesBild = viewer.getImage(); + // Berechnung durchführen + Picture neuesBild = algo3.gaussfilter(aktuellesBild,31); + // Control-Elemente anpassen + viewer.setImage(neuesBild, true); // true = altes Bild speichern + + } + + @FXML + void mZurueck(ActionEvent event) { + viewer.back(); + } + + + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/GeometrischeBildoperationen.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/GeometrischeBildoperationen.java new file mode 100644 index 0000000..9aaaebc --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/GeometrischeBildoperationen.java @@ -0,0 +1,115 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; + +/** + * Algorithmen zur Änderung der Pixelpositionen eines Pictures + * z.B. drehen, spiegeln usw. + * + * @author Thomas Schaller + * @version 1.1 (28.11.2019) + */ +public class GeometrischeBildoperationen +{ + /** spiegeleHorizontal spiegelt das Bild, so dass rechts und links getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelHorizontal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(breite-1)-x][y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** spiegeleHorizontal spiegelt das Bild, so dass oben und unten getauscht werden + * @param originalbild Ein Bild (Picture), das gespiegelt werden soll + * @return Eine gespiegelte Kopie des Bildes + */ + + public Picture spiegelVertikal(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[x][(hoehe-1)-y]; + } + } + + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + /** dreheRechts dreht das Bild um 90° nach rechts + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + + public Picture dreheRechts(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[y][(breite-1)-x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /** dreheLinks dreht das Bild um 90° nach links + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture dreheLinks(Picture originalbild) { + int breite = originalbild.getHeight(); + int hoehe = originalbild.getWidth(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + pixelNeu[x][y] = pixel[(hoehe-1)-y][x]; + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + + } + + /** drehe180 dreht das Bild um 180° + * @param originalbild Ein Bild (Picture), das gedreht werden soll + * @return Eine gedrehte Kopie des Bildes + */ + public Picture drehe180(Picture originalbild) { + Picture bild90 = dreheLinks(originalbild); + Picture bild180 = dreheLinks(bild90); + return bild180; + } + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Mehrpixeloperationen.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Mehrpixeloperationen.java new file mode 100644 index 0000000..f18a7c5 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/Mehrpixeloperationen.java @@ -0,0 +1,358 @@ +import imp.*; +import java.awt.Color; +import java.util.Random; +/** + * Algorithmen, die auf der Veränderung der Farbinformationen eines Punktes und seines Umfeldes + * beruhen. Diese Operationen werden als Faltung bezeichnet. + * + * @author Thomas Schaller + * @version 1.0 (7.11.2019) + */ +public class Mehrpixeloperationen +{ + + Picture faltung(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = filter.length/2; x < originalbild.getWidth() - filter.length/2; x++){ + // Schleife über alle Zeilen + for (int y = filter.length/2; y < originalbild.getHeight() - filter.length/2; y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xx+i][yy+j].getRed(); + gruen += filter[i][j] * pixel[xx+i][yy+j].getGreen(); + blau += filter[i][j] * pixel[xx+i][yy+j].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Pixel außerhalb werden schwarz gesetzt + * + */ + Picture faltung_randbehandlung1(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth(); x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight(); y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // erst mal auf schwarz setzen + Color c = Color.BLACK; + // wenn innerhalb des Bildes, dann Pixelfarbe nutzen + if(xx+i >= 0 && xx+i =0 && yy+j < originalbild.getHeight()) { + c = pixel[xx+i][yy+j]; + } + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * c.getRed(); + gruen += filter[i][j] * c.getGreen(); + blau += filter[i][j] * c.getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Pixel außerhalb werden auf Randfarbe gesetzt + * + */ + Picture faltung_randbehandlung2(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth(); x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight(); y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Bestimme Pixelkoordinaten + int xxx = xx+i; + int yyy = yy+j; + + // Korrigiere Pixelkoordinaten, falls außerhalb + if(xxx<0) xxx=0; + if(xxx>= originalbild.getWidth()) xxx = originalbild.getWidth()-1; + if(yyy<0) yyy=0; + if(yyy>= originalbild.getHeight()) yyy = originalbild.getHeight()-1; + + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xxx][yyy].getRed(); + gruen += filter[i][j] * pixel[xxx][yyy].getGreen(); + blau += filter[i][j] * pixel[xxx][yyy].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + /* Faltung: Bild wird am Rand nach außen gespiegelt + * + */ + Picture faltung_randbehandlung3(Picture originalbild, double[][] filter) { + // Neue Pixel zunächst wie alte Pixel, damit der Rand kopiert wird. + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = originalbild.getPixelArray(); + + // Größe der Filtermatrix bestimmen + int laenge = filter.length; + int halb = laenge / 2; + + // Faltung berechnen + // Schleife über alle Spalten + for (int x = 0; x < originalbild.getWidth() ; x++){ + // Schleife über alle Zeilen + for (int y = 0; y < originalbild.getHeight() ; y++) + { + // Deklaration der neuen Farbkomponenten + double rot =0; + double gruen = 0; + double blau = 0; + + // Koordinaten des Pixels links oben in der Ecke der Filtermatrix + int xx = x - filter.length/2; + int yy = y - filter.length/2; + + // Schleifen über jeden Punkt der Filtermatrix + for (int i = 0; i < filter.length; i++) { + for (int j = 0; j < filter.length; j++){ + // Bestimme Pixelkoordinaten + int xxx = xx+i; + int yyy = yy+j; + + // Korrigiere Pixelkoordinaten, falls außerhalb + if(xxx<0) xxx=-xxx; + if(xxx>= originalbild.getWidth()) xxx = 2*originalbild.getWidth()-xxx-1; + if(yyy<0) yyy=-yyy; + if(yyy>= originalbild.getHeight()) yyy = 2*originalbild.getHeight()-yyy-1; + + // Summiere die gewichteten Farbkomponenten der Originalpixel + rot += filter[i][j] * pixel[xxx][yyy].getRed(); + gruen += filter[i][j] * pixel[xxx][yyy].getGreen(); + blau += filter[i][j] * pixel[xxx][yyy].getBlue(); + } + } + + //Begrenzung auf zulässigen Bereich + if(rot < 0.0) rot = 0.0; + if(rot > 255.0) rot = 255.0; + if(gruen < 0.0) gruen = 0.0; + if(gruen > 255.0) gruen = 255.0; + if(blau < 0.0) blau = 0.0; + if(blau > 255.0) blau = 255.0; + + // Definiere Farbe des neuen Pixels + pixelNeu[x][y] = new Color((int) rot, (int) gruen, (int) blau); + } + } + // Erzeuge neues Bild + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture weichzeichnen(Picture originalbild) { + double[][] mittelwertfilter ={{1.0/9,1.0/9,1.0/9}, + {1.0/9,1.0/9,1.0/9}, + {1.0/9,1.0/9,1.0/9}}; + return faltung(originalbild,mittelwertfilter); + } + + public Picture schaerfen(Picture originalbild) { + double[][] schaerfen ={{0,-1,0}, + {-1,5,-1}, + {0,-1,0}}; + return faltung(originalbild,schaerfen); + } + + public Picture relief(Picture originalbild) { + double[][] relieffilter ={{-2,-1,0}, + {-1,1,1}, + {0,1,2}}; + return faltung(originalbild,relieffilter); + } + + public Picture kantenfinden(Picture originalbild) { + double[][] kantenfilter ={{0,1,0}, + {1,-4,1}, + {0,1,0}}; + return faltung(originalbild,kantenfilter); + } + + public Picture kantenfindenHorizontal(Picture originalbild) { + double[][] sobelx ={{-1,0,1}, + {-2,0,2}, + {-1,0,1}}; + return faltung(originalbild,sobelx); + } + + public Picture kantenfindenVertikal(Picture originalbild) { + double[][] sobely={{-1,-2,-1}, + {0,0,0}, + {1,2,1}}; + return faltung(originalbild,sobely); + } + + // Ergänzungen: Größere Filter + + public Picture weichzeichnen(Picture originalbild, int groesse) { + // Deklariere die Matrix in der richtigen Größe. + double[][] mittelwertfilter = new double[groesse][groesse]; + // Berechne Anzahl der Zellen. + int anzahl = groesse * groesse; + + // Berechne für jede Zelle der Matrix ... + for(int i=0; i< groesse; i++) { + for(int j=0; j pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau > pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture graustufenMax(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = pixel[x][y].getRed(); + if (grau < pixel[x][y].getGreen()) grau = pixel[x][y].getGreen(); + if (grau < pixel[x][y].getBlue()) grau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture graustufenNatuerlich(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int grau = (int) (pixel[x][y].getRed()*299+pixel[x][y].getGreen()*587+pixel[x][y].getBlue()*114)/1000; + pixelNeu[x][y] = new Color(grau, grau, grau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + + public Picture invertieren(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = 255-pixel[x][y].getRed(); + int gruen = 255-pixel[x][y].getGreen(); + int blau = 255-pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotGruen(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getGreen(); + int gruen = pixel[x][y].getRed(); + int blau = pixel[x][y].getBlue(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschRotBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getBlue(); + int gruen = pixel[x][y].getGreen(); + int blau = pixel[x][y].getRed(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture tauschGruenBlau(Picture originalbild) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = pixel[x][y].getRed(); + int gruen = pixel[x][y].getBlue(); + int blau = pixel[x][y].getGreen(); + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + public Picture farbaenderung(Picture originalbild, double faktor_r, double faktor_g, double faktor_b) { + int breite = originalbild.getWidth(); + int hoehe = originalbild.getHeight(); + + Color[][] pixel = originalbild.getPixelArray(); + Color[][] pixelNeu = new Color[breite][hoehe]; + + for(int x=0; x < breite; x++) { + for(int y=0;y < hoehe; y++) { + int rot = (int) (pixel[x][y].getRed() * faktor_r); + int gruen = (int) (pixel[x][y].getGreen() * faktor_g); + int blau = (int) (pixel[x][y].getBlue() * faktor_b); + + //Begrenzung auf zulässigen Bereich + if(rot < 0) rot = 0; + if(rot > 255) rot = 255; + if(gruen < 0) gruen = 0; + if(gruen > 255) gruen = 255; + if(blau < 0) blau = 0; + if(blau > 255) blau = 255; + + pixelNeu[x][y] = new Color(rot, gruen, blau); + } + } + Picture neuesBild = new Picture(); + neuesBild.setPixelArray(pixelNeu); + return neuesBild; + } + + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/README.TXT b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/README.TXT new file mode 100644 index 0000000..4f97f4a --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/README.TXT @@ -0,0 +1,12 @@ +------------------------------------------------------------------------ +This is the project README file. Here, you should describe your project. +Tell the reader (someone who does not know anything about this project) +all he/she needs to know. The comments should usually include at least: +------------------------------------------------------------------------ + +PROJECT TITLE: +PURPOSE OF PROJECT: +VERSION or DATE: +HOW TO START THIS PROJECT: +AUTHORS: +USER INSTRUCTIONS: diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/allclasses.html b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/allclasses.html new file mode 100644 index 0000000..aca3d0d --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/allclasses.html @@ -0,0 +1,20 @@ + + + + + +All Classes + + + + + + +

All Classes

+
+ +
+ + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/constant-values.html b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/constant-values.html new file mode 100644 index 0000000..6e5b1ec --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/constant-values.html @@ -0,0 +1,73 @@ + + + + + +Constant Field Values + + + + + + + + +
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+ + +
+

imp.*

+
    +
  • + + + + + + + + + + + + + + + + + + + +
    imp.PictureViewer 
    Modifier and TypeConstant FieldValue
    + +public static final intFIT-1
    + +public static final intNORMAL1
    +
  • +
+
+
+
+ + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/element-list b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/element-list new file mode 100644 index 0000000..6711e1c --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/element-list @@ -0,0 +1 @@ +imp diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/PictureViewer.html b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/PictureViewer.html new file mode 100644 index 0000000..f076fe3 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/PictureViewer.html @@ -0,0 +1,527 @@ + + + + + +PictureViewer + + + + + + + + + +
+
+
Package imp
+

Class PictureViewer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • javafx.scene.Node
    • +
    • +
        +
      • javafx.scene.Parent
      • +
      • +
          +
        • javafx.scene.layout.Region
        • +
        • +
            +
          • javafx.scene.control.Control
          • +
          • +
              +
            • javafx.scene.control.ScrollPane
            • +
            • +
                +
              • imp.PictureViewer
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    javafx.css.Styleable, javafx.event.EventTarget, javafx.scene.control.Skinnable
    +
    +
    +
    public class PictureViewer
    +extends javafx.scene.control.ScrollPane
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javafx.scene.control.ScrollPane

        +javafx.scene.control.ScrollPane.ScrollBarPolicy
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFIT 
      static intNORMAL 
      +
        +
      • + + +

        Fields inherited from class javafx.scene.layout.Region

        +USE_COMPUTED_SIZE, USE_PREF_SIZE
      • +
      +
        +
      • + + +

        Fields inherited from class javafx.scene.Node

        +BASELINE_OFFSET_SAME_AS_HEIGHT
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      PictureViewer() +
      Erzeugt ein ScrollPanel mit integriertem Bild der Größe 1000x1000
      +
      PictureViewer​(int width, + int height) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(int width, + int height, + java.lang.String background) +
      Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
      +
      PictureViewer​(imp.Picture picture) +
      Erzeugt ein ScrollPanel und zeigt das Bild-Objekt an
      +
      PictureViewer​(java.lang.String filename) +
      Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidback() +
      Ruft das letzte abgespeicherte Bild aus der History wieder auf.
      +
      imp.PicturegetImage() +
      Liefert das angezeigte Bild
      +
      voidpushImage() +
      Speichert das übergebene Bild in der History.
      +
      voidrepaint() +
      Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
      +
      voidsetImage​(imp.Picture picture, + boolean saveOldImage) +
      Setzt das anzuzeigende Bild neu
      +
      voidsetZoom​(double factor) +
      Setzt den Zoom-Faktor für das Bild.
      +
      +
        +
      • + + +

        Methods inherited from class javafx.scene.control.ScrollPane

        +contentProperty, createDefaultSkin, fitToHeightProperty, fitToWidthProperty, getClassCssMetaData, getContent, getControlCssMetaData, getHbarPolicy, getHmax, getHmin, getHvalue, getInitialFocusTraversable, getMinViewportHeight, getMinViewportWidth, getPrefViewportHeight, getPrefViewportWidth, getVbarPolicy, getViewportBounds, getVmax, getVmin, getVvalue, hbarPolicyProperty, hmaxProperty, hminProperty, hvalueProperty, isFitToHeight, isFitToWidth, isPannable, minViewportHeightProperty, minViewportWidthProperty, pannableProperty, prefViewportHeightProperty, prefViewportWidthProperty, queryAccessibleAttribute, setContent, setFitToHeight, setFitToWidth, setHbarPolicy, setHmax, setHmin, setHvalue, setMinViewportHeight, setMinViewportWidth, setPannable, setPrefViewportHeight, setPrefViewportWidth, setVbarPolicy, setViewportBounds, setVmax, setVmin, setVvalue, vbarPolicyProperty, viewportBoundsProperty, vmaxProperty, vminProperty, vvalueProperty
      • +
      +
        +
      • + + +

        Methods inherited from class javafx.scene.control.Control

        +computeMaxHeight, computeMaxWidth, computeMinHeight, computeMinWidth, computePrefHeight, computePrefWidth, contextMenuProperty, executeAccessibleAction, getBaselineOffset, getContextMenu, getCssMetaData, getSkin, getTooltip, isResizable, layoutChildren, setContextMenu, setSkin, setTooltip, skinProperty, tooltipProperty
      • +
      +
        +
      • + + +

        Methods inherited from class javafx.scene.layout.Region

        +backgroundProperty, borderProperty, cacheShapeProperty, centerShapeProperty, getBackground, getBorder, getHeight, getInsets, getMaxHeight, getMaxWidth, getMinHeight, getMinWidth, getOpaqueInsets, getPadding, getPrefHeight, getPrefWidth, getShape, getUserAgentStylesheet, getWidth, heightProperty, insetsProperty, isCacheShape, isCenterShape, isScaleShape, isSnapToPixel, layoutInArea, layoutInArea, layoutInArea, layoutInArea, maxHeight, maxHeightProperty, maxWidth, maxWidthProperty, minHeight, minHeightProperty, minWidth, minWidthProperty, opaqueInsetsProperty, paddingProperty, positionInArea, positionInArea, prefHeight, prefHeightProperty, prefWidth, prefWidthProperty, resize, scaleShapeProperty, setBackground, setBorder, setCacheShape, setCenterShape, setHeight, setMaxHeight, setMaxSize, setMaxWidth, setMinHeight, setMinSize, setMinWidth, setOpaqueInsets, setPadding, setPrefHeight, setPrefSize, setPrefWidth, setScaleShape, setShape, setSnapToPixel, setWidth, shapeProperty, snappedBottomInset, snappedLeftInset, snappedRightInset, snappedTopInset, snapPositionX, snapPositionY, snapSizeX, snapSizeY, snapSpaceX, snapSpaceY, snapToPixelProperty, widthProperty
      • +
      +
        +
      • + + +

        Methods inherited from class javafx.scene.Parent

        +getChildren, getChildrenUnmodifiable, getManagedChildren, getStylesheets, isNeedsLayout, layout, lookup, needsLayoutProperty, requestLayout, requestParentLayout, setNeedsLayout, updateBounds
      • +
      +
        +
      • + + +

        Methods inherited from class javafx.scene.Node

        +accessibleHelpProperty, accessibleRoleDescriptionProperty, accessibleRoleProperty, accessibleTextProperty, addEventFilter, addEventHandler, applyCss, autosize, blendModeProperty, boundsInLocalProperty, boundsInParentProperty, buildEventDispatchChain, cacheHintProperty, cacheProperty, clipProperty, computeAreaInScreen, contains, contains, cursorProperty, depthTestProperty, disabledProperty, disableProperty, effectiveNodeOrientationProperty, effectProperty, eventDispatcherProperty, fireEvent, focusedProperty, focusTraversableProperty, getAccessibleHelp, getAccessibleRole, getAccessibleRoleDescription, getAccessibleText, getBlendMode, getBoundsInLocal, getBoundsInParent, getCacheHint, getClip, getContentBias, getCursor, getDepthTest, getEffect, getEffectiveNodeOrientation, getEventDispatcher, getId, getInitialCursor, getInputMethodRequests, getLayoutBounds, getLayoutX, getLayoutY, getLocalToParentTransform, getLocalToSceneTransform, getNodeOrientation, getOnContextMenuRequested, getOnDragDetected, getOnDragDone, getOnDragDropped, getOnDragEntered, getOnDragExited, getOnDragOver, getOnInputMethodTextChanged, getOnKeyPressed, getOnKeyReleased, getOnKeyTyped, getOnMouseClicked, getOnMouseDragEntered, getOnMouseDragExited, getOnMouseDragged, getOnMouseDragOver, getOnMouseDragReleased, getOnMouseEntered, getOnMouseExited, getOnMouseMoved, getOnMousePressed, getOnMouseReleased, getOnRotate, getOnRotationFinished, getOnRotationStarted, getOnScroll, getOnScrollFinished, getOnScrollStarted, getOnSwipeDown, getOnSwipeLeft, getOnSwipeRight, getOnSwipeUp, getOnTouchMoved, getOnTouchPressed, getOnTouchReleased, getOnTouchStationary, getOnZoom, getOnZoomFinished, getOnZoomStarted, getOpacity, getParent, getProperties, getPseudoClassStates, getRotate, getRotationAxis, getScaleX, getScaleY, getScaleZ, getScene, getStyle, getStyleableParent, getStyleClass, getTransforms, getTranslateX, getTranslateY, getTranslateZ, getTypeSelector, getUserData, getViewOrder, hasProperties, hoverProperty, idProperty, inputMethodRequestsProperty, intersects, intersects, isCache, isDisable, isDisabled, isFocused, isFocusTraversable, isHover, isManaged, isMouseTransparent, isPickOnBounds, isPressed, isVisible, layoutBoundsProperty, layoutXProperty, layoutYProperty, localToParent, localToParent, localToParent, localToParent, localToParent, localToParentTransformProperty, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToSceneTransformProperty, localToScreen, localToScreen, localToScreen, localToScreen, localToScreen, lookupAll, managedProperty, mouseTransparentProperty, nodeOrientationProperty, notifyAccessibleAttributeChanged, onContextMenuRequestedProperty, onDragDetectedProperty, onDragDoneProperty, onDragDroppedProperty, onDragEnteredProperty, onDragExitedProperty, onDragOverProperty, onInputMethodTextChangedProperty, onKeyPressedProperty, onKeyReleasedProperty, onKeyTypedProperty, onMouseClickedProperty, onMouseDragEnteredProperty, onMouseDragExitedProperty, onMouseDraggedProperty, onMouseDragOverProperty, onMouseDragReleasedProperty, onMouseEnteredProperty, onMouseExitedProperty, onMouseMovedProperty, onMousePressedProperty, onMouseReleasedProperty, onRotateProperty, onRotationFinishedProperty, onRotationStartedProperty, onScrollFinishedProperty, onScrollProperty, onScrollStartedProperty, onSwipeDownProperty, onSwipeLeftProperty, onSwipeRightProperty, onSwipeUpProperty, onTouchMovedProperty, onTouchPressedProperty, onTouchReleasedProperty, onTouchStationaryProperty, onZoomFinishedProperty, onZoomProperty, onZoomStartedProperty, opacityProperty, parentProperty, parentToLocal, parentToLocal, parentToLocal, parentToLocal, parentToLocal, pickOnBoundsProperty, pressedProperty, pseudoClassStateChanged, relocate, removeEventFilter, removeEventHandler, requestFocus, resizeRelocate, rotateProperty, rotationAxisProperty, scaleXProperty, scaleYProperty, scaleZProperty, sceneProperty, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, screenToLocal, screenToLocal, screenToLocal, setAccessibleHelp, setAccessibleRole, setAccessibleRoleDescription, setAccessibleText, setBlendMode, setCache, setCacheHint, setClip, setCursor, setDepthTest, setDisable, setDisabled, setEffect, setEventDispatcher, setEventHandler, setFocused, setFocusTraversable, setHover, setId, setInputMethodRequests, setLayoutX, setLayoutY, setManaged, setMouseTransparent, setNodeOrientation, setOnContextMenuRequested, setOnDragDetected, setOnDragDone, setOnDragDropped, setOnDragEntered, setOnDragExited, setOnDragOver, setOnInputMethodTextChanged, setOnKeyPressed, setOnKeyReleased, setOnKeyTyped, setOnMouseClicked, setOnMouseDragEntered, setOnMouseDragExited, setOnMouseDragged, setOnMouseDragOver, setOnMouseDragReleased, setOnMouseEntered, setOnMouseExited, setOnMouseMoved, setOnMousePressed, setOnMouseReleased, setOnRotate, setOnRotationFinished, setOnRotationStarted, setOnScroll, setOnScrollFinished, setOnScrollStarted, setOnSwipeDown, setOnSwipeLeft, setOnSwipeRight, setOnSwipeUp, setOnTouchMoved, setOnTouchPressed, setOnTouchReleased, setOnTouchStationary, setOnZoom, setOnZoomFinished, setOnZoomStarted, setOpacity, setPickOnBounds, setPressed, setRotate, setRotationAxis, setScaleX, setScaleY, setScaleZ, setStyle, setTranslateX, setTranslateY, setTranslateZ, setUserData, setViewOrder, setVisible, snapshot, snapshot, startDragAndDrop, startFullDrag, styleProperty, toBack, toFront, toString, translateXProperty, translateYProperty, translateZProperty, usesMirroring, viewOrderProperty, visibleProperty
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface javafx.css.Styleable

        +getStyleableNode
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    + +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer()
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der Größe 1000x1000
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(int width,
        +                     int height,
        +                     java.lang.String background)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe
        +
        +
        Parameters:
        +
        width - Breite des Bildes
        +
        height - Höhe des Bildes
        +
        background - Farbe des Hintergrunds als HEX-String (z.B. "FF3A45")
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(java.lang.String filename)
        +
        Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei
        +
        +
        Parameters:
        +
        filename - Name des Bildes
        +
        +
      • +
      + + + +
        +
      • +

        PictureViewer

        +
        public PictureViewer​(imp.Picture picture)
        +
        Erzeugt ein ScrollPanel und zeigt das Bild-Objekt an
        +
        +
        Parameters:
        +
        picture - anzuzeigendes Bild
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        setImage

        +
        public void setImage​(imp.Picture picture,
        +                     boolean saveOldImage)
        +
        Setzt das anzuzeigende Bild neu
        +
        +
        Parameters:
        +
        picture - anzuzeigendes Bild
        +
        saveOldImage - soll das aktuelle Bild in der Historie gespeichert werden
        +
        +
      • +
      + + + +
        +
      • +

        getImage

        +
        public imp.Picture getImage()
        +
        Liefert das angezeigte Bild
        +
        +
        Returns:
        +
        angezeigtes Bild
        +
        +
      • +
      + + + +
        +
      • +

        pushImage

        +
        public void pushImage()
        +
        Speichert das übergebene Bild in der History.
        +
        +
        Parameters:
        +
        b - zu speicherndes Bild
        +
        +
      • +
      + + + +
        +
      • +

        back

        +
        public void back()
        +
        Ruft das letzte abgespeicherte Bild aus der History wieder auf.
        +
      • +
      + + + +
        +
      • +

        repaint

        +
        public void repaint()
        +
        Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor.
        +
      • +
      + + + +
        +
      • +

        setZoom

        +
        public void setZoom​(double factor)
        +
        Setzt den Zoom-Faktor für das Bild. + Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich.
        +
        +
        Parameters:
        +
        factor - Zoomfaktor (1.0 = 100%).
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/package-summary.html b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/package-summary.html new file mode 100644 index 0000000..ebfd12f --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/imp/package-summary.html @@ -0,0 +1,51 @@ + + + + + +imp + + + + + + + + +
+
+

Package imp

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    PictureViewer 
    +
  • +
+
+
+ + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/index.html b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/index.html new file mode 100644 index 0000000..bb14fc5 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/index.html @@ -0,0 +1,23 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + +
+ +

imp/package-summary.html

+
+ + diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/logfile.txt b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/logfile.txt new file mode 100644 index 0000000..d0b2c8b --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/logfile.txt @@ -0,0 +1,38 @@ +Class documentation +<---- javadoc command: ----> +E:\Programme\Informatik\BlueJ4.2\BlueJ\jdk\bin\javadoc.exe +-author +-version +-nodeprecated +-package +-Xdoclint:none +-noindex +-notree +-nohelp +-nonavbar +-source +11 +-classpath +E:\Programme\Informatik\BlueJ4.2\bluej\lib\bluejcore.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\junit-4.11.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\hamcrest-core-1.3.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\lang-stride.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.base.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.controls.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.fxml.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.graphics.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.media.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.properties.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.swing.jar;E:\Programme\Informatik\BlueJ4.2\bluej\lib\javafx\lib\javafx.web.jar;M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\+libs\jdom-1.1.3.jar;M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI +-d +M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc +-encoding +UTF-8 +-charset +UTF-8 +M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\imp\PictureViewer.java +<---- end of javadoc command ----> +Loading source file M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\imp\PictureViewer.java... +Constructing Javadoc information... +Standard Doclet version 11.0.2 +Building tree for all the packages and classes... +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\imp\PictureViewer.html... +M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\imp\PictureViewer.java:136: warning - @param argument "b" is not a parameter name. +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\imp\package-summary.html... +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\constant-values.html... +Building index for all the packages and classes... +Building index for all classes... +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\allclasses.html... +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\allclasses.html... +Generating M:\Fortbildung ZPG IMP10\Test\02_BildbearbeitungGUI\doc\index.html... +1 warning diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/script.js b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/script.js new file mode 100644 index 0000000..d33d3ab --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/script.js @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'jquery/jszip/dist/jszip.js'); + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils.js'); + if (window.navigator.userAgent.indexOf('MSIE ') > 0 || window.navigator.userAgent.indexOf('Trident/') > 0 || + window.navigator.userAgent.indexOf('Edge/') > 0) { + createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); + } + createElem(doc, tag, 'search.js'); + + $.get(pathtoroot + "module-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "package-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "type-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "member-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + }); + }); + $.get(pathtoroot + "tag-search-index.zip") + .done(function() { + JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { + var zip = new JSZip(data); + zip.load(data); + tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + }); + }); + if (!moduleSearchIndex) { + createElem(doc, tag, 'module-search-index.js'); + } + if (!packageSearchIndex) { + createElem(doc, tag, 'package-search-index.js'); + } + if (!typeSearchIndex) { + createElem(doc, tag, 'type-search-index.js'); + } + if (!memberSearchIndex) { + createElem(doc, tag, 'member-search-index.js'); + } + if (!tagSearchIndex) { + createElem(doc, tag, 'tag-search-index.js'); + } + $(window).resize(function() { + $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + }); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} + +function updateModuleFrame(pFrame, cFrame) { + top.packageFrame.location = pFrame; + top.classFrame.location = cFrame; +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/stylesheet.css b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/stylesheet.css new file mode 100644 index 0000000..c027275 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/doc/stylesheet.css @@ -0,0 +1,906 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +a[name]:before, a[name]:target, a[id]:before, a[id]:target { + content:""; + display:inline-block; + position:relative; + padding-top:129px; + margin-top:-129px; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} + +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.navPadding { + padding-top: 107px; +} +.fixedNav { + position:fixed; + width:100%; + z-index:999; + background-color:#ffffff; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch { + float:right; + margin:0 0 0 0; + padding:0; +} +ul.navListSearch li { + list-style:none; + float:right; + padding: 5px 6px; + text-transform:uppercase; +} +ul.navListSearch li label { + position:relative; + right:-16px; +} +ul.subNavList li { + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Styles for page header and footer. + */ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexNav { + position:relative; + font-size:12px; + background-color:#dee3e9; +} +.indexNav ul { + margin-top:0; + padding:5px; +} +.indexNav ul li { + display:inline; + list-style-type:none; + padding-right:10px; + text-transform:uppercase; +} +.indexNav h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* + * Styles for page layout containers. + */ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer, +.allClassesContainer, .allPackagesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary, +.requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption, +.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.constantsSummary caption a:link, .deprecatedSummary caption a:link, +.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link, +.usesSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover, +.usesSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.constantsSummary caption a:active, .deprecatedSummary caption a:active, +.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active, +.usesSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.constantsSummary caption a:visited, .deprecatedSummary caption a:visited, +.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited, +.usesSummary caption a:visited { + color:#FFFFFF; +} +.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active, +.useSummary caption a:visited { + color:#1f389c; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span, +.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span, +.usesSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span, +.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span, +.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab, +.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab, +.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab, +.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd, +.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd, +.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd, +.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; +} +.rowColor th, .altColor th { + font-weight:normal; +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td, +.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th, +.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td, +.constantsSummary td { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th, +.packagesSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + font-size:13px; +} +td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast { + font-size:13px; +} +.constantsSummary th, .packagesSummary th { + font-size:13px; +} +.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, +.providesSummary td.colLast { + white-space:normal; + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.requiresSummary td.colFirst, .requiresSummary th.colFirst, +.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, +.usesSummary td.colFirst, .usesSummary th.colFirst, +.providesSummary td.colFirst, .providesSummary th.colFirst, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName, +.typeSummary td.colFirst, .typeSummary th.colFirst { + vertical-align:top; +} +.packagesSummary th.colLast, .packagesSummary td.colLast { + white-space:normal; +} +td.colFirst a:link, td.colFirst a:visited, +td.colSecond a:link, td.colSecond a:visited, +th.colFirst a:link, th.colFirst a:visited, +th.colSecond a:link, th.colSecond a:visited, +th.colConstructorName a:link, th.colConstructorName a:visited, +th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited, +.constantValuesContainer td a:link, .constantValuesContainer td a:visited, +.allClassesContainer td a:link, .allClassesContainer td a:visited, +.allPackagesContainer td a:link, .allPackagesContainer td a:visited { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor, .altColor th { + background-color:#FFFFFF; +} +.rowColor, .rowColor th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.colLast div { + padding-top:0px; +} +td.colLast a { + padding-bottom:3px; +} +/* + * Styles for formatting effect. + */ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink, +.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType, +.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel, +.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} +.deprecationBlock { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} +div.contentContainer ul.blockList li.blockList h2 { + padding-bottom:0px; +} +/* + * Styles for IFRAME. + */ +.mainContainer { + margin:0 auto; + padding:0; + height:100%; + width:100%; + position:fixed; + top:0; + left:0; +} +.leftContainer { + height:100%; + position:fixed; + width:320px; +} +.leftTop { + position:relative; + float:left; + width:315px; + top:0; + left:0; + height:30%; + border-right:6px solid #ccc; + border-bottom:6px solid #ccc; +} +.leftBottom { + position:relative; + float:left; + width:315px; + bottom:0; + left:0; + height:70%; + border-right:6px solid #ccc; + border-top:1px solid #000; +} +.rightContainer { + position:absolute; + left:320px; + top:0; + bottom:0; + height:100%; + right:0; + border-left:1px solid #000; +} +.rightIframe { + margin:0; + padding:0; + height:100%; + right:30px; + width:100%; + overflow:visible; + margin-bottom:30px; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.resultItem { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.resultHighlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:17px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.searchTagDescResult { + font-style:italic; + font-size:11px; +} +.searchTagHolderResult { + font-style:italic; + font-size:12px; +} +.searchTagResult:before, .searchTagResult:target { + color:red; +} +.moduleGraph span { + display:none; + position:absolute; +} +.moduleGraph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.methodSignature { + white-space:normal; +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/HSB.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/HSB.java new file mode 100644 index 0000000..5337124 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/HSB.java @@ -0,0 +1,55 @@ +package imp; + +import java.awt.Color; + +/** + * Hilfsklasse für das HSB-Farbmodell + * + * @author Thomas Schaller + * @version V1.0 14.01.2020 + */ + +public class HSB +{ + /** + * Liefert den Farbton als Winkel zwischen 0.0° und 360.0°. + * @param Color c Farbe, deren Farbton bestimmt werden soll. + * @return Farbton + */ + public static double getHue(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[0]; + } + + /** + * Liefert die Sättigung als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Sättigung bestimmt werden soll. + * @return Sättigung + */ + public static double getSaturation(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[1]; + } + + /** + * Liefert die Helligkeit als Wert zwischen 0.0 (0%) und 1.0 (100%). + * @param Color c Farbe, deren Helligkeit bestimmt werden soll. + * @return Sättigung + */ + public static double getBrightness(Color c) { + float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + return hsb[2]; + } + + /** + * Liefert ein Java-Color-Objekt mit den angegebenen HSB-Werten. + * @param h Farbton (Hue) + * @param s Sättigung (Saturation) + * @param b Brightness (Helligkeit) + * @return Java-Color-Objekt + */ + public static Color getColor(double h, double s, double b) { + return new Color(Color.HSBtoRGB((float) h, (float) s, (float) b)); + } + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/NumberField.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/NumberField.java new file mode 100644 index 0000000..f69dd38 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/NumberField.java @@ -0,0 +1,43 @@ +package imp; + +import javafx.scene.control.TextField; + +public class NumberField extends TextField { + + @Override public void replaceText(int start, int end, String text) { + if (text.matches("[0-9.]") || text == "") { + super.replaceText(start, end, text); + } + } + + @Override public void replaceSelection(String text) { + if (text.matches("[0-9.]") || text == "") { + super.replaceSelection(text); + } + } + + public double getDoubleValue() { + try{ + return Double.parseDouble(this.getText()); + } catch(Exception e) { + return 0.0; + } + } + + public int getIntValue() { + try{ + return Integer.parseInt(this.getText()); + } catch(Exception e) { + return 0; + } + } + + public void setValue(double v) { + setText(""+v); + } + + public void setValue(int v) { + setText(""+v); + } + +} \ No newline at end of file diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Picture.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Picture.java new file mode 100644 index 0000000..3148dee --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Picture.java @@ -0,0 +1,744 @@ +package imp; + +import java.awt.image.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.BasicStroke; +import java.util.Vector; +import javax.imageio.*; +import java.io.*; +import java.awt.*; +import javax.swing.*; +import java.util.Random; +import java.awt.geom.AffineTransform; + +/** + * + * Bildklasse fuer die Simulation von Processing-Befehlen + * + * Diese Klasse stellt ein BufferedImage bereit, in das mit Processing-Befehlen gezeichnet + * werden kann. + * Zusaetzlich kann ein Bildanzeiger ueber jede Aenderung des Bildes informiert werden, + * um "Zurueck"-Befehle zu ermoeglichen. 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 uebersetzt. + * + * @version 1.2 from 06.12.2019 + * @author Thomas Schaller (ZPG Informatik Klasse 9) + */ + +public class Picture{ + + // Einstellungmoeglichkeiten fuer das Zeichnen von Rechtecken und Ellipsen + // RADIUS = Mittelpunkt+Radius wird gegeben, CENTER = Mittelpunkt und Breite/Hoehe wird gegeben, + // CORNER = Linke obere Ecke + Breite/Hoehe, CORNERS = Linke obere und rechte untere Ecke + public static final int RADIUS = 1; + public static final int CENTER = 2; + public static final int CORNER = 3; + public static final int CORNERS = 4; + + // gespeichertes Bild, + private BufferedImage image; + private Graphics2D g; + private boolean antialiasing; + + // aktuelle Farbeinstellungen + private Color background; + private Color pencolor; + private Color fillcolor; + + // aktuelle Stiftdicke + private double stroke; + + // aktueller Koordinatenmodus von Rechtecken und Ellipsen + private int ellipseMode = CENTER; + private int rectMode = CORNER; + + // aktueller Font + private Font textfont = null; + + // muss ein Bildanzeiger benachrichtigt werden + private PictureViewer observer = null; + private boolean autorefresh = true; + + /** + * Erzeugt ein Bild mit Standardgroesse 500x400 + */ + public Picture() { + this(500,400); + } + + /** + * Erzeugt ein Bild der angegeben Groesse + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public Picture(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein Bild aus einer Datei + * @param filename Dateiname des Bildes + */ + public Picture(String filename) { + this.antialiasing = true; + load(filename); + + } + + /** + * Erzeugt ein Bild der angegebenen Groesse mit festgelegtem Hintergrund + * @param width Breite des Bildes + * @param height Hoehe des Bildes + * @param background Farbe des Hintergrunds + */ + public Picture(int width, int height, String background) { + this.antialiasing = true; + this.background = decode(background); + this.pencolor = new Color(0,0,0); + this.stroke = 1; + this.fillcolor = null; + makeImage(width, height); + + } + + public void showInFrame() { + PictureViewer v = new PictureViewer(this); + } + + private void makeImage(int width, int height){ + this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + g = (Graphics2D) this.image.getGraphics(); + g.setColor(this.background); + g.fillRect(0,0,width-1, height-1); + } + + protected void antialise() { + // Antialiasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // Rendering + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // Text + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + // Color + g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + + // Sonstiges + // g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + // g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + // g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + // g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public void setAntialising(boolean neuerWert) { + this.antialiasing = neuerWert; + } + + public boolean isAntialiasing() { + return antialiasing; + } + + /** + * Legt fest, wer das Bild anzeigt. + * Diese ermoeglicht die Benachrichtung des Observers, wenn sich das Bild aendert. + * @param observer Anzeiger des Bildes + */ + public void setObserver(PictureViewer observer) { + this.observer= observer; + } + + public PictureViewer getObserver() { + return observer; + } + + /** + * Direktes Setzen des Bildes (fuer interne Zwecke) + * @param b Bild, das gespeichert werden soll. + */ + public void setImage(BufferedImage b) { + image = b; + } + + /** + * Direktes Abfragen des Bildes (fuer interne Zwecke) + * @return Bild, das gerade gespeichert ist. + */ + public BufferedImage getImage() { + return image; + } + + /** + * Definiert die Dimension der Breite und Hoehe des Anzeigefensters in Pixeleinheiten. + * Die eingebauten Variablen Breite und Hoehe werden durch die an diese Funktion uebergebenen Parameter festgelegt. So weist beispielsweise + * der Befehl size(640, 480) der Variablen Breite 640 und der Variablen Hoehe 480 zu. + * @param width Breite des Bildes + * @param height Hoehe des Bildes + */ + public void size(int width, int height){ + pushImage(); + makeImage(width, height); + + g.setColor(background); + g.fillRect(0,0,width-1, height-1); + + repaint(); + } + + /** + * Liefert die Breite des Bildes zurueck. + * @return Breite des Bildes + */ + public int getWidth() { + return image.getWidth(); + } + + /** + * Liefert die Hoehe des Bildes zurueck. + * @return Hoehe des Bildes + */ + public int getHeight() { + return image.getHeight(); + } + + /** + * Erzeugt eine Kopie des Bildes und uebergibt sie an den Observer (falls existent), damit dieser die Versionen speichern kann + */ + private void pushImage() { + if(observer != null) { + observer.pushImage(); + } + } + + + /** + * Legt fest, ob nach jedem Zeichenbefehl automatisch das Bild auch in + * der Oberflaeche aktualisiert wird. Die Einstellung "false" beschleunigt + * das Zeichnen aufwaendiger Bilder und verhindert "Flackern". + * Das Neuzeichnen kann durch die Methode "refresh" gezielt ausgeloest werden. + * @param autorefresh true = nach jedem Zeichenbefehl die Anzeige aktualisieren, false= nur durch die Methode refresh neu zeichnen + */ + public void setAutoRefresh(boolean autoRefresh) { + this.autorefresh = autoRefresh; + } + + /** + * Auch die anzeigenden Klasse wird zum Neuzeichnen aufgefordert. + */ + private void repaint() { + if(observer != null && autorefresh) { + observer.repaint(); + } + } + + /** + * Ein repaint() (das Neuzeichnen) kann manuell erzwungen werden. + */ + public void forceRepaint() { + if(observer != null) { + observer.repaint(); + } + } + + // ----------------------------------------- Zeichenfunktionen ----------------------------------------------- + /** + * Loescht den Inhalt des Bildes. + * Der Hintergrund wird mit der Hintergrundfarbe neu gefuellt. + */ + + public void clear(){ + pushImage(); + makeImage(image.getWidth(), image.getHeight()); + + g.setColor(background); + g.fillRect(0,0,image.getWidth()-1, image.getHeight()-1); + repaint(); + } + + /** + * Konvertiert die in einem bestimmten Modus gegebenen Koordinaten in die Java-uebliche Links_Oben_Breite_Hoehe Version + * Die Aenderungen werden direkt im Array vorgenommen + * @param coord Array mit vier Koordinateneintraegen im gegebenen Modus + * @param mode Modus der Koordinaten (CORNER, CORNERS, RADIUS oder CENTER) + */ + private void convert(int[] coord, int mode) { + switch(mode) { + case CORNER: break; + case CORNERS: coord[2] -= coord[0]; coord[3] -= coord[1]; break; + case RADIUS: coord[2] *= 2; coord[3] *=2; + case CENTER: coord[0] -= coord[2]/2; coord[1] -= coord[3]/2; + } + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Rechtecken. + * Aendert die Position, von der aus Rechtecke gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an rect() uebergeben werden, interpretiert werden. + * Der Standardmodus ist rectMode(Bild.CORNER), der die ersten beiden Parameter von rect() als die linke obere Ecke der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 gegenueberliegenden Ecke. + * rectMode(Bild.CENTER) interpretiert die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe sind. + * rectMode(RADIUS) verwendet auch die ersten beiden Parameter von rect() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void rectMode(int mode) { + rectMode = mode; + } + + /** + * Aendert den Koordinaten-Modus beim Zeichnen von Kreisen/Ellipsen. + * Aendert die Position, von der aus Kreise/Ellipsen gezeichnet werden, indem es die Art und Weise aendert, wie Parameter, die an ellipse() uebergeben werden, interpretiert werden. + * Der Standardmodus ist ellipseMode(Bild.CENTER), der die ersten beiden Parameter von ellipse() als Mittelpunkt der Form interpretiert, + * waehrend der dritte und vierte Parameter seine Breite und Hoehe 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 Hoehe 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 gegenueberliegenden Ecke. + * ellipseMode(RADIUS) verwendet auch die ersten beiden Parameter von ellipse() als Mittelpunkt der Form, + * verwendet aber den dritten und vierten Parameter, um die Haelfte der Breite und Hoehe der Formen festzulegen. + * @param mode Modus der Koordinateninterpretation (CORNER, CORNERS, CENTER oder RADIUS) + */ + public void ellipseMode(int mode) { + ellipseMode = mode; + } + + /** + * Zeichnet eine Linie (einen direkten Weg zwischen zwei Punkten) auf den Bildschirm. + * Um eine Linie einzufaerben, verwenden Sie die {@link #stroke(int, int, int) stroke()} Funktion. Eine Zeile kann nicht gefuellt werden, daher hat die Funktion fill() keinen + * Einfluss auf die Farbe einer Zeile. Linien werden standardmaessig mit einer Breite von einem Pixel gezeichnet, dies kann jedoch mit der Funktion + * {@link #strokeWeight(double) strokeWeight()} geaendert werden. + * @param x1 x-Koordinate des 1. Punktes + * @param y1 y-Koordinate des 1. Punktes + * @param x2 x-Koordinate des 2. Punktes + * @param y2 y-Koordinate des 2. Punktes + */ + public void line(int x1, int y1, int x2, int y2) { + pushImage(); + + if (stroke > 0) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawLine(x1, y1, x2, y2); + } + repaint(); + } + + /** + * Zeichnet ein Rechteck auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position der linken oberen Ecke fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #rectMode(int) rectMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param b meist die y-Koordinate der linken oberen Ecke (kann durch rectMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch rectMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch rectMode() geaendert werden). + * + */ + public void rect(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, rectMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillRect(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + g.drawRect(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * Zeichnet eine Ellipse/Kreis auf das Bild. + * Standardmaessig legen die ersten beiden Parameter die Position des Mittelpunkts fest, der dritte die Breite und der vierte die Hoehe. + * Die Art und Weise, wie diese Parameter interpretiert werden, kann jedoch mit der Funktion {@link #ellipseMode(int) ellipseMode()} geaendert werden. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param a meist die x-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param b meist die y-Koordinate des Mittelpunkts (kann durch ellipseMode() geaendert werden). + * @param c meist die Breite des Rechtecks (kann durch ellipseMode() geaendert werden). + * @param d meist die Hoehe des Rechtecks (kann durch ellipseMode() geaendert werden). + * + */ + public void ellipse(int a, int b, int c, int d) { + pushImage(); + + int[] coord = {a,b,c,d}; + convert(coord, ellipseMode); + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillOval(coord[0], coord[1], coord[2], coord[3]); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawOval(coord[0], coord[1], coord[2], coord[3]); + } + repaint(); + } + + /** + * 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + */ + public void triangle(int x1, int y1, int x2, int y2, int x3, int y3) { + int px[] = {x1, x2, x3}; + int py[] = {y1, y2, y3}; + polygon(px, py); + } + + /** + * Zeichnet ein Viereck auf das Bild. + * Ein Viereck ist ein vierseitiges Polygon. Es ist aehnlich wie ein Rechteck, aber die Winkel zwischen seinen Kanten + * sind nicht auf neunzig Grad beschraenkt. 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 {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x1 meist die x-Koordinate des 1. Punkts. + * @param y1 meist die y-Koordinate des 1. Punkts. + * @param x2 meist die x-Koordinate des 2. Punkts. + * @param y2 meist die y-Koordinate des 2. Punkts. + * @param x3 meist die x-Koordinate des 3. Punkts. + * @param y3 meist die y-Koordinate des 3. Punkts. + * @param x4 meist die x-Koordinate des 3. Punkts. + * @param y4 meist die y-Koordinate des 3. Punkts. + */ + public void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + int px[] = {x1, x2, x3, x4}; + int py[] = {y1, y2, y3, y4}; + polygon(px, py); + } + + /** + * Zeichnet ein Polygon auf das Bild. + * Gleich lange Listen von x und y-Koordinaten bestimmen die Eckpunkte des Polygons. + * Durch den Befehl {@link #fill(int,int,int) fill()} /{@link #noFill() noFill()} kann die Fuellfarbe des Rechtecks gewaehlt werden, durch {@link #stroke(int, int, int) stroke()}/{@link #noStroke() noStroke()} die Rahmenfarbe. + * @param x Liste der x-Koordinaten der Punkte. + * @param y Liste der y-Koordinaten der Punkte. + */ + + public void polygon(int[] x, int[] y) { + pushImage(); + + if(fillcolor != null) { + g.setColor(fillcolor); + g.fillPolygon(x,y, y.length); + } + if(pencolor != null) { + g.setColor(pencolor); + g.setStroke(new BasicStroke((float) stroke)); + // if(antialiasing) antialise(); + g.drawPolygon(x, y, x.length); + } + repaint(); + } + + /** + * Zeichnet einen Punkt, d.h. einen Kreis in der Dimension eines Pixels. + * Der erste Parameter ist der x-Wert fuer den Punkt, der zweite Wert ist der y-Wert fuer den Punkt. + * @param x x-Koordinate des Punktes + * @param y y-Koordinate des Punktes + */ + public void point(int x, int y) { + ellipse(x,y,1, 1); + } + + // ----------------------------------------- Schriftdarstellung ----------------------------------------------- + + /** + * Gibt einen Text an den gegebenen Koordinaten aus + * Zur Ausgabe des Textes wird der ausgewaehlte Font verwendet. Dieser muss vorher mit {@link #textFont(Font) textFont() } festgelegt. + * @param s Text, der angezeigt werden soll + * @param x x-Koordinate des Textanfangs + * @param y y-Koordinate der Grundlinie des Textes. + */ + public void text(String s, int x, int y) { + pushImage(); + + if(pencolor != null) { + if(fillcolor == null) + g.setColor(Color.black); + else + g.setColor(fillcolor); + g.setStroke(new BasicStroke((float) stroke)); + g.setFont(textfont); + // if(antialiasing)g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString(s, x, y); + } + repaint(); + } + + /** + * Legt die Schriftart fuer Textausgaben fest. + * Jeder uebliche Java-Font kann verwendet werden. Er kann mit z.B. Font f = new Font( "Arial", Font.PLAIN, 14 ); definiert werden. + * @param font ein Font-Objekt + */ + public void textFont(Font font) { + this.textfont = font; + } + + // ----------------------------------------- Farbfestlegungen ----------------------------------------------- + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(String color) { + try{ + return new Color( + Integer.valueOf( color.substring( 0, 2 ), 16 ), + Integer.valueOf( color.substring( 2, 4 ), 16 ), + Integer.valueOf( color.substring( 4, 6 ), 16 ) ); + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Hilfsfunktion zur Interpretation von Farben + */ + private Color decode(int color) { + try{ + if(color >=0 && color < 256) { + return new Color(color,color,color); + } else { + int r = color / 0x010000 % 0xFF; + int g = color / 0x000100 % 0xFF; + int b = color % 0xFF; + // System.out.println(""+r+","+g+","+b); + return new Color(r, g, b ); + } + } catch (Exception e) { + System.out.println("Falscher Farbcode"); + return Color.BLACK; + } + } + + /** + * Legt die Farbe fest, mit der Linien und Raender 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 fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param pencolor Stiftfarbe in Hexadezimaldarstellung + */ + public void stroke(String pencolor) { + this.pencolor = decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben + * @param pencolor Stiftfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void stroke(int pencolor) { + this.pencolor=decode(pencolor); + } + + /** + * Legt die Farbe fest, mit der Linien und Raender um Formen gezeichnet werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben + * @param r Rotanteil (0-255) der Stiftfarbe + * @param g Gruenanteil (0-255) der Stiftfarbe + * @param b Blauanteil (0-255) der Stiftfarbe + */ + public void stroke(int r, int g, int b) { + this.pencolor = new Color(r,g,b); + } + + /** + * Legt fest, dass keine Linien oder Raender um Formen gezeichnet werden soll. + */ + public void noStroke() { + this.pencolor = null; + } + + /** + * Legt die Breite des Strichs fuer Linien, Punkte und den Rand um Formen fest. + * Alle Breiten werden in Pixeleinheiten angegeben. + * @param width Breite in Pixel + */ + public void strokeWeight(double width) { + this.stroke = width; + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird hexadezimal in Form der RGB angegeben: z.B. "CCFFAA" oder "004E23". Die Syntax verwendet sechs Ziffern - je zwei fuer die roten, gruenen und blauen Komponenten, + * um eine Farbe anzugeben (genau wie Farben typischerweise in HTML und CSS angegeben werden). + * @param fillcolor Fuellfarbe in Hexadezimaldarstellung + */ + public void fill(String fillcolor) { + this.fillcolor = decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird entweder als Graustufe (0-255) oder als 3-Byte RGB-Wert angegeben. + * @param fillcolor Fuellfarbe (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void fill(int fillcolor) { + this.fillcolor=decode(fillcolor); + } + + /** + * Legt die Farbe fest, mit der Formen gefuellt werden. + * Diese Farbe wird komponentenweise als RGB-Wert angegeben. + * @param r Rotanteil (0-255) der Fuellfarbe + * @param g Gruenanteil (0-255) der Fuellfarbe + * @param b Blauanteil (0-255) der Fuellfarbe + */ + public void fill(int r, int g, int b) { + this.fillcolor = new Color(r,g,b); + } + + /** Legt fest, dass die Formen nicht gefuellt werden sollen. + */ + public void noFill() { + this.fillcolor = null; + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param c Farbe fuer den Hintergrund (0-255: Graustufe zwischen 0 schwarz und 255 weiss, sonst: c wird als 3-Byte RGB-Wert interpretiert) + */ + public void background(int c) { + if(c < 256) { + this.background=new Color(c,c,c); + } else { + int r = c / 0x010000; + int g = c / 0x000100 % 0xFF; + int b = c % 0xFF; + this.background= new Color(r, g, b ); + } + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param r Rotanteil (0-255) der Hintergrundfarbe + * @param g Gruenanteil (0-255) der Hintergrundfarbe + * @param b Blauanteil (0-255) der Hintergrundfarbe + */ + public void background(int r, int g, int b) { + this.background=new Color(r,g,b); + this.clear(); + } + + /** + * Die Funktion background() setzt die Farbe, die fuer den Hintergrund des Bildes verwendet wird. Der Standardhintergrund ist hellgrau. + * Es ist nicht moeglich, den Alpha-Parameter Transparenz mit Hintergrundfarben auf der Hauptzeichnungsoberflaeche zu verwenden. + * @param hex String Farbe in Hexadezimalangabe + */ + public void background(String hex) { + this.background = decode(hex); + this.clear(); + } + + // ----------------------------------------- Dateioperationen ----------------------------------------------- + /** + * Laedt ein Bild aus dem Dateisystem. + * Laedt ein Bild von einem Datentraeger und setzt Stiftfarbe und Fuellfarbe auf Standardwerte zurueck. + * @param filename Dateiname des Bildes + */ + public void load(String filename) { + try{ + this.image = ImageIO.read(new File(filename)); + this.g = (Graphics2D) image.getGraphics(); + this.background = decode("D0D0D0"); + this.pencolor = new Color(0,0,0); + this.fillcolor = null; + this.stroke = 1; + + this.repaint(); + } catch(Exception e) { + System.out.println("Fehler beim Einlesen der Bilddatei"); + } + } + + /** + * Speichert ein Bild. + * Speichert ein Bild auf einem Datentraeger. Zulaessig sind die Dateiformate PNG und GIF. Die Dateiendung legt den Typ fest. + * Standardmaessig wird die Dateiendung .png ergaenzt, wenn keine angegeben ist. + * @param filename Dateiname des Bildes + */ + public void save(String filename) { + try{ + String[] fn = filename.split("\\."); + if (fn.length== 1) { + ImageIO.write(image, "PNG", new File(filename+".png")); + } else { + + if (fn.length == 2 && (fn[1].toUpperCase().equals("PNG") || + fn[1].toUpperCase().equals("GIF"))){ + ImageIO.write(image, fn[1], new File(filename)); + }else { + System.out.println("Unbekanntes Bildformat"); + } + } + } catch(Exception e) { + System.out.println("Fehler beim Speichern"); + } + } + + // ----------------------------------------- Sonstiges ----------------------------------------------- + + /** + * Liefert das Bild als zweidimensionales Pixel-Array. + * @return zweidimensionales Array von Color-Objekten, die den Pixeln des Bildes entsprechen. + */ + + public Color[][] getPixelArray() { + Color[][] pixel = new Color[image.getWidth()][image.getHeight()]; + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + pixel[x][y] = new Color(image.getRGB(x,y)); + } + } + return pixel; + } + + /** + * Setzt das Bild neu auf Basis des Pixel-Arrays. + * Die Groesse des Bildes wird nicht automatisch an das Array angepasst. + * @param pixel zweidimensionales Array von Color-Objekten + */ + public void setPixelArray(Color[][] pixel) { + size(pixel.length,pixel[0].length); + + for(int x=0; x < image.getWidth(); x++){ + for(int y=0; y < image.getHeight(); y++) { + g.setColor(pixel[x][y]); + g.fillRect(x, y, 1, 1); + } + } + repaint(); + } + + /** + * Hilfsfunktion zum Verzoegern der Ausgabe + * @param millis Wartezeit in Millisekunden + */ + public void delay(int millis) { + try{ + Thread.sleep(millis); + } catch(Exception e) { + System.out.println("Fehler beim Verzoegern der Ausgabe"); + } + } +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/PictureViewer.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/PictureViewer.java new file mode 100644 index 0000000..801421d --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/PictureViewer.java @@ -0,0 +1,206 @@ +package imp; + +/** + * Zeigt ein Bild in einem Scrollbereich an. + * Es ist möglich das Bild zu zoomen und mehrere Versionen des Bildes zu speichern, um eine "Rückgängig" Operation durchzuführen. + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import javafx.scene.control.ScrollPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.embed.swing.SwingFXUtils; +import java.util.Vector; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.WritableRaster; + +public class PictureViewer extends ScrollPane +{ + + // das aktuelle Bild + private Picture picture; + + // Bilder für den Züruck-Modus speichern + private static final int ANZ_BACK = 20; + private Vector history; + + // Zeichenfläche + private Image scrollImageIcon; + private ImageView imageLabel; + + // Zoom Faktor + private double zoomFactor; + public static final int FIT = -1; + public static final int NORMAL = 1; + + + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der Größe 1000x1000 + */ + public PictureViewer() { + this(1000,1000); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + */ + public PictureViewer(int width, int height) { + this(width,height, "D0D0D0"); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild der angegebenen Größe + * @param width Breite des Bildes + * @param height Höhe des Bildes + * @param background Farbe des Hintergrunds als HEX-String (z.B. "FF3A45") + */ + public PictureViewer(int width, int height, String background) { + this(new Picture(width,height, background)); + } + + /** + * Erzeugt ein ScrollPanel mit integriertem Bild aus einer Bilddatei + * @param filename Name des Bildes + */ + public PictureViewer(String filename) { + this(new Picture(filename)); + } + + /** + * Erzeugt ein ScrollPanel und zeigt das Bild-Objekt an + * @param picture anzuzeigendes Bild + */ + public PictureViewer(Picture picture) + { + this.picture=picture; + + zoomFactor=1; + + scrollImageIcon = SwingFXUtils.toFXImage(picture.getImage(), null); + //new Image(picture.getImage().getScaledInstance(picture.getImage().getWidth(), picture.getImage().getHeight(), Image.SCALE_FAST)); + imageLabel = new ImageView(scrollImageIcon); + imageLabel.setPreserveRatio(true); +// imageLabel.setVerticalAlignment(JLabel.CENTER); +// imageLabel.setHorizontalAlignment(JLabel.CENTER); + setContent(imageLabel); + +// this.setBorder(BorderFactory.createLineBorder(Color.black)); + picture.setObserver(this); + history = new Vector(); + + } + + + /** + * Setzt das anzuzeigende Bild neu + * @param picture anzuzeigendes Bild + * @param saveOldImage soll das aktuelle Bild in der Historie gespeichert werden + */ + public void setImage(Picture picture, boolean saveOldImage) { + if (saveOldImage) pushImage(); + this.picture = picture; + repaint(); + } + + /** + * Liefert das angezeigte Bild + * @return angezeigtes Bild + */ + public Picture getImage() { + return this.picture; + } + + + + + /** + * Erzeugt eine Kopie eines BufferedImage. + * @param Originalbild + * @return Kopie des Bildes + */ + private BufferedImage deepCopy(BufferedImage bi) { + ColorModel cm = bi.getColorModel(); + boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); + WritableRaster raster = bi.copyData(null); + return new BufferedImage(cm, raster, isAlphaPremultiplied, null).getSubimage(0, 0, bi.getWidth(), bi.getHeight()); + } + + + /** + * Speichert das übergebene Bild in der History. + * @param b zu speicherndes Bild + */ + public void pushImage() { + if( this.ANZ_BACK > 0) { + if(history.size() == this.ANZ_BACK) { + history.removeElementAt(0); + } + + history.add(deepCopy(picture.getImage())); + } + } + + /** + * Ruft das letzte abgespeicherte Bild aus der History wieder auf. + */ + public void back() { + int anz = history.size(); + if(anz>0) { + BufferedImage img = history.get(anz-1); + history.removeElementAt(anz-1); + picture.setImage(img); + repaint(); + } + } + + + + /** + * Setzt das angezeigt Bild neu und beachtet dabei den Zoomfaktor. + */ + public void repaint() { + if( picture != null) { + double factor= zoomFactor; + if (zoomFactor == FIT) { + double factorw = ((double) getWidth()-2) / picture.getWidth(); + double factorh = ((double) getHeight()-2) / picture.getHeight(); + factor = Math.min(factorw, factorh); + } + int width = (int) (picture.getWidth()*factor); + int height = (int) (picture.getHeight()*factor); + + scrollImageIcon = SwingFXUtils.toFXImage(picture.getImage(), null); + imageLabel.setFitWidth(width); + imageLabel.setFitHeight(height); + imageLabel.setImage(scrollImageIcon); + + //new Image(picture.getImage().getScaledInstance(picture.getImage().getWidth(), picture.getImage().getHeight(), Image.SCALE_FAST)); +// imageLabel = new ImageView(scrollImageIcon); + + // scrollImageIcon.setImage(picture.getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT)); + // revalidate(); + } + } + + /** + * Setzt den Zoom-Faktor für das Bild. + * Als Zoomfaktor sind auch die Konstanten Bildanzeiger.FIT (auf Bildschirmgröße zoomen) und Bildanzeiger.NORMAL (100%) möglich. + * @param factor Zoomfaktor (1.0 = 100%). + */ + public void setZoom(double factor) + { + zoomFactor = factor; + repaint(); + } + + + + + + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Table.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Table.java new file mode 100644 index 0000000..5db2f11 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/Table.java @@ -0,0 +1,898 @@ +package imp; + + + +/** + * Die Klasse Table vereinfacht den Zugriff auf CSV-Dateien. + * Die Klassen Table und TableRow ermöglichen einen einfachen Zugriff auf tabellenbasierte + * Dokumente. + * + * @author Thomas Schaller + * @version 1.0 vom 01.02.2019 + */ + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; +import java.util.Scanner; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class Table +{ + // Standardtrennzeichen für Spalten + private static final char DEFAULT_SEPARATOR = ';'; + // Standardmarkierung für Texte + private static final char DEFAULT_QUOTE = '"'; + // Standardtrennzeichen für Dezimalzahlen + private static final char DEFAULT_COMMA = ','; + + // mögliche Spaltentypen + private static final String UNKNOWN ="UNKOWN"; + private static final String INT = "INTEGER"; + private static final String DOUBLE = "DOUBLE"; + private static final String FLOAT = "FLOAT"; + + // interne Verwaltung des Dokuments als JDOM-Document-Objekt + private Document doc; + // Verweis auf Element für Kopfzeile + private Element header; + // Ende Attribute + + /** + * Erzeugt leeres Tabellen-Dokument. + */ + public Table() { + this.doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + this.header = new Element("Header"); + doc.getRootElement().addContent(header); + } + + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public Table(String filename, String options, char separator, char quote) { + loadCSV(filename, options, separator, quote); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public Table(String filename, String options) { + loadCSV(filename, options); + } + + /** + * Erzeugt Tabellen-Dokument aus einer CSV-Datei. + * Liest den Inhalt einer Datei ohne Kopfzeile und erstellt ein Tabellenobjekt mit seinen Werten (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public Table(String filename) { + loadCSV(filename); + } + + // Anfang Methoden + /** + * Liest den Inhalt einer CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void loadCSV(String filename) { + loadCSV(filename, ""); + } + + /** + * Liest den Inhalt einer CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + */ + public void loadCSV(String filename, String options) { + loadCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Liest den Inhalt einer CSV-Datei. + * Wenn die Datei eine Kopfzeile enthält, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile hat, + * dann lassen Sie einfach die Option "header" weg. + * @param filename Dateiname der CSV-Datei. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile enthält. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void loadCSV(String filename, String options, char separator, char quote) { + doc = new Document(); + doc.setRootElement(new Element("CSV-Data")); + header = new Element("Header"); + doc.getRootElement().addContent(header); + try { + File f = new File(filename); + Scanner scanner = new Scanner(new File(filename)); + if(options.toLowerCase().contains("header") && scanner.hasNext()) { + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + for(String s : entries) { + Element entry = new Element("Column"); + header.addContent(entry); + entry.setText(s); + entry.setAttribute("type", "unknown"); + i++; + } + } + + List cols = header.getChildren(); + + while (scanner.hasNext()) { + Element line = new Element("Row"); + doc.getRootElement().addContent(line); + List entries = parseLine(scanner.nextLine(), separator, quote); + int i= 0; + + for(String s : entries) { + + if(i==cols.size()) { + Element entry = new Element("Column"); + entry.setAttribute("type", "unknown"); + header.addContent(entry); + cols = header.getChildren(); + } + + Element entry = new Element("Entry"); + entry.setText(s); + line.addContent(entry); + i++; + } + } + scanner.close(); + + } catch (Exception e) { + System.out.println("Fehler beim Lesen der CSV-Datei"); + } + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei ohne Kopfzeile (Separator = ';', Kennung für Text = '"'). + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename) { + saveCSV(filename, ""); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei (Separator = ';', Kennung für Text = '"'). + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + */ + public void saveCSV(String filename, String options) { + saveCSV(filename, options, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** + * Speichert das aktuelle Dokument als CSV-Datei. + * Wenn die Datei eine Kopfzeile enthalten, fügen Sie "header" in den Parameter options ein. Wenn die Datei keine Kopfzeile haben soll, + * dann lassen Sie einfach die Option "header" weg. + * @param options Geben Sie hier "header" an, wenn die Datei eine Kopfzeile haben soll. + * @param filename Dateiname der CSV-Datei. + * @param separator Trennzeichen für Spalten (meist ';' oder ',' oder '\t' für Tab) + * @param quote Kennung für Texte (meist '"'). + */ + public void saveCSV(String filename, String options, char separator, char quote){ + try{ + File f = new File(filename); + PrintStream outputFile = new PrintStream (f); + System.out.println("Speicher in : "+f.getAbsolutePath()); + List columns = header.getChildren(); + String sq = ""+quote; + String ss = ""+separator; + if(quote =='"') sq = "\""; + if(separator =='"') ss = "\""; + + if(options.toLowerCase().contains("header")) { + String h = ""; + for(Element c : columns) { + h += ss + sq + c.getText()+sq; + } + outputFile.println(h.substring(1)); + } + for(int i = 0; i parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator) { + return parseLine(cvsLine, separator, DEFAULT_QUOTE); + } + + /** HIlfsfunktion für die Analyse einer Dateizeile + * @param cvsLine Zeile aus der Datei + * @param sparator Trennzeichen für die Spalten + * @param customQuote Kennung für Strings + * @return Liste von String für die einzelnen Spalten + */ + private List parseLine(String cvsLine, char separator, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + //ggf. Default-Value laden + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separator == ' ') { + separator = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { // aktueller Text ist in Quotes eingeschlossen + startCollectChar = true; + + if (ch == customQuote) { // Quotes werden beendet, aber Achtung bei "" => Metazeichen + inQuotes = false; + if (ch == '\"') { + doubleQuotesInColumn = true; + } + + } else { + + if (ch == '\"' && !doubleQuotesInColumn) { + doubleQuotesInColumn = true; + } else { + curVal.append(ch); + doubleQuotesInColumn = false; + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (ch == '\"'){ + if(doubleQuotesInColumn) { + curVal.append('"'); + doubleQuotesInColumn = false; + } else doubleQuotesInColumn = true; + + + } + } + else { + doubleQuotesInColumn = false; + if (ch == separator) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + } + + } + result.add(curVal.toString()); + return result; + } + + /** + * Sucht die Nummer einer durch Namen gegebenen Spalte. + * @param name Name der Spalte + * @return Nummer der Spalte + */ + + private int findColumnNumber(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c : columns) { + if (c.getText().toLowerCase().equals(name.toLowerCase())) { + return i; + + } + i++; + } + return -1; + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an. + */ + public void addColumn() { + Element entry = new Element("Column"); + entry.setAttribute("type", Table.UNKNOWN); + header.addContent(entry); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt sie. + * @param title Bezeichnung der Spalte + */ + public void addColumn(String title) { + addColumn(); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setText(title); + } + + /** + * Fügt eine neue Spalte am Ende der Tabelle an und benennt und typisiert sie. + * @param title Bezeichnung der Spalte + * @param type Typ der Spalte (UNKNOWN, DOUBLE, INTEGER, FLOAT) + */ + public void addColumn(String title, String type) { + addColumn(title); + Element nc = ((List)(header.getChildren())).get(header.getChildren().size()-1); + nc.setAttribute("type", type); + } + + /** + * Löscht eine Spalte. + * @param i Nummer der Spalte. + */ + public void removeColumn(int i) { + List lines = doc.getRootElement().getChildren(); + for(Element l : lines) { + if(l.getChildren().size()>i) l.removeContent(i); + } + } + + /** + * Löscht eine Spalte + * @param name Name der Spalte + */ + public void removeColumn(String name) { + try{ + removeColumn(findColumnNumber(name)); + } catch(Exception e) { System.out.println("Unbekannter Spaltenname");} + } + + /** + * Liefert die Anzahl der Spalten in der Tabelle + * @return Anzahl der Spalten + */ + public int getColumnCount() { + return header.getChildren().size(); + } + + /** + * Liefert die Anzahl der Zeilen in der Tabelle + * @return Anzahl der Zeilen + */ + public int getRowCount() { + return doc.getRootElement().getChildren().size()-1; + } + + /** + * Löscht alle Zeilen der Tabelle. + * Die Spaltenüberschriften und Typen bleiben erhalten. + */ + public void clearRows() { + doc.getRootElement().removeChildren("Row"); + } + + /** + * Fügt eine neue Zeile an das Ende der Tabelle an. + * @return ein TableRow-Objekt für diese neue Zeile + */ + public TableRow addRow() { + Element row = new Element("Row"); + doc.getRootElement().addContent(row); + return new TableRow(doc, row); + } + + /** + * Löscht eine Zeile + * @param i Nummer der Zeile + */ + public void removeRow(int i) { + if(i rows = doc.getRootElement().getChildren(); + return new TableRow(doc, rows.get(i+1)); + } + return null; + } + + /** + * Liefert die ganze Tabelle als Array von TableRow-Objekten + * @return Array von TableRow-Objekten + */ + public TableRow[] rows() { + TableRow[] rows = new TableRow[getRowCount()]; + for(int i = 0; i < getRowCount(); i++) { + rows[i] = getRow(i); + } + return rows; + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @return Wert der Zelle + */ + public int getInt(int row, int column) { + return getRow(row).getInt(column); + } + + /** + * Liefert den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(int row, String name) { + return getRow(row).getInt(name); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param column Spaltennummer + * @param value neuer Wert der Zelle + */ + public void setInt(int row, int column,int value) { + getRow(row).setInt(column, value); + } + + /** + * Setzt den Wert einer Zelle als Integer-Zahl + * @param row Zeilennummer + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int row, String name, int value) { + getRow(row).setInt(name, value); + } + + /** + * Liefert alle Werte einer Zeile als Integer-Array. + * @param row Nummer der Zeile + * @return int-Array, dass alle Werte der Zeile enthält + */ + public int[] getIntRow(int row) { + try{ + TableRow trow = getRow(row); + int anz = getColumnCount(); + int[] r = new int[anz]; + for(int i=0; i) (header.getChildren())).get(i).getText(); + } else { + return ""; + } + } + + /** + * Liefert die Nummer einer Spalte + * @param name Name der Spalte + * @return Nummer der Spalte + */ + public int getColumn(String name) { + List columns = header.getChildren(); + int i = 0; + while (i < columns.size()) { + if (columns.get(i).getText().toLowerCase().equals(name.toLowerCase())) { + return i; + } + i++; + } // end of while + return -1; + } + + + /** + * Erzeugt eine neue Zeile mit i Spalten + * Wenn bisher nicht genügend Spalten vorhanden sind, werden automatisch neue Spalten hinzugefügt (auch zum Header) + * @param i Anzahl der Spalten + */ + private Element buildRow(int i) { + List columns = header.getChildren(); + Element entry=null; + for(int j=0; j<=i; j++) { + + if(j==columns.size()) { + Element h = new Element("Column"); + h.setAttribute("type", "unknown"); + header.addContent(h); + columns = header.getChildren(); + } + if(j==current.getChildren().size()) { + entry = new Element("Entry"); + current.addContent(entry); + + } + + } + return entry; + + } + + /** + * Erzeugt eine neue Zeile. + * Es werden genügend Spalten erzeugt, dass ein Wert in Spalte "name" eingetragen werden kann + * @param name Name der Spalte + */ + private Element buildRow(String name) { + List columns = header.getChildren(); + int i = 0; + for(Element c: columns) { + + if(c.getText().toLowerCase().equals(name.toLowerCase())) { + return buildRow(i); + } + i++; + } + return null; + + } + + /** + * Liefert den Wert einer Zelle als String + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public String getString(int i) { + if(i >= current.getContent().size()) return ""; + Element e = (Element) current.getContent(i) ; + if(e!=null) { + return e.getText(); + } else { + return ""; + } + } + + /** + * Liefert den Wert einer Zelle als String + * @param name Name der Spalte + * @return Wert der Zelle + */ + public String getString(String name) { + return getString(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als String + * @param i Nummer der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(int i, String text) { + + Element e = buildRow(i); + if(e!=null) e.setText(text); + } + + /** + * Setzt den Wert einer Zelle als String + * @param name Name der Spalte + * @param text neuer Wert der Zelle + */ + public void setString(String name, String text) { + Element e = buildRow(name); + if(e!=null) e.setText(text); + } + + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public int getInt(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Integer.parseInt(e.getText()); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public int getInt(String name) { + return getInt(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(int i,int value) { + + Element e = buildRow(i); + if(e!=null) e.setText(""+value); + } + + /** + * Setzt den Wert einer Zelle als Int-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setInt(String name, int value) { + Element e = buildRow(name); + if(e!=null) e.setText(""+value); + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public float getFloat(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Float.parseFloat(e.getText().replace(",",".")); + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public float getFloat(String name) { + return getFloat(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(int i,float value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Float-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setFloat(String name, float value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @return Wert der Zelle + */ + public double getDouble(int i) { + try{ + Element e = (Element) current.getContent(i) ; + return Double.parseDouble(e.getText().replace(",",".")); + + } catch(Exception e) { + return 0; + } + } + + /** + * Liefert den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @return Wert der Zelle + */ + public double getDouble(String name) { + return getDouble(getColumn(name)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param i Nummer der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(int i,double value) { + + Element e = buildRow(i); + if(e!=null) e.setText(format.format(value)); + } + + /** + * Setzt den Wert einer Zelle als Double-Zahl + * @param name Name der Spalte + * @param value neuer Wert der Zelle + */ + public void setDouble(String name, double value) { + Element e = buildRow(name); + if(e!=null) e.setText(format.format(value)); + } + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/XML.java b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/XML.java new file mode 100644 index 0000000..aadbb8f --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/XML.java @@ -0,0 +1,639 @@ +package imp; + +/** + * Klasse zum Vereinfachten Zugriff auf XML-Dokumente + * Diese Klasse ist für den Einsatz in der Schule gedacht und soll den Schülern + * einen einfachen Zugriff auf XML-Dokumente ermöglichen. Die zur Verfügung + * stehenden Befehle sind wie in Processing realisiert. + * Dabei ist jeder Teilbaum des Dokuments wieder als XML-Objekt zugreifbar, das + * intern auf die gleiche XML-Dokumentstruktur zugreift. + * Dies ermöglicht bei unsachgemäßem Gebrauch die XML-Struktur zu zerstören. Im + * normalen Gebrauch sollte dies aber nicht relevant sein. + * + * Benötigt: jdom-1.1.3.jar + + * @author Thomas Schaller + * @version 1.0 vom 31.01.2019 + */ +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.io.*; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.Attribute; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.output.Format; + +public class XML { + // Anfang Attribute + // XML-Dokumentstruktur + private Document doc; + // Zeiger auf das aktuelle Element + private Element current; + // Ende Attribute + + /** + * Erzeugt ein leeres XMLDokument + */ + public XML() { + this.doc = new Document(); + this.current = null; + } + + /** + * Erzeugt ein XML-Dokument aus einer Datei + * @param filename Dateiname der XML-Datei + */ + public XML(String filename) { + loadXML(filename); + } + + /** + * interner Konstruktor, um ein XML Objekt zu erzeugen, das auf einen bestimmten Knoten verweist + * @param doc die XML-Dokumentstruktur + * @param current Zeiger auf das aktuelle Element + */ + private XML(Document doc, Element current) { + this.doc = doc; + this.current = current; + } + + // Anfang Methoden + /** Öffnet das durch den Dateinamen gegebene Dokument + * @param filename Dateiname des XML-Files + */ + public void loadXML(String filename) { + doc = null; + File f = new File(filename); + + try { + // Das Dokument erstellen + SAXBuilder builder = new SAXBuilder(); + doc = builder.build(f); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + // Zeiger im Baum auf Root-Element + current = doc.getRootElement(); + } + + /** Speichert den XML-Baum im angegebenen Dateinamen + * @param filename Dateiname des XML-Files + */ + public void saveXML(String filename) { + try { + // new XMLOutputter().output(doc, System.out); + XMLOutputter xmlOutput = new XMLOutputter(); + + // display nice nice + xmlOutput.setFormat(Format.getPrettyFormat()); + File f = new File(filename); + FileOutputStream outputFile = new FileOutputStream(f); + System.out.println("Speicher in : "+f.getAbsolutePath() ); + xmlOutput.output(doc, outputFile); + outputFile.close(); + System.out.println("File Saved!"); + } catch (IOException io) { + System.out.println(io.getMessage()); + } + + } + + //----------------------------------------------- Zeigerbewegungen -------------------------------------------------- + /** + * liefert ein XML-Objekt, das auf den Vaterknoten des aktuellen Elements zeigt. + * @return Vater des aktuellen Objekts. + */ + public XML getParent() { + if(current != null) { + Element parent = current.getParentElement(); + if (parent == null) { + return null; + } else { + return new XML(doc, parent); + } + } + return null; + } + + /** + * Überprüft, ob das Element irgendwelche Kinder hat oder nicht, und gibt das Ergebnis als boolean zurück. + * @return true, wenn Kinder vorhanden sind, sonst false + */ + public boolean hasChildren() { + if (current == null) { + return doc.hasRootElement(); + } else { + return current.getChildren().size()>0; + } + } + + /** + * Ermittelt die Namen aller Kinder des Elements und gibt die Namen als ein Array von Strings zurück. + * Dies ist dasselbe wie das Durchlaufen und Aufrufen von getName() auf jedem untergeordneten Element einzeln. + * @return Liste aller Namen der Kinder + */ + public String[] listChildren() { + if (current == null) { + if(doc.hasRootElement()) { + String[] names = new String[0]; + names[0] = doc.getRootElement().getName(); + return names; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + String[] names = new String[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + names[i] = ch_element.get(i).getName(); + } + return names; + } + } + + /** + * Liefert alle Kinder des Elements als Array von XML-Objekten. + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren() { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + return ch_xml; + } else { + return null; + } + } else { + List ch_element = current.getChildren(); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert bestimmte Kinder des Elements als Array von XML-Objekten. + * Die Methode gibt dabei alle Kinder zurück, die dem angegebenen Namen entsprechen. + * @param name Name der gesuchten Kind-Objekte + * @return Array der Kinder als XML-Objekte + */ + public XML[] getChildren(String name) { + if (current == null) { + if(doc.hasRootElement()) { + XML[] ch_xml = new XML[1]; + ch_xml[0] = new XML(doc, doc.getRootElement()); + if(doc.getRootElement().getName().equals(name)){ + return ch_xml; + } else { + return null; + } + } else { + return null; + } + } else { + List ch_element = current.getChildren(name); + XML[] ch_xml = new XML[ch_element.size()]; + for(int i=0; i < ch_element.size() ; i++) { + ch_xml[i] = new XML(doc, ch_element.get(i)); + } + return ch_xml; + } + } + + /** + * Liefert das erste Kind des Elements mit einem bestimmten Namen. + * Die Methode gibt das erste Kind zurück, das dem angegebenen Namen entsprechen. + * @param name Name des gesuchten Kind-Objektes + * @return Kind als XML-Objekt + */ + + public XML getChild(String name) { + if (current == null) { + Element e = doc.getRootElement(); + if (e.getName().equals(name)) { + return new XML(doc, e); + } else { + return null; + } + } else { + String[] names = name.split("/"); + Element e = current; + int i = 0; + while(i < names.length) { + e = e.getChild(names[i]); + if (e==null) return null; + i++; + } + return new XML(doc, e); + } + } + + /** + * Liefert das i. Kind des Elements. + * Die Methode gibt das i. Kind des aktuellen Elements zurück. + * @param i Nummer des Kindes + * @return Kind als XML-Objekt + */ + public XML getChild(int i) { + if (current == null) { + return new XML(doc, doc.getRootElement()); + } else { + List ch_element = current.getChildren(); + if (i>=ch_element.size()) return null; + return new XML(doc, ch_element.get(i)); + } + } + + //--------------------------------------------------- Methoden für das aktuelle Element ------------------------------------------------- + /** + * Frage den Namen des aktuellen Elements ab + * @return Namen des Elements + */ + public String getName() { + if (current==null) return ""; + return current.getName(); + } + + /** + * Setze den Namen des aktuellen Elements. + * @param name Neuer Name des Elements + */ + public void setName(String name) { + if (current==null) return; + current.setName(name); + } + + /** + * liefert die Anzahl der Attribute eines Elements. + * @return Anzahl des Attribute + */ + public int getAttributeCount() { + if (current == null) return 0; + return current.getAttributes().size(); + } + + /** + * liefert zurück, ob das aktuelle Element Attribute hat . + * @return true, wenn es Attribute gibt + */ + public boolean hasAttribute() { + if (current == null) return false; + return current.getAttributes().size()>0; + } + + /** + * Ruft alle Attribute des angegebenen Elements ab und gibt sie als Array von Strings zurück. + * @return Liste der Attributnamen + */ + public String[] listAttributes() { + if (current == null) return null; + List attr = current.getAttributes(); + String[] names = new String[attr.size()]; + for(int i=0; i < attr.size() ; i++) { + names[i] = attr.get(i).getName(); + } + return names; + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs + */ + public String getString(String attribute) { + if (current==null) return ""; + return current.getAttributeValue(attribute); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs + */ + public String getString(String attribute, String defaultValue) { + if (current==null) return defaultValue; + return current.getAttributeValue(attribute,defaultValue); + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param text neuer Wert des Attributs + */ + public void setString(String attribute, String text) { + if (current==null) return; + current.setAttribute(attribute, text); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute) { + if (current==null) return 0; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Integer-Zahl + */ + public int getInt(String attribute, int defaultValue) { + if (current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setInt(String attribute, int value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute) { + if (current==null) return 0; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als Float-Zahl + */ + public float getFloat(String attribute, float defaultValue) { + if (current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setFloat(String attribute, float value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt einen Attributwert des aktuellen Elements ab + * @param attribute Name des Attributs + * @return Wert des Attributs als Double-Zahl + */ + public double getDouble(String attribute) { + if (current==null) return 0; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return 0; } + + } + +/** + * Fragt einen Attributwert des aktuellen Elements ab + * Sollte es das Attribut nicht geben, wird ein default-Wert zurückgegeben + * @param attribute Name des Attributs + * @param defaultValue Standardwert, falls es das Attribut nicht gibt + * @return Wert des Attributs als double-Zahl + */ + public double getDouble(String attribute, double defaultValue) { + if (current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getAttributeValue(attribute)); + return i; + } catch(Exception e) { return defaultValue; } + + } + + /** + * Setzt einen Attributwert des aktuellen Elements + * @param attribute Name des Attributs + * @param value neuer Wert des Attributs + */ + public void setDouble(String attribute, double value) { + if (current==null) return; + current.setAttribute(attribute, ""+value); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * @return Inhalt des Elements + */ + public String getContent() { + if ( current==null) return ""; + + return current.getText(); + } + + /** + * Fragt den Inhalt/Text des aktuellen Elements ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardtext + * @return Inhalt des Elements + */ + public String getContent(String defaultValue) { + if ( current==null) return defaultValue; + String t = current.getText(); + if(t.equals("")) t = defaultValue; + return t; + } + + /** + * Setzt den Inhalt/Text des aktuellen Elements + * @param text Neuer Inhalt des Elements + */ + public void setContent(String text) { + if ( current==null) return; + current.setText(text); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ public int getIntContent(int defaultValue) { + if ( current==null) return defaultValue; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Integerzahl ab + * @return Inhalt des Elements + */ + public int getIntContent() { + if ( current==null) return 0; + try{ + int i = Integer.parseInt(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setIntContent(int value) { + if ( current==null) return; + current.setText(""+value); + } + + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public float getFloatContent(float defaultValue) { + if ( current==null) return defaultValue; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Floatzahl ab + * @return Inhalt des Elements + */ + public float getFloatContent() { + if ( current==null) return 0; + try{ + float i = Float.parseFloat(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setFloatContent(float value) { + if ( current==null) return; + current.setText(""+value); + } + +/** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * Hat das Element keinen Inhalt wird der defaultValue zurückgegeben. + * @param defaultValue Standardwert + * @return Inhalt des Elements + */ + public double getDoubleContent(double defaultValue) { + if ( current==null) return defaultValue; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return defaultValue; } + } + + /** + * Fragt den Inhalt des aktuellen Elements als Doublezahl ab + * @return Inhalt des Elements + */ + public double getDoubleContent() { + if ( current==null) return 0; + try{ + double i = Double.parseDouble(current.getText()); + return i; + } catch(Exception e) { return 0; } + } + + /** + * Setzt den Inhalt des aktuellen Elements + * @param value Neuer Inhalt des Elements + */ + public void setDoubleContent(double value) { + if ( current==null) return; + current.setText(""+value); + } + + + // ----------------------------------------------- XML-Struktur aufbauen ------------------------------------------------ + /** Erzeuge neues Element nach der aktuellen Position und setze dieses als aktuelles Element + * @param name Name des neuen Elements + * @return neues Element als XML-Objekt + */ + public XML addChild(String name) { + Element e = new Element(name); + if(current == null){ // man ist auf Root-Ebene + doc.setRootElement(e); + + } + else { + current.addContent(e); + } // end of if-else + return new XML(doc, e); + } + + /** + * liefert das aktuelle Element als jdom-Element-Objekt + * @return aktuelles Element + */ + private Element getCurrent() { + return current; + } + + /** + * löscht ein Kind des aktuellen Knotens. + * Ist kid kein Kind des aktuellen Elements passiert gar nichts. + * @param kid XML-Objekt des Kindes + */ + public void removeChild(XML kid) { + if (current == null) return; + Element e = kid.getCurrent(); + int index = current.indexOf(e); + if(index >= 0) { current.removeContent(e);} + } + +} diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/package.bluej b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/package.bluej new file mode 100644 index 0000000..b21063c --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/imp/package.bluej @@ -0,0 +1,85 @@ +#BlueJ package file +dependency1.from=PictureViewer +dependency1.to=Picture +dependency1.type=UsesDependency +dependency2.from=Picture +dependency2.to=PictureViewer +dependency2.type=UsesDependency +dependency3.from=Table +dependency3.to=TableRow +dependency3.type=UsesDependency +objectbench.height=83 +objectbench.width=854 +package.editor.height=403 +package.editor.width=714 +package.editor.x=782 +package.editor.y=202 +package.numDependencies=3 +package.numTargets=7 +package.showExtends=true +package.showUses=true +target1.editor.height=700 +target1.editor.width=900 +target1.editor.x=540 +target1.editor.y=248 +target1.height=50 +target1.name=PictureViewer +target1.naviview.expanded=true +target1.showInterface=false +target1.type=ClassTarget +target1.typeParameters= +target1.width=110 +target1.x=280 +target1.y=310 +target2.height=50 +target2.name=Table +target2.showInterface=false +target2.type=ClassTarget +target2.typeParameters= +target2.width=80 +target2.x=120 +target2.y=110 +target3.height=50 +target3.name=Picture +target3.showInterface=false +target3.type=ClassTarget +target3.typeParameters= +target3.width=80 +target3.x=180 +target3.y=250 +target4.height=50 +target4.name=XML +target4.showInterface=false +target4.type=ClassTarget +target4.typeParameters= +target4.width=80 +target4.x=220 +target4.y=130 +target5.height=50 +target5.name=HSB +target5.showInterface=false +target5.type=ClassTarget +target5.typeParameters= +target5.width=90 +target5.x=40 +target5.y=200 +target6.height=50 +target6.name=TableRow +target6.showInterface=false +target6.type=ClassTarget +target6.typeParameters= +target6.width=90 +target6.x=220 +target6.y=60 +target7.editor.height=700 +target7.editor.width=900 +target7.editor.x=47 +target7.editor.y=24 +target7.height=50 +target7.name=NumberField +target7.showInterface=false +target7.type=ClassTarget +target7.typeParameters= +target7.width=130 +target7.x=380 +target7.y=70 diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/package.bluej b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/package.bluej new file mode 100644 index 0000000..9dd45e5 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/package.bluej @@ -0,0 +1,76 @@ +#BlueJ package file +dependency1.from=Controller +dependency1.to=GeometrischeBildoperationen +dependency1.type=UsesDependency +dependency2.from=Controller +dependency2.to=Punktoperationen +dependency2.type=UsesDependency +dependency3.from=Controller +dependency3.to=Mehrpixeloperationen +dependency3.type=UsesDependency +editor.fx.0.height=739 +editor.fx.0.width=816 +editor.fx.0.x=552 +editor.fx.0.y=100 +objectbench.height=98 +objectbench.width=887 +package.divider.horizontal=0.6 +package.divider.vertical=0.79 +package.editor.height=388 +package.editor.width=797 +package.editor.x=1005 +package.editor.y=198 +package.frame.height=600 +package.frame.width=927 +package.numDependencies=3 +package.numTargets=6 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +project.invoke.thread=FX +readme.height=58 +readme.name=@README +readme.width=47 +readme.x=10 +readme.y=10 +target1.height=50 +target1.name=BildbearbeitungGUI +target1.showInterface=false +target1.type=ClassTarget +target1.width=150 +target1.x=30 +target1.y=120 +target2.height=50 +target2.name=Punktoperationen +target2.showInterface=false +target2.type=ClassTarget +target2.width=140 +target2.x=400 +target2.y=190 +target3.height=50 +target3.name=Controller +target3.showInterface=false +target3.type=ClassTarget +target3.width=130 +target3.x=30 +target3.y=200 +target4.height=62 +target4.name=imp +target4.type=PackageTarget +target4.width=80 +target4.x=70 +target4.y=10 +target5.height=50 +target5.name=GeometrischeBildoperationen +target5.showInterface=false +target5.type=ClassTarget +target5.width=210 +target5.x=400 +target5.y=120 +target6.height=50 +target6.name=Mehrpixeloperationen +target6.showInterface=false +target6.type=ClassTarget +target6.width=160 +target6.x=400 +target6.y=260 diff --git a/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/view/gui_erstellen_1.fxml b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/view/gui_erstellen_1.fxml new file mode 100644 index 0000000..928f725 --- /dev/null +++ b/4_loesungen/04_bildbearbeitungsprogramm_lsg/04_bildbearbeitungsprogramm/view/gui_erstellen_1.fxml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +