gishur.x
Class XPolyline

java.lang.Object
  |
  +--gishur.x.XObject
        |
        +--gishur.x.XPolyline
All Implemented Interfaces:
AffineXTransformable, java.lang.Cloneable, Cloneable, Intersectable, java.io.Serializable
Direct Known Subclasses:
XPolygon, XUPolygon

public class XPolyline
extends XObject
implements Intersectable, AffineXTransformable, Cloneable

Ein Polygonzug.

Version:
1.0
Author:
Thomas Wolf
See Also:
Serialized Form

Constructor Summary
XPolyline()
          Leerer Konstruktor.
XPolyline(SimpleList L)
          Konstruiert ein Polygon aus der Liste L mit XPoint-, XSegment- und XRay-Objekten.
XPolyline(XPoint[] points)
          Konstruiert ein XPolygon mit dem Punktarray points.
XPolyline(XPolyline pol)
          Copy-Konstruktor.
 
Method Summary
 void add(double x, double y)
          Fügt einen Punkt an.
 void add(XPoint point)
          Fügt einen Punkt an.
 XSegment borderSegment(int i)
          Liefert das Randsegment Nummer i.
 boolean checkSimplicity(int i)
          Überprüft, ob es in der Kette einen Schnitt mit einer mit Punkt Nummer i inzidierenden Kante gibt und somit die Einfachheit verletzt wird.
 boolean checkSimplicity(XPoint p)
          Wie checkSimplicity(int), nur wird vorher noch der Punkt gesucht.
 double circumference()
          Berechnet den Umfang der Polygonkette, besser: die Länge.
 void clear()
          Löscht alle Polygonpunkte.
 java.lang.Object clone()
          Überschreibt Object.clone().
 XPoint closestPoint(XPoint p)
          Liefert einen Punkt auf dem Rand der Polyline, der am nächsten am Punkt p liegt.
 boolean contains(double x, double y)
          Liefert true, falls das Objekt den Punkt (x,y) enthält, d.h. der Schnitt mit dem Punkt nicht leer ist.
 boolean convex()
          Liefert true, falls die Polygonkette konvex ist.
 XPolyline copy(XPoint p1, XPoint p2)
          Schneidet eine Polygonkette aus einem polygonalen Objekt in Umlaufordnung von Punkt 1 bis Punkt 2.
 void copy(XPolyline pol)
          Copy-Routine übernimmt Daten von anderen Objekten.
 int countBorderSegments()
          Liefert die Anzahl der Randsegmente.
 void cycle(int i)
          Verschiebt die Polygonpunkte zyklisch so, daß Punkt Nr. i nun Punkt Nr. 0 ist.
 boolean empty()
          Liefert true, falls das unbeschränkte Polygon leer (oder alles) ist.
 boolean equals(java.lang.Object O)
          Überschreibt Object.equals(Object)
 int findBorderIndex(int pointindex, boolean start)
          Sucht das Randelement, das mit dem Punkt mit Index pointindex beginnt, falls start==true bzw. endet, falls start==false.
 int findPoint(XPoint p)
          Sucht einen gleichen Punkt zu p im Polygon und liefert dessen Index.
 int findPoint(XPoint p, int i)
          Sucht einen gleichen Punkt zu p im Polygon und liefert dessen Index.
 XPoint[] getMinMaxPoints()
          Liefert die Extrempunkte eines kleinsten umschließenden Rechteckes, also den Punkt mit den Minimum der X- und Y-Koordinaten und den Punkt mit dem Maximum der X- und Y-Koordinaten.
 SimpleList getSegmentList()
          Liefert die Segmentliste der Polygonkette.
 int indexOf(XPoint p)
          Liefert den Index des Punktes p. p sollte eine Referenz auf ein im Polygon gespeichertes XPoint-Objekt sein.
 void insert(double x, double y, int i)
          Fügt einen Punkt vor der Stelle i ein.
 void insert(XPoint point, int i)
          Fügt einen Punkt vor der Stelle i ein.
 Intersection intersection(java.lang.Object O)
          Schneidet dieses Objekt mit dem Objekt O und liefert ein entsprechendes Intersection-Objekt.
 boolean kinkPoint(int i, byte orientation)
          Testet, ob die Ecke mit Index i einen "Knick" in Richtung orientation macht.
 int length()
          Liefert die Anzahl der Punkte der Polygonkette.
 int liesOn(XPoint p)
          Sucht das erste borderSegment, auf dem der Punkt p liegt und liefert dessen Index oder -1, falls der Punkt nicht auf dem Rand liegt.
 XLine line(int i)
          Liefert eine Gerade durch den i-ten und (i+1)-ten Punkt der Kette.
 XPoint point(int i)
          Liefert den Punkt mit Nummer i.
 void remove(int i)
          Entfernt den Punkt mit Index i aus dem Polygon.
 void reverse()
          Kehrt die Polygonkette um.
 void rotate(XPoint center, double angle)
          Dreht das Objekt um den Punkt center mit dem Winkel angle.
 void rotate(XPoint center, XPoint start, XPoint end)
          Dreht das Objekt um den Punkt center mit dem Winkel start-center-end.
 void scale(XPoint center, double xscale, double yscale)
          Skaliert das Objekt mit xscale und yscale so, daß der Punkt middle davon unberührt bleibt.
 XSegment segment(int i)
          Liefert das Segment vom i-ten bis zum (i+1)ten Punkt.
 void set(SimpleList L)
          Übernimmt die Polygonkettenpunkte aus der Liste L.
 void set(XPoint[] points)
          Setzt die Polygonkette auf die Punkte im Punktarray points.
 void setPoint(XPoint p, int i)
          Setzt den Punkt Nr. i auf p.
 boolean simple()
          Test, ob die Polygonkette einfach ist.
 boolean supportsIntersection(java.lang.Object O)
          Liefert true, falls diese Klasse den Schnitt mit dem übergebenen Objekt unterstützt.
 java.lang.String toString()
          Überschreibt Object.toString().
 java.lang.String toString(boolean length, boolean points)
          Liefert einen String mit Angaben über das Objekt.
 XObject transform_XObject(double m00, double m01, double m02, double m10, double m11, double m12)
          Transforms this XObject by the given affine transformation matrix.
 void transform(double m00, double m01, double m02, double m10, double m11, double m12)
          Transformiert das Objekt mit der übergebenen Transformationsmatrix.
 void translate(double dx, double dy)
          Verschiebt das Objekt um den Vektor (dx,dy).
 
