Class Shape

All Implemented Interfaces:
Drawable, Fillable, Strokeable
Direct Known Subclasses:
Arc, Circle, Curve, CustomShape, Ellipse, Kite, Line, Picture, Polygon, Rectangle, ShapeGroup, Text

public abstract class Shape extends BasicDrawable
Dies ist die Basisklasse für alle Formen in der Zeichenmaschine.

Alle Formen sind als Unterklassen von Shape implementiert.

Neben den abstrakten Methoden implementieren Unterklassen mindestens zwei Konstruktoren. Einen Konstruktor, der die Form mit vom Nutzer gegebenen Parametern initialisiert und einen, der die Werte einer anderen Form desselben Typs übernimmt. In der Klasse Circle sind die Konstruktoren beispielsweise so implementiert:


 public Circle( double x, double y, double radius ) {
     super(x, y);
     this.radius = radius;
 }

 public Circle( Circle circle ) {
     super(circle.x, circle.y);
     copyFrom(circle);
 }
 

Außerdem implementieren Unterklassen eine passende Object.toString() und eine equals(Object) Methode.

  • Field Details

    • x

      protected double x
      Speichert die x-Koordinate der Form.
    • y

      protected double y
      Speichert die y-Koordinate der Form.
    • rotation

      protected double rotation
      Speichert die Rotation in Grad um den Punkt (x, y).
    • scale

      protected double scale
      Speichert den Skalierungsfaktor.
    • anchor

      protected Options.Direction anchor
      Speichert den Ankerpunkt.
  • Constructor Details

    • Shape

      public Shape()
      Erstellt eine neue Form mit den Koordinaten (0,0).
    • Shape

      public Shape(double x, double y)
      Erstellt eine Form mit den angegebenen Koordinaten.
      Parameters:
      x - Die x-Koordinate.
      y - Die y-Koordinate.
  • Method Details

    • getX

      public double getX()
      Liefert die aktuelle x-Koordinate der Form.
      Returns:
      Die x-Koordinate.
    • setX

      public void setX(double x)
      Setzt die x-Koordinate der Form.
      Parameters:
      x - Die neue x-Koordinate.
    • getY

      public double getY()
      Liefert die aktuelle y-Koordinate der Form.
      Returns:
      Die y-Koordinate.
    • setY

      public void setY(double y)
      Setzt die x-Koordinate der Form.
      Parameters:
      y - Die neue y-Koordinate der Form.
    • getWidth

      public abstract double getWidth()
      Liefert die aktuelle Breite dieser Form.

      Die Breite einer Form ist immer die Breite ihrer Begrenzung, bevor Drehungen und andere Transformationen auf sie angewandt wurden.

      Die Begrenzungen der tatsächlich gezeichneten Form wird mit getBounds() abgerufen.

      Returns:
      Die Breite der Form.
    • getHeight

      public abstract double getHeight()
      Liefert die aktuelle Höhe dieser Form.

      Die Höhe einer Form ist immer die Höhe ihrer Begrenzung, bevor Drehungen und andere Transformationen auf sie angewandt wurden.

      Die Begrenzungen der tatsächlich gezeichneten Form wird mit getBounds() abgerufen.

      Returns:
      Die Höhe der Form.
    • getRotation

      public double getRotation()
      Liefert die Rotation in Grad.
      Returns:
      Rotation in Grad.
    • rotate

      public void rotate(double angle)
      Dreht die Form um den angegebenen Winkel um ihren Ankerpunkt.
      Parameters:
      angle - Drehwinkel in Grad.
    • rotate

      public void rotate(Point2D center, double angle)
      Dreht die Form um den angegebenen Winkel um das angegebene Drehzentrum.
      Parameters:
      center - Das Drehzentrum der Drehung.
      angle - Der Drehwinkel.
    • rotate

      public void rotate(double x, double y, double angle)
      Dreht die Form um den angegebenen Drehwinkel um die angegbenen Koordinaten als Drehzentrum.
      Parameters:
      x - x-Koordiante des Drehzentrums.
      y - y-Koordiante des Drehzentrums.
      angle - Drehwinkel in Grad.
    • rotateTo

      public void rotateTo(double angle)
      Setzt die Drehung der Form auf den angegebenen Winkel.
      Parameters:
      angle - Drehwinkel in Grad.
    • getScale

      public double getScale()
      Gibt den aktuellen Skalierungsfaktor zurück.
      Returns:
      Der Skalierungsfaktor.
    • scale

      public void scale(double factor)
      Setzt den Skalierungsfaktor auf den angegebenen Faktor.

      Bei einem Faktor größer 0 wird die Form vergrößert, bei einem Faktor kleiner 0 verkleinert. Bei negativen Werten wird die Form entlang der x- bzw. y-Achse gespiegelt.

      Das Seitenverhältnis wird immer beibehalten.

      Parameters:
      factor - Der Skalierungsfaktor.
    • scaleBy

      public void scaleBy(double factor)
      Skaliert die Form um den angegebenen Faktor.

      Bei einem Faktor größer 0 wird die Form vergrößert, bei einem Faktor kleiner 0 verkleinert. Bei negativen Werten wird die Form entlang der x- bzw. y-Achse gespiegelt.

      Die Skalierung wird zusätzlich zur aktuellen Skalierung angewandt. Wurde die Form zuvor um den Faktor 0.5 verkleinert und wird dann um 1.5 vergrößert, dann ist die Form im Anschluss ein Drittel kleiner als zu Beginn (0.5 * 1.5 = 0.75).

      Parameters:
      factor - Der Skalierungsfaktor.
    • getAnchor

      public Options.Direction getAnchor()
      Liefert den aktuellen Ankerpunkt der Form.
      Returns:
      Der Ankerpunkt.
    • setAnchor

      public void setAnchor(Options.Direction anchor)
      Setzt den Ankerpunkt der Form auf die angegebene Richtung.

      Jede Form hat einen Ankerpunkt, von dem aus sie gezeichnet wird. Jede Richtung beschreibt einen der Neun Ankerpunkte:

       NW────N────NE
       │           │
       │           │
       W     C     E
       │           │
       │           │
       SW────S────SE
       

      Für den Ankerpunkt Constants.CENTER wird die Form also ausgehend von den Koordinaten x und y um die Hälfte der Breite nach links und rechts, sowie um die Hälfte der Höhe nach oben und unten gezeichnet. Fpr den Ankerpunkt Constants.NORTHWEST dagegen um die gesamte Breite nach rechts und die Höhe nach unten.

       setAnchor(CENTER) │   setAnchor(NORTHWEST)
         ┌───────────┐   │
         │           │   │
         │           │   │
         │   (x,y)   │   │       (x,y)─────────┐
         │           │   │         │           │
         │           │   │         │           │
         └───────────┘   │         │           │
                         │         │           │
                         │         │           │
                         │         └───────────┘
       

      Der Ankerpunkt der Form bestimmt bei Transformationen auch die Position des Drehzentrums und anderer relativer Koordinaten bezüglich der Form.

      Parameters:
      anchor - Der Ankerpunkt.
    • getAnchorPoint

      public static Point2D.Double getAnchorPoint(double width, double height, Options.Direction anchor)
      Bestimmt die relativen Koordinaten des angegebenen Ankerpunkts basierend auf der angegebenen Breite und Höhe des umschließenden Rechtecks.

      Die Koordinaten des Ankerpunktes werden relativ zur oberen linken Ecke des Rechtecks mit der Breite width und der Höhe height bestimmt. Der Ankerpunkt Constants.NORTHWEST hat daher immer das Ergebnis (0,0) und Constants.SOUTHEAST (width, height).

        (0,0)───(w/2,0)───(w,0)
          │                 │
          │                 │
          │                 │
       (0,h/2) (w/2,h/2) (w,h/2)
          │                 │
          │                 │
          │                 │
        (0,h)───(w/2,h)───(w,h)
       
      Parameters:
      width - Breite des umschließenden Rechtecks.
      height - Höhe des umschließenden Rechtecks.
      anchor - Gesuchter Ankerpunkt.
      Returns:
      Ein Point2D mit den relativen Koordinaten.
    • getAnchorPoint

      public Point2D.Double getAnchorPoint(Options.Direction anchor)
      Bestimmt die Koordinaten des angegebenen Ankers der Form relativ zum aktuellen Ankerpunkt.
      Parameters:
      anchor - Die Richtung des Ankers.
      Returns:
      Der relative Ankerpunkt.
      See Also:
    • getAbsAnchorPoint

      public Point2D.Double getAbsAnchorPoint(Options.Direction anchor)
      Ermittelt die absoluten Koordinaten des angegebenen Ankers.

      Die absoluten Koordinaten werden bestimmt durch die Position der Form (x,y) plus die relativen Koordinaten des Ankers. Wichtig: Die Berechnung berücksichtigt derzeit keine Rotationen und Transformationen der Form.

      Parameters:
      anchor - Die Richtung des Ankers.
      Returns:
      Der absolute Ankerpunkt.
      See Also:
    • copyFrom

      public void copyFrom(Shape shape)
      Kopiert die Eigenschaften der angegebenen Form in diese.

      Unterklassen überschreiben diese Methode, um weitere Eigenschaften zu kopieren (zum Beispiel den Radius eines Kreises). Überschreibende Methoden sollten immer mit dem Aufruf super.copyFrom(shape) die Basiseigenschaften kopieren.

      Die Methode kopiert so viele Eigenschaften wie möglich von der angegebenen Form in diese. Wenn die andere Form einen anderen Typ hat, dann werden trotzdem die Basiseigenschaften (Konturlinie, Füllung, Position, Rotation, Skalierung, Sichtbarkeit und Ankerpunkt) in diese Form kopiert. Soweit sinnvoll übernehmen implementierende Unterklassen auch andere Werte. Eine Ellipse kopiert beispielsweise auch die Breite und Höhe eines Rectangle.

      Wird null übergeben, dann passiert nichts.

      Parameters:
      shape - Die Originalform, von der kopiert wird.
    • copy

      public abstract Shape copy()
      Erzeugt eine Kopie dieser Form mit denselben Eigenschaften.

      Unterklassen implementieren diese Methode mit dem genauen Typ der Unterklasse. In Rectangle sieht die Umsetzung beispielsweise so aus:

      
       public Rectangle copy() {
           return new Rectangle(this);
       }
       

      Die Methode kann beliebig umgesetzt werden, um eine 1-zu-1-Kopie dieser Form zu erhalten. In der Regel besitzt aber jede Form einen Konstruktor, der alle Werte einer andern Form übernimmt. Die gezeigte Implementierung ist daher im Regelfall ausreichend.

      Returns:
      Eine genaue Kopie dieser Form.
    • getShape

      public abstract Shape getShape()
      Gibt eine Java-AWT Shape Version dieser Form zurück. Intern werden die AWT Shapes benutzt, um sie auf den Grafikkontext zu zeichnen.

      Wenn diese Form nicht durch eine AWT-Shape dargestellt wird, liefert die Methode null.

      Returns:
      Eine Java-AWT Shape die diese Form repräsentiert oder null.
    • getBounds

      public Bounds getBounds()
      Gibt die Begrenzungen der Form zurück.

      Ein Bounds-Objekt beschreibt eine "Axis Aligned Bounding Box" (AABB).

      Returns:
      Die Abgrenzungen der Form nach Anwendung der Transformationen.
    • move

      public void move(double dx, double dy)
      Verschiebt die Form um die angegebenen Werte entlang der Koordinatenachsen.
      Parameters:
      dx - Verschiebung entlang der x-Achse.
      dy - Verschiebung entlang der y-Achse.
    • moveTo

      public void moveTo(double x, double y)
      Bewegt die Form an die angegebenen Koordinaten.
      Parameters:
      x - Die neue x-Koordinate.
      y - Die neue y-Koordinate.
    • moveTo

      public void moveTo(Shape shape)
      Bewegt die Form an dieselben Koordinaten wie die angegebene Form.
      Parameters:
      shape - Eine andere Form.
    • moveTo

      public void moveTo(Shape shape, Options.Direction dir)
      Bewegt die Form zum angegebenen Ankerpunkt der angegebenen Form.
      Parameters:
      shape - Die andere Form.
      dir - Die Richtung des Ankerpunktes.
      See Also:
    • moveTo

      public void moveTo(Shape shape, Options.Direction dir, double buff)
      Bewegt den Ankerpunkt dieser Form zu einem Ankerpunkt einer anderen Form.

      Mit buff wird ein zusätzlicher Abstand angegeben, um den die Form entlang des Ankerpunktes anchor verschoben wird.

      Ist der Anker zum Beispiel NORTH, dann wird die Form um buff oberhalb der oberen Kante der zweiten Form verschoben.

      Befinden sich die Formen zuvor in folgender Ausrichtung:

                        ┌─────────┐
                        │         │
                        W    B    │
            ┌─────┐     │         │
            │     │     └─────────┘
            W  A  │
            │     │
            └─────┘
       

      bringt sie der Aufruf B.moveTo(A, DOWN, 0) in diese Ausrichtung:

        B.moveTo(A, WEST, 0) │ B.moveTo(A, WEST, 10)
                             │
             ┌─────┬───┐     │    ┌┬────┬────┐
             │     │   │     │    ││    │    │
             │  A B│   │     │    ││ A  B    │
             │     │   │     │    ││    │    │
             └─────┴───┘     │    └┴────┴────┘
       
      Parameters:
      shape - Die andere Form.
      dir - Die Richtung des Ankerpunktes.
      buff - Der Abstand zum angegebenen Ankerpunkt.
    • alignTo

      public void alignTo(Options.Direction dir)
      Bewegt die Form an den Rand der Zeichenfläche in der angegebenen Richtung.
      Parameters:
      dir - Die Richtung.
    • alignTo

      public void alignTo(Options.Direction dir, double buff)
      Bewegt die Form mit dem angegebenen Abstand an den Rand der Zeichenfläche in der angegebenen Richtung aus.
      Parameters:
      dir - Die Richtung.
      buff - Der Abstand zum Rand.
    • alignTo

      public void alignTo(Shape shape, Options.Direction dir)
      Bewegt den Ankerpunkt dieser Form in der angegebenen Richtung zum Gleichen Ankerpunkt der anderen Form.
      Parameters:
      shape - Die andere Form.
      dir - Die Richtung des Ankerpunktes.
      See Also:
    • alignTo

      public void alignTo(Shape shape, Options.Direction dir, double buff)
      Richtet die Form entlang der angegebenen Richtung an einer anderen Form aus.

      buff gibt einen Abstand ab, um den diese From versetzt ausgerichtet wird.

      Für Constants.DOWN wird beispielsweise die y-Koordinate der unteren Kante dieser Form an der unteren Kante von shape ausgerichtet. Die x-Koordinate wird in dem Fall nicht verändert.

      Befinden sich die Formen beispielsweise in folgender Position:

                    ┌─────┐
                    │     │
                    │  B  │
         ┌─────┐    │     │
         │     │    └──D──┘
         │  A  │
         │     │
         └──D──┘
       

      werden sie durch alignTo so positioniert:

       B.alignTo(A, EAST, 0)  │  B.alignTo(A, EAST, 10)
                              │
         ┌─────┐    ┌─────┐   │    ┌─────┐
         │     │    │     │   │    │     │    ┌─────┐
         │  A  │    │  B  │   │    │  A  │    │     │
         │     │    │     │   │    │     │    │  B  │
         └──D──┘    └──D──┘   │    └──D──┘    │     │
                              │               └──D──┘
                              │
       
      Parameters:
      shape - Die andere Form.
      dir - Die Richtung.
      buff - Der Abstand.
    • nextTo

      public void nextTo(Shape shape, Options.Direction dir)
      Parameters:
      shape -
      dir -
      See Also:
    • nextTo

      public void nextTo(Shape shape, Options.Direction dir, double buff)
      Bewegt die Form neben eine andere in Richtung des angegebenen Ankerpunktes.

      Im Gegensatz zu moveTo(Shape, Options.Direction, double) wird die Breite bzw. Höhe der Formen berücksichtigt und die Formen so platziert, dass keine Überlappungen vorhanden sind.

      Befinden sich die Formen zuvor in folgender Ausrichtung:

                       ┌─────┐
                       │     │
                       W  B  │
       ┌──────┐        │     │
       │      │        └─────┘
       │  A   E
       │      │
       └──────┘
       

      bringt sie der Aufruf B.nextTo(A, EAST, 0) in diese Ausrichtung:

       B.nextTo(A, EAST, 0) │  B.nextTo(A, EAST, 10)
                            │
          ┌─────┬─────┐     │     ┌─────┐ ┌─────┐
          │     │     │     │     │     │ │     │
          │  A  │  B  │     │     │  A  │ │  B  │
          │     │     │     │     │     │ │     │
          └─────┴─────┘     │     └─────┘ └─────┘
                            │
       
      Parameters:
      shape -
      dir -
      buff -
    • setGradient

      public void setGradient(Color from, Color to, Options.Direction dir)
      Description copied from interface: Fillable
      Setzt die Füllung auf einen linearen Farbverlauf, der in die angegebene Richtung verläuft.
      Parameters:
      from - Farbe am Startpunkt.
      to - Farbe am Endpunkt.
      dir - Richtung des Farbverlaufs.
    • setGradient

      public void setGradient(Color from, Color to)
      Description copied from interface: Fillable
      Setzt die Füllung auf einen kreisförmigen (radialen) Farbverlauf, der im Zentrum beginnt.
      Parameters:
      from - Farbe im Zentrum.
      to - Farbe am Rand.
    • getTransform

      public AffineTransform getTransform()
    • draw

      public final void draw(Graphics2D graphics)
      Zeichnet die Form.
      Specified by:
      draw in interface Drawable
      Specified by:
      draw in class BasicDrawable
      Parameters:
      graphics -
    • draw

      public void draw(Graphics2D graphics, AffineTransform transform)
      Zeichnet die Form, aber wendet zuvor noch eine zusätzliche Transformations- matrix an. Wird u.A. von der ShapeGroup verwendet.
      Parameters:
      graphics -
      transform -
    • equals

      public boolean equals(Object o)
      Vergleicht die Form mit einem anderen Objekt. Handelt es sich bei dem Objekt um eine andere Form, werden Position, Drehwinkel und Skalierung verglichen. Unterklassen überschreiben die Methode, um weitere Eigenschaften zu berücksichtigen.

      Die Eigenschaften, die durch Fillable und Strokeable impliziert werden, werden nicht verglichen.

      Overrides:
      equals in class Object
      Parameters:
      o - Ein anderes Objekt.
      Returns:
    • strokeShape

      protected void strokeShape(Shape shape, Graphics2D graphics)
      Hilfsmethode für Unterklassen, um die angegebene Form mit den aktuellen Kontureigenschaften auf den Grafik-Kontext zu zeichnen. Die Methode verändert gegebenenfalls die aktuelle Farbe des Grafikobjekts und setzt sie nicht auf den Ursprungswert zurück, wie von draw(Graphics2D) gefordert. Dies sollte die aufrufende Unterklasse übernehmen.
      Parameters:
      shape - Die zu zeichnende Java-AWT Form
      graphics - Das Grafikobjekt.
    • fillShape

      protected void fillShape(Shape shape, Graphics2D graphics)
      Hilfsmethode für Unterklassen, um die angegebene Form mit der aktuellen Füllung auf den Grafik-Kontext zu zeichnen. Die Methode verändert gegebenenfalls die aktuelle Farbe des Grafikobjekts und setzt sie nicht auf den Ursprungswert zurück, wie von draw(Graphics2D) gefordert. Dies sollte die aufrufende Unterklasse übernehmen.
      Parameters:
      shape - Die zu zeichnende Java-AWT Form
      graphics - Das Grafikobjekt.