diff --git a/src/main/java/schule/ngb/zm/layers/ColorLayer.java b/src/main/java/schule/ngb/zm/layers/ColorLayer.java
index 129d0bd..af5d7f1 100644
--- a/src/main/java/schule/ngb/zm/layers/ColorLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/ColorLayer.java
@@ -11,9 +11,13 @@ import java.awt.RadialGradientPaint;
/**
* Eine Ebene, die nur aus einer Farbe (oder einem Farbverlauf) besteht.
*
+ * Ein {@code ColorLayer} ist eine der drei Standardebenen der
+ * {@link schule.ngb.zm.Zeichenmaschine}.
+ *
* Die Farbe der Ebene kann beliebig gesetzt werden und kann gut als
- * Hintergundfarbe für eine Szene dienen, oder als halbtransparente "Abdeckung",
- * wenn ein {@code ColorLayer} über den anderen Ebenen eingefügt wird.
+ * Hintergrundfarbe für eine Szene dienen, oder als halbtransparente
+ * "Abdeckung", wenn ein {@code ColorLayer} über den anderen Ebenen eingefügt
+ * wird.
*/
@SuppressWarnings( "unused" )
public class ColorLayer extends Layer {
diff --git a/src/main/java/schule/ngb/zm/layers/DrawableLayer.java b/src/main/java/schule/ngb/zm/layers/DrawableLayer.java
index f04db05..342cf47 100644
--- a/src/main/java/schule/ngb/zm/layers/DrawableLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/DrawableLayer.java
@@ -8,55 +8,102 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
+/**
+ * Ein Layer um {@link Drawable} Objekte zu zeichnen.
+ *
+ * Objekte, die das {@code Drawable} Interface implementieren, können der Ebene
+ * hinzugefügt werden. Die Ebene sorgt dafür, dass alle {@code Drawable}s einmal
+ * pro Frame über ihre {@link Drawable#draw(Graphics2D)} Methode gezeichnet.
+ */
+@SuppressWarnings( "unused" )
public class DrawableLayer extends Layer {
- protected List drawables = new LinkedList<>();
+ /**
+ * Liste der {@link Drawable}s.
+ */
+ protected final List drawables;
+ /**
+ * Ob die Ebene bei jedem Aufruf von {@link #draw(Graphics2D)} geleert
+ * werden soll.
+ */
protected boolean clearBeforeDraw = true;
+ /**
+ * Erstellt eine Ebene in der Standardgröße.
+ */
public DrawableLayer() {
+ drawables = new LinkedList<>();
}
+ /**
+ * Erstellt eine Ebene mit der angegebenen Größe.
+ *
+ * @param width Die Breite der Ebene.
+ * @param height Die Höhe der Ebene.
+ */
public DrawableLayer( int width, int height ) {
super(width, height);
+ drawables = new LinkedList<>();
}
+ /**
+ * Fügt alle angegebenen {@code Drawable}s der Ebene hinzu.
+ *
+ * @param drawables Die {@code Drawable} Objekte.
+ */
public void add( Drawable... drawables ) {
- synchronized( drawables ) {
- for( Drawable d : drawables ) {
- this.drawables.add(d);
- }
+ synchronized( this.drawables ) {
+ Collections.addAll(this.drawables, drawables);
}
}
+ /**
+ * Gibt eine Liste aller {@code Drawable} Objekte dieser Ebene zurück.
+ *
+ * @return Die Liste der {@code Drawable} Objekte.
+ */
public java.util.List getDrawables() {
return drawables;
}
+ /**
+ * Ob die Ebene bei jedem Frame automatisch gelöscht wird.
+ *
+ * @return {@code true}, wenn die Ebene vorm Zeichnen gelöscht wird,
+ * {@code false} sonst.
+ */
public boolean isClearBeforeDraw() {
return clearBeforeDraw;
}
+ /**
+ * Stellt ein, ob die Ebene vorm Zeichnen gelöscht werden soll.
+ *
+ * @param pClearBeforeDraw Ob die Ebene vorm Zeichnen gelöscht werden
+ * soll.
+ */
public void setClearBeforeDraw( boolean pClearBeforeDraw ) {
this.clearBeforeDraw = pClearBeforeDraw;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
- public void draw( Graphics2D pGraphics ) {
+ public void draw( Graphics2D graphics ) {
if( clearBeforeDraw ) {
clear();
}
- synchronized( drawables ) {
- List it = List.copyOf(drawables);
- for( Drawable d : it ) {
- if( d.isVisible() ) {
- d.draw(drawing);
- }
+ List it = List.copyOf(drawables);
+ for( Drawable d : it ) {
+ if( d.isVisible() ) {
+ d.draw(drawing);
}
}
- super.draw(pGraphics);
+ super.draw(graphics);
}
}
diff --git a/src/main/java/schule/ngb/zm/layers/DrawingLayer.java b/src/main/java/schule/ngb/zm/layers/DrawingLayer.java
index 1b1f46f..f8569f3 100644
--- a/src/main/java/schule/ngb/zm/layers/DrawingLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/DrawingLayer.java
@@ -1,5 +1,6 @@
package schule.ngb.zm.layers;
+import schule.ngb.zm.Color;
import schule.ngb.zm.Layer;
import schule.ngb.zm.Options;
import schule.ngb.zm.util.io.ImageLoader;
@@ -8,106 +9,413 @@ import java.awt.*;
import java.awt.geom.*;
import java.util.Stack;
+/**
+ * Eine Ebene auf der direkt gezeichnet werden kann.
+ *
+ * Ein {@code DrawingLayer} ist eine der drei Standardebenen der
+ * {@link schule.ngb.zm.Zeichenmaschine}.
+ */
public class DrawingLayer extends Layer {
- protected schule.ngb.zm.Color fillColor = DEFAULT_FILLCOLOR;
+ /**
+ * Aktuelle Füllfarbe.
+ */
+ protected Color fillColor = DEFAULT_FILLCOLOR;
- protected schule.ngb.zm.Color strokeColor = DEFAULT_STROKECOLOR;
+ /**
+ * Der aktuelle Farbverlauf oder {@code null}, wenn aktuell kein
+ * Farbverlauf gesetzt ist.
+ */
+ protected Paint fill = null;
+ /**
+ * Aktuelle Konturfarbe.
+ */
+ protected Color strokeColor = DEFAULT_STROKECOLOR;
+
+ /**
+ * Aktuelle Dicke der Konturlinie.
+ */
protected double strokeWeight = DEFAULT_STROKEWEIGHT;
+ /**
+ * Art der Konturlinie.
+ */
protected Options.StrokeType strokeType = SOLID;
+ /**
+ * Standardanker für Formen.
+ */
private Options.Direction default_anchor = CENTER;
+ /**
+ * Wiederverwendbarer Speicher für eine Linie.
+ */
protected Line2D.Double line = new Line2D.Double();
+
+ /**
+ * Wiederverwendbarer Speicher für eine Ellipse.
+ */
protected Ellipse2D.Double ellipse = new Ellipse2D.Double();
+
+ /**
+ * Wiederverwendbarer Speicher für ein Rechteck.
+ */
protected Rectangle2D.Double rect = new Rectangle2D.Double();
+
+ /**
+ * Wiederverwendbarer Speicher für einen Kreisbogen.
+ */
protected Arc2D.Double arc = new Arc2D.Double();
+ /**
+ * Wiederverwendbarer Speicher für einen Pfad.
+ */
protected Path2D.Double path = new Path2D.Double();
+ /**
+ * Ob ein individueller Pfad gestartet wurde.
+ */
private boolean pathStarted = false;
- private Stack transformStack = new Stack<>();
-
- private FontMetrics fontMetrics = null;
+ /**
+ * Stapel für zwischengespeicherte Transformationsmatrizen.
+ */
+ private final Stack transformStack;
+ // private FontMetrics fontMetrics;
+ /**
+ * Erstellt eine Ebene in der Standardgröße.
+ */
public DrawingLayer() {
super();
+ transformStack = new Stack<>();
transformStack.push(new AffineTransform());
- fontMetrics = drawing.getFontMetrics();
+ // fontMetrics = drawing.getFontMetrics();
}
+ /**
+ * Erstellt eine Ebene mit der angegebenen Größe.
+ *
+ * @param width Die Breite der Ebene.
+ * @param height Die Höhe der Ebene.
+ */
public DrawingLayer( int width, int height ) {
super(width, height);
+ transformStack = new Stack<>();
transformStack.push(new AffineTransform());
- fontMetrics = drawing.getFontMetrics();
+ // fontMetrics = drawing.getFontMetrics();
}
- public schule.ngb.zm.Color getColor() {
+ /**
+ * Gibt die aktuelle Füllfarbe zurück.
+ *
+ * @return Die aktuelle Füllfarbe.
+ */
+ public Color getFillColor() {
return fillColor;
}
- public void setFillColor( int gray ) {
- setFillColor(gray, gray, gray, 255);
- }
-
- public void setFillColor( schule.ngb.zm.Color color ) {
+ /**
+ * Setzt die Füllfarbe auf die angegebene Farbe.
+ *
+ * @param color Die neue Füllfarbe oder {@code null}.
+ * @see Color
+ */
+ public void setFillColor( Color color ) {
fillColor = color;
drawing.setColor(color.getJavaColor());
}
- public void noFill() {
- fillColor = null;
+ /**
+ * Setzt die Füllfarbe auf die angegebene Farbe und setzt die Transparenz
+ * auf den angegebenen Wert. 0 is komplett durchsichtig und 255 komplett
+ * deckend.
+ *
+ * @param color Die neue Füllfarbe oder {@code null}.
+ * @param alpha Ein Transparenzwert zwischen 0 und 255.
+ * @see Color#Color(Color, int)
+ */
+ public void setFillColor( Color color, int alpha ) {
+ setFillColor(new Color(color, alpha));
}
+ /**
+ * Setzt die Füllfarbe auf einen Grauwert mit der angegebenen Intensität. 0
+ * entspricht schwarz, 255 entspricht weiß.
+ *
+ * @param gray Ein Grauwert zwischen 0 und 255.
+ * @see Color#Color(int)
+ */
+ public void setFillColor( int gray ) {
+ setFillColor(gray, gray, gray, 255);
+ }
+
+ /**
+ * Setzt die Füllfarbe auf einen Grauwert mit der angegebenen Intensität und
+ * dem angegebenen Transparenzwert. Der Grauwert 0 entspricht schwarz, 255
+ * entspricht weiß.
+ *
+ * @param gray Ein Grauwert zwischen 0 und 255.
+ * @param alpha Ein Transparenzwert zwischen 0 und 255.
+ * @see Color#Color(int, int)
+ */
public void setFillColor( int gray, int alpha ) {
setFillColor(gray, gray, gray, alpha);
}
+ /**
+ * Setzt die Füllfarbe auf die Farbe mit den angegebenen Rot-, Grün- und
+ * Blauanteilen.
+ *
+ * @param red Der Rotanteil der Farbe zwischen 0 und 255.
+ * @param green Der Grünanteil der Farbe zwischen 0 und 255.
+ * @param blue Der Blauanteil der Farbe zwischen 0 und 255.
+ * @see Color#Color(int, int, int)
+ * @see https://de.wikipedia.org/wiki/RGB-Farbraum
+ */
public void setFillColor( int red, int green, int blue ) {
setFillColor(red, green, blue, 255);
}
+ /**
+ * Setzt die Füllfarbe auf die Farbe mit den angegebenen Rot-, Grün- und
+ * Blauanteilen und dem angegebenen Transparenzwert.
+ *
+ * @param red Der Rotanteil der Farbe zwischen 0 und 255.
+ * @param green Der Grünanteil der Farbe zwischen 0 und 255.
+ * @param blue Der Blauanteil der Farbe zwischen 0 und 255.
+ * @param alpha Ein Transparenzwert zwischen 0 und 25
+ * @see Color#Color(int, int, int, int)
+ * @see https://de.wikipedia.org/wiki/RGB-Farbraum
+ */
public void setFillColor( int red, int green, int blue, int alpha ) {
setFillColor(new schule.ngb.zm.Color(red, green, blue, alpha));
}
- public schule.ngb.zm.Color getStrokeColor() {
+ /**
+ * Entfernt die Füllung der Form.
+ */
+ public void noFill() {
+ fillColor = null;
+ }
+
+ /**
+ * Setzt die Füllfarbe auf den Standardwert zurück.
+ *
+ * @see schule.ngb.zm.Constants#DEFAULT_FILLCOLOR
+ */
+ public void resetFill() {
+ setFillColor(DEFAULT_FILLCOLOR);
+ noGradient();
+ }
+
+ /**
+ * Setzt die Füllung auf einen linearen Farbverlauf, der am Punkt
+ * ({@code fromX}, {@code fromY}) mit der Farbe {@code from} startet und am
+ * Punkt (({@code toX}, {@code toY}) mit der Farbe {@code to} endet.
+ *
+ * @param fromX x-Koordinate des Startpunktes.
+ * @param fromY y-Koordinate des Startpunktes.
+ * @param from Farbe am Startpunkt.
+ * @param toX x-Koordinate des Endpunktes.
+ * @param toY y-Koordinate des Endpunktes.
+ * @param to Farbe am Endpunkt.
+ */
+ public void setGradient( double fromX, double fromY, Color from, double toX, double toY, Color to ) {
+ setFillColor(from);
+ fill = new GradientPaint(
+ (float) fromX, (float) fromY, from.getJavaColor(),
+ (float) toX, (float) toY, to.getJavaColor()
+ );
+ }
+
+ /**
+ * Setzt die Füllung auf einen kreisförmigen (radialen) Farbverlauf, mit dem
+ * Zentrum im Punkt ({@code centerX}, {@code centerY}) und dem angegebenen
+ * Radius. Der Verlauf starte im Zentrum mit der Farbe {@code from} und
+ * endet am Rand des durch den Radius beschriebenen Kreises mit der Farbe
+ * {@code to}.
+ *
+ * @param centerX x-Koordinate des Kreismittelpunktes.
+ * @param centerY y-Koordinate des Kreismittelpunktes.
+ * @param radius Radius des Kreises.
+ * @param from Farbe im Zentrum des Kreises.
+ * @param to Farbe am Rand des Kreises.
+ */
+ public void setGradient( double centerX, double centerY, double radius, Color from, Color to ) {
+ setFillColor(from);
+ fill = new RadialGradientPaint(
+ (float) centerX, (float) centerY, (float) radius,
+ new float[]{0f, 1f},
+ new java.awt.Color[]{from.getJavaColor(), to.getJavaColor()});
+ }
+
+ /**
+ * Entfernt den Farbverlauf von der Form.
+ */
+ public void noGradient() {
+ fill = null;
+ }
+
+ /**
+ * Gibt die aktuelle Farbe der Konturlinie zurück.
+ *
+ * @return Die Konturfarbe oder {@code null}.
+ */
+ public Color getStrokeColor() {
return strokeColor;
}
- public void setStrokeColor( int gray ) {
- setStrokeColor(gray, gray, gray, 255);
- }
-
- public void setStrokeColor( schule.ngb.zm.Color color ) {
+ /**
+ * Setzt die Farbe der Konturlinie auf die angegebene Farbe.
+ *
+ * @param color Die neue Farbe der Konturlinie.
+ * @see Color
+ */
+ public void setStrokeColor( Color color ) {
strokeColor = color;
drawing.setColor(color.getJavaColor());
}
- public void noStroke() {
- strokeColor = null;
+ /**
+ * Setzt die Farbe der Konturlinie auf die angegebene Farbe und setzt die
+ * Transparenz auf den angegebenen Wert. 0 is komplett durchsichtig und 255
+ * komplett deckend.
+ *
+ * @param color Die neue Farbe der Konturlinie oder {@code null}.
+ * @param alpha Ein Transparenzwert zwischen 0 und 255.
+ * @see Color#Color(Color, int)
+ */
+ public void setStrokeColor( Color color, int alpha ) {
+ setStrokeColor(new Color(color, alpha));
}
+ /**
+ * Setzt die Farbe der Konturlinie auf einen Grauwert mit der angegebenen
+ * Intensität. 0 entspricht schwarz, 255 entspricht weiß.
+ *
+ * @param gray Ein Grauwert zwischen 0 und 255.
+ * @see Color#Color(int)
+ */
+ public void setStrokeColor( int gray ) {
+ setStrokeColor(gray, gray, gray, 255);
+ }
+
+ /**
+ * Setzt die Farbe der Konturlinie auf einen Grauwert mit der angegebenen
+ * Intensität und dem angegebenen Transparenzwert. Der Grauwert 0 entspricht
+ * schwarz, 255 entspricht weiß.
+ *
+ * @param gray Ein Grauwert zwischen 0 und 255.
+ * @param alpha Ein Transparenzwert zwischen 0 und 255.
+ * @see Color#Color(int, int)
+ */
public void setStrokeColor( int gray, int alpha ) {
setStrokeColor(gray, gray, gray, alpha);
}
+ /**
+ * Setzt die Farbe der Konturlinie auf die Farbe mit den angegebenen Rot-,
+ * Grün- und Blauanteilen.
+ *
+ * @param red Der Rotanteil der Farbe zwischen 0 und 255.
+ * @param green Der Grünanteil der Farbe zwischen 0 und 255.
+ * @param blue Der Blauanteil der Farbe zwischen 0 und 255.
+ * @see Color#Color(int, int, int)
+ * @see https://de.wikipedia.org/wiki/RGB-Farbraum
+ */
public void setStrokeColor( int red, int green, int blue ) {
setStrokeColor(red, green, blue, 255);
}
+ /**
+ * Setzt die Farbe der Konturlinie auf die Farbe mit den angegebenen Rot-,
+ * Grün- und Blauanteilen und dem angegebenen Transparenzwert.
+ *
+ * @param red Der Rotanteil der Farbe zwischen 0 und 255.
+ * @param green Der Grünanteil der Farbe zwischen 0 und 255.
+ * @param blue Der Blauanteil der Farbe zwischen 0 und 255.
+ * @param alpha Ein Transparenzwert zwischen 0 und 25
+ * @see Color#Color(int, int, int, int)
+ * @see https://de.wikipedia.org/wiki/RGB-Farbraum
+ */
public void setStrokeColor( int red, int green, int blue, int alpha ) {
setStrokeColor(new schule.ngb.zm.Color(red, green, blue, alpha));
}
- public void setStrokeWeight( double pWeight ) {
- strokeWeight = pWeight;
+ /**
+ * Entfernt die Kontur der Form.
+ */
+ public void noStroke() {
+ strokeColor = null;
+ }
+
+ /**
+ * Setzt die Farbe der Konturlinie auf die Standardwerte zurück.
+ *
+ * @see schule.ngb.zm.Constants#DEFAULT_STROKECOLOR
+ * @see schule.ngb.zm.Constants#DEFAULT_STROKEWEIGHT
+ * @see schule.ngb.zm.Constants#SOLID
+ */
+ public void resetStroke() {
+ setStrokeColor(DEFAULT_STROKECOLOR);
+ setStrokeWeight(DEFAULT_STROKEWEIGHT);
+ setStrokeType(SOLID);
+ }
+
+ /**
+ * Gibt die Dicke der Konturlinie zurück.
+ *
+ * @return Die aktuelle Dicke der Linie.
+ */
+ public double getStrokeWeight() {
+ return strokeWeight;
+ }
+
+ /**
+ * Setzt die Dicke der Konturlinie. Die Dicke muss größer 0 sein. Wird 0
+ * übergeben, dann wird keine Kontur mehr angezeigt.
+ *
+ * @param weight Die Dicke der Konturlinie.
+ */
+ public void setStrokeWeight( double weight ) {
+ strokeWeight = weight;
drawing.setStroke(createStroke());
}
+ /**
+ * Gibt die Art der Konturlinie zurück.
+ *
+ * @return Die aktuelle Art der Konturlinie.
+ * @see Options.StrokeType
+ */
+ public Options.StrokeType getStrokeType() {
+ return strokeType;
+ }
+
+ /**
+ * Setzt den Typ der Kontur. Erlaubte Werte sind {@link #DASHED},
+ * {@link #DOTTED} und {@link #SOLID}.
+ *
+ * @param type Eine der möglichen Konturarten.
+ * @see Options.StrokeType
+ */
+ public void setStrokeType( Options.StrokeType type ) {
+ this.strokeType = type;
+ }
+
+ /**
+ * Hilfsmethode, um ein {@link Stroke} Objekt mit den aktuellen
+ * Kontureigenschaften zu erstellen. Der aktuelle {@code Stroke} wird
+ * zwischengespeichert.
+ *
+ * @return Ein {@code Stroke} mit den passenden Kontureigenschaften.
+ */
protected Stroke createStroke() {
switch( strokeType ) {
case DOTTED:
@@ -130,30 +438,6 @@ public class DrawingLayer extends Layer {
}
}
- public Options.StrokeType getStrokeType() {
- return strokeType;
- }
-
- public void setStrokeType( Options.StrokeType type ) {
- switch( type ) {
- case DASHED:
- this.strokeType = DASHED;
- break;
- case DOTTED:
- this.strokeType = DOTTED;
- break;
- default:
- this.strokeType = SOLID;
- break;
- }
- }
-
- public void resetStroke() {
- setStrokeColor(DEFAULT_STROKECOLOR);
- setStrokeWeight(DEFAULT_STROKEWEIGHT);
- setStrokeType(SOLID);
- }
-
public void setAnchor( Options.Direction anchor ) {
default_anchor = anchor;
}
@@ -194,7 +478,7 @@ public class DrawingLayer extends Layer {
public void pixel( double x, double y ) {
// square(x, y, 1);
- buffer.setRGB((int)x, (int)y, fillColor.getRGBA());
+ buffer.setRGB((int) x, (int) y, fillColor.getRGBA());
}
public void square( double x, double y, double w ) {
@@ -222,11 +506,11 @@ public class DrawingLayer extends Layer {
}
public void circle( double x, double y, double r ) {
- ellipse(x, y, r+r, r+r, default_anchor);
+ ellipse(x, y, r + r, r + r, default_anchor);
}
public void circle( double x, double y, double r, Options.Direction anchor ) {
- ellipse(x, y, r+r, r+r, anchor);
+ ellipse(x, y, r + r, r + r, anchor);
}
public void ellipse( double x, double y, double w, double h ) {
@@ -242,7 +526,7 @@ public class DrawingLayer extends Layer {
}
public void arc( double x, double y, double r, double angle1, double angle2 ) {
- arc(x, y, r+r, r+r, angle1, angle2);
+ arc(x, y, r + r, r + r, angle1, angle2);
}
public void arc( double x, double y, double w, double h, double angle1, double angle2 ) {
@@ -260,7 +544,7 @@ public class DrawingLayer extends Layer {
anchorPoint.x, anchorPoint.y,
w, h,
//Math.toRadians(angle1), Math.toRadians(angle2 - angle1),
- angle1, angle2-angle1,
+ angle1, angle2 - angle1,
Arc2D.OPEN
);
@@ -270,7 +554,7 @@ public class DrawingLayer extends Layer {
public void pie( double x, double y, double r, double angle1, double angle2 ) {
while( angle2 < angle1 ) angle2 += 360.0;
- double d = r+r;
+ double d = r + r;
Point2D.Double anchorPoint = getAnchorPoint(x, y, d, d, CENTER);
/*Shape arc = new Arc2D.Double(
@@ -435,7 +719,7 @@ public class DrawingLayer extends Layer {
}
public void setFontSize( int size ) {
- setFont(drawing.getFont().deriveFont((float)size));
+ setFont(drawing.getFont().deriveFont((float) size));
}
public void setFont( String fontName ) {
@@ -460,7 +744,7 @@ public class DrawingLayer extends Layer {
private Point2D.Double transformToCanvas( double x, double y ) {
- return transformToCanvas(new Point2D.Double(x,y));
+ return transformToCanvas(new Point2D.Double(x, y));
}
private Point2D.Double transformToCanvas( Point2D.Double pPoint ) {
@@ -470,7 +754,7 @@ public class DrawingLayer extends Layer {
}
private Point2D.Double transformToUser( double x, double y ) {
- return transformToUser(new Point2D.Double(x,y));
+ return transformToUser(new Point2D.Double(x, y));
}
private Point2D.Double transformToUser( Point2D.Double pPoint ) {
diff --git a/src/main/java/schule/ngb/zm/layers/ImageLayer.java b/src/main/java/schule/ngb/zm/layers/ImageLayer.java
index a35c75d..ad88468 100644
--- a/src/main/java/schule/ngb/zm/layers/ImageLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/ImageLayer.java
@@ -1,11 +1,12 @@
package schule.ngb.zm.layers;
-import java.awt.Graphics2D;
-import java.awt.Image;
-
import schule.ngb.zm.Layer;
import schule.ngb.zm.util.io.ImageLoader;
+import java.awt.Graphics2D;
+import java.awt.Image;
+
+@SuppressWarnings( "unused" )
public class ImageLayer extends Layer {
protected Image image;
@@ -16,20 +17,20 @@ public class ImageLayer extends Layer {
protected boolean redraw = true;
- public ImageLayer(String source) {
+ public ImageLayer( String source ) {
image = ImageLoader.loadImage(source);
}
- public ImageLayer(Image image) {
+ public ImageLayer( Image image ) {
this.image = image;
}
- public ImageLayer(int width, int height, Image image) {
+ public ImageLayer( int width, int height, Image image ) {
super(width, height);
this.image = image;
}
- public void setImage(Image image) {
+ public void setImage( Image image ) {
this.image = image;
redraw = true;
}
@@ -38,7 +39,7 @@ public class ImageLayer extends Layer {
return x;
}
- public void setX(double pX) {
+ public void setX( double pX ) {
this.x = pX;
redraw = true;
}
@@ -47,7 +48,7 @@ public class ImageLayer extends Layer {
return y;
}
- public void setY(double pY) {
+ public void setY( double pY ) {
this.y = pY;
redraw = true;
}
@@ -59,8 +60,8 @@ public class ImageLayer extends Layer {
}
@Override
- public void draw(Graphics2D graphics) {
- if (redraw && visible) {
+ public void draw( Graphics2D graphics ) {
+ if( redraw && visible ) {
drawing.drawImage(image, (int) x, (int) y, null);
redraw = false;
}
diff --git a/src/main/java/schule/ngb/zm/layers/Shape2DLayer.java b/src/main/java/schule/ngb/zm/layers/Shape2DLayer.java
index 33f6a51..6164ccb 100644
--- a/src/main/java/schule/ngb/zm/layers/Shape2DLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/Shape2DLayer.java
@@ -4,42 +4,46 @@ import schule.ngb.zm.Color;
import schule.ngb.zm.Layer;
import schule.ngb.zm.Options;
-import java.awt.*;
+import java.awt.BasicStroke;
+import java.awt.Graphics2D;
+import java.awt.Shape;
+import java.awt.Stroke;
import java.util.LinkedList;
+@SuppressWarnings( "unused" )
public final class Shape2DLayer extends Layer {
- protected schule.ngb.zm.Color strokeColor = DEFAULT_STROKECOLOR;
+ private schule.ngb.zm.Color strokeColor = DEFAULT_STROKECOLOR;
- protected schule.ngb.zm.Color fillColor = DEFAULT_FILLCOLOR;
+ private schule.ngb.zm.Color fillColor = DEFAULT_FILLCOLOR;
- protected double strokeWeight = DEFAULT_STROKEWEIGHT;
+ private double strokeWeight = DEFAULT_STROKEWEIGHT;
- protected Options.StrokeType strokeType = SOLID;
+ private Options.StrokeType strokeType = SOLID;
- private LinkedList shapes;
+ private final LinkedList shapes;
private boolean instantDraw = false;
public Shape2DLayer() {
super();
- shapes = new LinkedList();
+ shapes = new LinkedList<>();
}
public Shape2DLayer( boolean instantDraw ) {
super();
- shapes = new LinkedList();
+ shapes = new LinkedList<>();
this.instantDraw = instantDraw;
}
public Shape2DLayer( int width, int height ) {
super(width, height);
- shapes = new LinkedList();
+ shapes = new LinkedList<>();
}
public Shape2DLayer( int width, int height, boolean instantDraw ) {
super(width, height);
- shapes = new LinkedList();
+ shapes = new LinkedList<>();
this.instantDraw = instantDraw;
}
@@ -106,7 +110,7 @@ public final class Shape2DLayer extends Layer {
drawing.setStroke(createStroke());
}
- protected Stroke createStroke() {
+ private Stroke createStroke() {
switch( strokeType ) {
case DOTTED:
return new BasicStroke(
@@ -153,7 +157,7 @@ public final class Shape2DLayer extends Layer {
}
@Override
- public void draw( Graphics2D pGraphics ) {
+ public void draw( Graphics2D graphics ) {
if( !instantDraw ) {
for( Shape shape : shapes ) {
drawing.setColor(fillColor.getJavaColor());
@@ -164,7 +168,7 @@ public final class Shape2DLayer extends Layer {
}
}
- super.draw(pGraphics);
+ super.draw(graphics);
}
}
diff --git a/src/main/java/schule/ngb/zm/layers/ShapesLayer.java b/src/main/java/schule/ngb/zm/layers/ShapesLayer.java
index 6e5d7bc..ba561c0 100644
--- a/src/main/java/schule/ngb/zm/layers/ShapesLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/ShapesLayer.java
@@ -10,13 +10,20 @@ import java.awt.Graphics2D;
import java.util.*;
import java.util.function.DoubleUnaryOperator;
+/**
+ * Ein Layer um {@link Shape} Objekte zu zeichnen.
+ *
+ * Ein {@code ShapesLayer} ist eine der drei Standardebenen der
+ * {@link schule.ngb.zm.Zeichenmaschine}.
+ */
+@SuppressWarnings( "unused" )
public class ShapesLayer extends Layer {
protected boolean clearBeforeDraw = true;
- private List shapes;
+ private final List shapes;
- private List> animations;
+ private final List> animations;
public ShapesLayer() {
super();
@@ -37,7 +44,7 @@ public class ShapesLayer extends Layer {
public ST getShape( Class shapeClass ) {
for( Shape s : shapes ) {
if( shapeClass.isInstance(s) ) {
- return (ST) s;
+ return shapeClass.cast(s);
}
}
return null;
@@ -51,7 +58,7 @@ public class ShapesLayer extends Layer {
List result = new LinkedList<>();
for( Shape s : shapes ) {
if( shapeClass.isInstance(s) ) {
- result.add((ST) s);
+ result.add(shapeClass.cast(s));
}
}
return result;
@@ -59,17 +66,13 @@ public class ShapesLayer extends Layer {
public void add( Shape... shapes ) {
synchronized( this.shapes ) {
- for( Shape s : shapes ) {
- this.shapes.add(s);
- }
+ Collections.addAll(this.shapes, shapes);
}
}
public void add( Collection shapes ) {
synchronized( this.shapes ) {
- for( Shape s : shapes ) {
- this.shapes.add(s);
- }
+ this.shapes.addAll(shapes);
}
}
@@ -83,9 +86,7 @@ public class ShapesLayer extends Layer {
public void remove( Collection shapes ) {
synchronized( this.shapes ) {
- for( Shape s : shapes ) {
- this.shapes.remove(s);
- }
+ this.shapes.removeAll(shapes);
}
}
@@ -116,9 +117,9 @@ public class ShapesLayer extends Layer {
anim.start();
}
-
- public void play( Animation extends Shape>... anims ) {
- for( Animation extends Shape> anim: anims ) {
+ @SafeVarargs
+ public final void play( Animation extends Shape>... anims ) {
+ for( Animation extends Shape> anim : anims ) {
this.animations.add(anim);
anim.start();
}
@@ -141,13 +142,13 @@ public class ShapesLayer extends Layer {
anim.update(delta);
if( !anim.isActive() ) {
- animations.remove(anim);
+ it.remove();
}
}
}
@Override
- public void draw( Graphics2D pGraphics ) {
+ public void draw( Graphics2D graphics ) {
if( clearBeforeDraw ) {
clear();
}
@@ -161,7 +162,7 @@ public class ShapesLayer extends Layer {
}
}
- super.draw(pGraphics);
+ super.draw(graphics);
}
}
diff --git a/src/main/java/schule/ngb/zm/layers/TurtleLayer.java b/src/main/java/schule/ngb/zm/layers/TurtleLayer.java
index 414833b..29d61a1 100644
--- a/src/main/java/schule/ngb/zm/layers/TurtleLayer.java
+++ b/src/main/java/schule/ngb/zm/layers/TurtleLayer.java
@@ -6,12 +6,14 @@ import schule.ngb.zm.Options;
import schule.ngb.zm.Vector;
import schule.ngb.zm.shapes.FilledShape;
-import java.awt.*;
+import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.util.ArrayList;
+import java.util.List;
import java.util.Stack;
+@SuppressWarnings( "unused" )
public class TurtleLayer extends Layer {
// Rotating by the clock
@@ -39,7 +41,7 @@ public class TurtleLayer extends Layer {
public static final int H12 = 360;
- private static Stack turtleColors;
+ private final static Stack turtleColors;
static {
turtleColors = new Stack<>();
@@ -51,9 +53,9 @@ public class TurtleLayer extends Layer {
turtleColors.add(Color.BLUE);
}
- private Turtle mainTurtle = null;
+ private final Turtle mainTurtle;
- private ArrayList turtles = new ArrayList(6);
+ private final List turtles = new ArrayList<>(6);
public TurtleLayer() {
super();
@@ -255,8 +257,8 @@ public class TurtleLayer extends Layer {
mainTurtle.resetStroke();
}
- public void addPosToPath() {
- mainTurtle.addPosToPath();
+ public void beginPath() {
+ mainTurtle.beginPath();
}
public void closePath() {
@@ -266,9 +268,12 @@ public class TurtleLayer extends Layer {
// End of delegate methods (auto-generated)
+ /**
+ * Die Turtle der Zeichenmaschine.
+ */
public class Turtle extends FilledShape {
- private static final int STD_SIZE = 12;
+ private static final int DEFAULT_SIZE = 12;
boolean penDown = true;
@@ -282,7 +287,22 @@ public class TurtleLayer extends Layer {
boolean pathOpen = false;
- Turtle() {}
+ Turtle() {
+ }
+
+ public void beginPath() {
+ pathOpen = false;
+ addPosToPath();
+ }
+
+ public void closePath() {
+ if( pathOpen ) {
+ addPosToPath();
+ path.closePath();
+ path.trimToSize();
+ pathOpen = false;
+ }
+ }
private void addPosToPath() {
if( !pathOpen ) {
@@ -294,15 +314,6 @@ public class TurtleLayer extends Layer {
}
}
- private void closePath() {
- if( pathOpen ) {
- addPosToPath();
- path.closePath();
- path.trimToSize();
- pathOpen = false;
- }
- }
-
public void fill() {
closePath();
@@ -322,16 +333,16 @@ public class TurtleLayer extends Layer {
-12, -5, 16, 10, 5, 3
);*/
Path2D path = new Path2D.Double();
- path.moveTo(STD_SIZE, 0);
- path.lineTo(-STD_SIZE, -STD_SIZE/2);
- path.lineTo(-STD_SIZE, STD_SIZE/2);
- path.lineTo(STD_SIZE, 0);
+ path.moveTo(DEFAULT_SIZE, 0);
+ path.lineTo(-DEFAULT_SIZE, -DEFAULT_SIZE / 2.0);
+ path.lineTo(-DEFAULT_SIZE, DEFAULT_SIZE / 2.0);
+ path.lineTo(DEFAULT_SIZE, 0);
AffineTransform verzerrung = new AffineTransform();
verzerrung.translate(position.x, position.y);
verzerrung.rotate(Math.toRadians(direction.angle()));
- Shape shape = verzerrung.createTransformedShape(path);
+ java.awt.Shape shape = verzerrung.createTransformedShape(path);
if( strokeColor != null ) {
graphics.setColor(strokeColor.getJavaColor());