Methods inherited from class gishur.x.XObject
copy, getMutable, inverseTransform_XObject, mutable, restoreMutability, rotate_XObject, scale_XObject, transform_XObject, translate_XObject, translate_XObject
 
Methods inherited from class java.lang.Object
finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

XPolyline

public XPolyline()
Leerer Konstruktor. Erzeugt ein leered Polygon.

XPolyline

public XPolyline(XPoint[] points)
Konstruiert ein XPolygon mit dem Punktarray points. Das Array wird kopiert, die enthaltenen Punkte werden als Referenzen übernommen.
Parameters:
points - Punktliste

XPolyline

public XPolyline(SimpleList L)
Konstruiert ein Polygon aus der Liste L mit XPoint-, XSegment- und XRay-Objekten.
Parameters:
L - Liste mit Punktdaten.
See Also:
set(gishur.x.XPoint[])

XPolyline

public XPolyline(XPolyline pol)
Copy-Konstruktor.
Parameters:
l - Objekt, von dem Daten übernommen werden
Method Detail

copy

public void copy(XPolyline pol)
Copy-Routine übernimmt Daten von anderen Objekten.
Parameters:
l - Objekt, von dem Daten übernommen werden

clone

public java.lang.Object clone()
Überschreibt Object.clone().
Specified by:
clone in interface Cloneable
Overrides:
clone in class XObject
See Also:
Object.clone()

toString

public java.lang.String toString(boolean length,
                                 boolean points)
Liefert einen String mit Angaben über das Objekt.
Parameters:
length - Längeninformationen enthalten
points - Punktinformationen enthalten
Returns:
String-Repräsentation des Objektes

toString

public java.lang.String toString()
Überschreibt Object.toString().
Overrides:
toString in class XObject
See Also:
Object.toString()

equals

public boolean equals(java.lang.Object O)
Überschreibt Object.equals(Object)
Overrides:
equals in class java.lang.Object
Parameters:
O - Objekt, mit dem verglichen werden soll
Returns:
true, falls Objekte gleich
See Also:
Object.equals(java.lang.Object)

point

public XPoint point(int i)
Liefert den Punkt mit Nummer i. Der Index wird dabei zyklisch betrachtet: Index 4 bei einem Dreieck würde Punkt Nummer 1 liefern; Index 3 entsprechend Punkt 0. Index -1 würde ebenfalls Punkt Nummer 1 liefern usw.
Parameters:
i - Index
Returns:
XPoint mit Index i

length

public int length()
Liefert die Anzahl der Punkte der Polygonkette.

getSegmentList

public SimpleList getSegmentList()
Liefert die Segmentliste der Polygonkette.
Returns:
Liste mit Segmenten

indexOf

public int indexOf(XPoint p)
Liefert den Index des Punktes p. p sollte eine Referenz auf ein im Polygon gespeichertes XPoint-Objekt sein.
Parameters:
p - Punkt aus dem Polygon
Returns:
Index von p

findPoint

public int findPoint(XPoint p,
                     int i)
Sucht einen gleichen Punkt zu p im Polygon und liefert dessen Index.
Parameters:
p - Vergleichspunkt
i - Index, ab dem gesucht wird
Returns:
Index des Punktes, bei dem equals true geliefert hat oder -1, falls kein solcher Punkt mit Index>=i existiert

findPoint

public int findPoint(XPoint p)
Sucht einen gleichen Punkt zu p im Polygon und liefert dessen Index.
Parameters:
p - Vergleichspunkt
Returns:
Index des Punktes, bei dem equals true geliefert hat oder -1, falls kein solcher Punkt existiert

empty

public boolean empty()
Liefert true, falls das unbeschränkte Polygon leer (oder alles) ist. Ein unbeschränktes Polygon ist leer, wenn keine Punkte gespeichert sind.
Returns:
true, falls leer

line

public XLine line(int i)
Liefert eine Gerade durch den i-ten und (i+1)-ten Punkt der Kette.
Parameters:
i - Index für die gewünschte Gerade
Returns:
Gerade

segment

public XSegment segment(int i)
Liefert das Segment vom i-ten bis zum (i+1)ten Punkt.
Parameters:
i - Index
Returns:
Segment mit Startpunkt Nummer i

countBorderSegments

public int countBorderSegments()
Liefert die Anzahl der Randsegmente. Bei einer Polyline sind alle Randsegment normale Segmente, bei abgeleiteten Klassen können Segmente Randpunkte der 'unendlichen' Bounding-Box enthalten.
Returns:
Anzahl der Randelemente

borderSegment

public XSegment borderSegment(int i)
Liefert das Randsegment Nummer i.
Parameters:
i - Index des gewünschten Randelements
Returns:
Randelement mit Index i

findBorderIndex

public int findBorderIndex(int pointindex,
                           boolean start)
Sucht das Randelement, das mit dem Punkt mit Index pointindex beginnt, falls start==true bzw. endet, falls start==false.
Parameters:
pointindex - Index des Polygonpunktes
start - falls true wird Randelement zurückgegeben, das mit pointindex beginnt; falls false jenes, das mit pointindex endet
Returns:
Index des Randelements oder -1

getMinMaxPoints

public XPoint[] getMinMaxPoints()
Liefert die Extrempunkte eines kleinsten umschließenden Rechteckes, also den Punkt mit den Minimum der X- und Y-Koordinaten und den Punkt mit dem Maximum der X- und Y-Koordinaten.
Returns:
Array mit zwei XPoint-Objekten

clear

public void clear()
Löscht alle Polygonpunkte.

set

public void set(XPoint[] points)
Setzt die Polygonkette auf die Punkte im Punktarray points. Das Array wird kopiert, die enthaltenen Punkte werden als Referenzen übernommen.
Parameters:
points - Punktliste

set

public void set(SimpleList L)
Übernimmt die Polygonkettenpunkte aus der Liste L. Berücksichtigt werden XPoint, XSegment und XRay-Objekte. Sind zwei aufeinanderfolgende Punkte gleich, wird nur einer übernommen. Sind der erste und der letzte Punkt gleich, entfällt der letzte Punkt. Alle Punkte werden kopiert.
Parameters:
L - Liste mit Punktdaten

add

public void add(double x,
                double y)
Fügt einen Punkt an.
Parameters:
x - X-Koordinate des neuen Punktes
y - Y-Koordinate des neuen Punktes

add

public void add(XPoint point)
Fügt einen Punkt an.
Parameters:
point - neuer Punkt

insert

public void insert(double x,
                   double y,
                   int i)
Fügt einen Punkt vor der Stelle i ein.
Parameters:
x - X-Koordinate des neuen Punktes
y - Y-Koordinate des neuen Punktes
i - Index, vor dem eingefügt werden soll

insert

public void insert(XPoint point,
                   int i)
Fügt einen Punkt vor der Stelle i ein.
Parameters:
point - neuer Punkt
i - Index, vor dem eingefügt werden soll

remove

public void remove(int i)
Entfernt den Punkt mit Index i aus dem Polygon.
Parameters:
i - Index des zu löschenden Punktes

setPoint

public void setPoint(XPoint p,
                     int i)
Setzt den Punkt Nr. i auf p.
Parameters:
p - neuer Punkt
i - Index

reverse

public void reverse()
Kehrt die Polygonkette um.

cycle

public void cycle(int i)
Verschiebt die Polygonpunkte zyklisch so, daß Punkt Nr. i nun Punkt Nr. 0 ist.
Parameters:
i - Index des neuen Startpunktes

circumference

public double circumference()
Berechnet den Umfang der Polygonkette, besser: die Länge.
Returns:
Umfang

simple

public boolean simple()
Test, ob die Polygonkette einfach ist. Falls ja, dann wird true zurückgegeben, ansonsten false. Laufzeit: O(length()*length())
Returns:
true, falls das Polygon einfach ist

checkSimplicity

public boolean checkSimplicity(int i)
Überprüft, ob es in der Kette einen Schnitt mit einer mit Punkt Nummer i inzidierenden Kante gibt und somit die Einfachheit verletzt wird. Laufzeit: O(length())
Parameters:
i - Index des Punktes
Returns:
true, falls kein Schnitt existiert, sonst false

checkSimplicity

public boolean checkSimplicity(XPoint p)
Wie checkSimplicity(int), nur wird vorher noch der Punkt gesucht.
Parameters:
p - Punkt, an dessen Stelle Einfachheit überprüft werden soll

convex

public boolean convex()
Liefert true, falls die Polygonkette konvex ist. Voraussetzung ist, daß die Kette einfach ist (dies wird jedoch nicht getestet.
Returns:
true, falls konvex, ansonsten false

liesOn

public int liesOn(XPoint p)
Sucht das erste borderSegment, auf dem der Punkt p liegt und liefert dessen Index oder -1, falls der Punkt nicht auf dem Rand liegt.
Parameters:
p - zu suchender Punkt
Returns:
die Nummer des Randelementes, auf dem p liegt oder -1

closestPoint

public XPoint closestPoint(XPoint p)
Liefert einen Punkt auf dem Rand der Polyline, der am nächsten am Punkt p liegt. (Funktioniert auch bei abgeleiteten Klassen korrekt, sofern sie die borderSegment-Methoden korrekt überschreiben.)
Parameters:
p - Punkt, zu dem der nächste Randpunkt gesucht wird
Returns:
zu p nächster Punkt auf dem Rand

kinkPoint

public boolean kinkPoint(int i,
                         byte orientation)
Testet, ob die Ecke mit Index i einen "Knick" in Richtung orientation macht. Ist beispielsweise das Polygon links orientiert, so würde ein rechter Knick eine konkave Ecke, ein linker eine konvexe Ecke bedeuten.
Parameters:
i - Index des Punktes
orientation - Richtung des Knicks

copy

public XPolyline copy(XPoint p1,
                      XPoint p2)
Schneidet eine Polygonkette aus einem polygonalen Objekt in Umlaufordnung von Punkt 1 bis Punkt 2.
Parameters:
p1 - erster Punkt der polygonalen Kette
p2 - zweiter Punkt der polygonalen Kette
Returns:
polygonale Kette

contains

public boolean contains(double x,
                        double y)
Liefert true, falls das Objekt den Punkt (x,y) enthält, d.h. der Schnitt mit dem Punkt nicht leer ist.
Specified by:
contains in interface Intersectable
Parameters:
x,y - Koordinaten des Punktes
Returns:
true, falls Schnitt nicht leer.

supportsIntersection

public boolean supportsIntersection(java.lang.Object O)
Liefert true, falls diese Klasse den Schnitt mit dem übergebenen Objekt unterstützt. Hier sollte wirklich nur dann true zurückgegeben werden, wenn in dieser Klasse eine entsprechende Schnittroutine existiert.
Specified by:
supportsIntersection in interface Intersectable
Parameters:
O - zu schneidendes Objekt
Returns:
true, falls Schnittest erfolgen kann

intersection

public Intersection intersection(java.lang.Object O)
Schneidet dieses Objekt mit dem Objekt O und liefert ein entsprechendes Intersection-Objekt. Dieses ist immer !=null, was nicht heißt, daß ein Schnitt existiert. Existiert keine passende Schnittmethode in dieser Klasse, so wird versucht, die Schnittmethode des Objektes O aufzurufen, falls vorhanden. Schlägt alles fehl, so wird ein IntersectionException ausgelöst (der nicht unbedingt abgefangen werden muß, da es ein RuntimeException ist.
Specified by:
intersection in interface Intersectable
Parameters:
O - zu schneidendes Objekt
Throws:
IntersectionException - falls der Schnitt nicht durchgeführt werden konnte.

transform

public void transform(double m00,
                      double m01,
                      double m02,
                      double m10,
                      double m11,
                      double m12)
Transformiert das Objekt mit der übergebenen Transformationsmatrix.
Specified by:
transform in interface AffineXTransformable
Parameters:
m00,m01,m02 - erste Zeile der Transformationsmatrix
m10,m11,m12 - zweite Zeile der Transformationsmatrix

scale

public void scale(XPoint center,
                  double xscale,
                  double yscale)
Skaliert das Objekt mit xscale und yscale so, daß der Punkt middle davon unberührt bleibt.
Specified by:
scale in interface AffineXTransformable
Parameters:
middle - Mittelpunkt, der nicht verschoben werden soll
xscale - Skalierung der X-Achse
yscale - Skalierung der Y-Achse

rotate

public void rotate(XPoint center,
                   double angle)
Dreht das Objekt um den Punkt center mit dem Winkel angle.
Specified by:
rotate in interface AffineXTransformable
Parameters:
center - Drehpunkt
angle - Drehwinkel

rotate

public void rotate(XPoint center,
                   XPoint start,
                   XPoint end)
Dreht das Objekt um den Punkt center mit dem Winkel start-center-end.
Specified by:
rotate in interface AffineXTransformable
Parameters:
center - Drehpunkt
_source - Startpunkt
end - Endpunkt

translate

public void translate(double dx,
                      double dy)
Verschiebt das Objekt um den Vektor (dx,dy).
Specified by:
translate in interface AffineXTransformable
Parameters:
(dx,dy) - Verschiebungsvektor

transform_XObject

public XObject transform_XObject(double m00,
                                 double m01,
                                 double m02,
                                 double m10,
                                 double m11,
                                 double m12)
Transforms this XObject by the given affine transformation matrix.
Overrides:
transform_XObject in class XObject
Parameters:
m00,m01,m02 - first row of the transformation matrix
m10,m11,m12 - second row of the transformation matrix
Returns:
Transformed XObject (this, only if it is mutable, otherwise a new XObject represeting the transformed object).