gishur.x
Class XBaseline

java.lang.Object
  |
  +--gishur.x.XObject
        |
        +--gishur.x.XBaseline
All Implemented Interfaces:
AffineXTransformable, java.lang.Cloneable, Cloneable, Intersectable, java.io.Serializable
Direct Known Subclasses:
XLine, XRay, XSegment

public class XBaseline
extends XObject
implements Intersectable, AffineXTransformable

Ein Grundobjekt für Geraden, Strahlen und Segmente.

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

Field Summary
static byte DIRECTION_DOWN
          Richtungskonstante.
static byte DIRECTION_LEFT
          Richtungskonstante.
static byte DIRECTION_RIGHT
          Richtungskonstante.
static byte DIRECTION_UP
          Richtungskonstante.
static double INFINITE_BOUND
          Schranke für 'unendliche Segmente'
 
Constructor Summary
XBaseline()
           
 
Method Summary
 double angle()
          Liefert den Winkel, den die Gerade mit der X-Achse bildet.
 double angle(XBaseline l)
          Liefert den Winkel, den das Linienobjekt mit dem Linienobjekt l bildet.
 XPoint calculatePoint(double x)
          Berechnet den Punkt auf der Geraden, der die x-Koordinate x besitzt.
 XPoint closestPoint(XPoint point)
          Liefert den zu point nächsten Punkt auf dem Rand.
 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.
static void copyInfiniteChain(XPoint p1, XPoint p2, XPoint[] array, int start)
          Kopiert die Kette von Punkten der unendlichen Boundingbox zwischen p1 und p2 in das Array array ab Index start.
 byte direction()
          Liefert die Richtung, in die die gerichtete Gerade zeigt.
 boolean equals(java.lang.Object O)
          Überschreibt Object.equals(Object)
 void flip()
          Dreht das Linienelement um, vertauscht also source() mit target().
 XPoint getDirectionVector()
          Liefert einen Richtungsvektor der XBaseline.
static int getInfiniteBoundIndex(XPoint p)
          Liefert den Index des Segmentes der Bounding Box, auf der der Punkt p liegt oder -1, falls er nicht auf dem Rand der Bounding Box liegt.
static XPolygon getInfiniteBounds()
          Liefert die Bounding-Box als XPolygon.
 XPoint getInfiniteEndPoint(boolean forward)
          Liefert einen (eventuell unendlichen) Endpunkt des Linienobjektes. unendlich heißt in diesem Zusammenhang den Schnittpunkt mit der Bounding Box (INFINITE_BOUND).
static XPoint getInfinitePoint(int i)
          Liefert den Eckpunkt Nummer i der unendlichen Bounding Box.
 XSegment getInfiniteSegment()
          Liefert das 'unendliche Segment' zu diesem Linienobjekt.
 XPoint getPointInLineDirection(XPoint start, double length)
          Liefert den Punkt, der von start aus genau length entfernt in Richtung der Geraden liegt.
 boolean horizontal()
          Liefert true, falls die Gerade horizontal ist.
 boolean incident(XBaseline b)
          Liefert true, falls sich dieses Objekt und b in einem Randpunkt berühren.
 Intersection intersection(java.lang.Object O)
          Schneidet dieses Objekt mit dem Objekt O und liefert ein entsprechendes Intersection-Objekt.
 boolean liesOn(XPoint q)
          Liefert true, falls p auf der Geraden liegt.
static byte oppositeDirection(byte direction)
          Liefert die entgegengesetzte Richtung zur Richtung direction.
 byte orientation(XPoint p)
          Testet, ob der Punkt p auf der rechten oder linken Seite der Geraden liegt.
 XLine orthogonal()
          Berechnet die orthogonale Gerade.
 XLine orthogonal(XPoint point)
          Berechnet die orthogonale Gerade durch den Eingabepunkt.
 boolean parallel(XBaseline l)
          Liefert true, falls die beiden Geraden parallel sind.
 XPoint plumb(XPoint point)
          Fällt das Lot vom Eingabepunkt auf die Gerade und gibt den Schnittpunkt zurück.
 XPoint plumbTo(XPoint p, XBaseline l)
          Bestimmt die Gerade senkrecht zu dieser durch den Punkt p und gibt deren Schnittpunkt mit dem Linienobjekt l zurück.
 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 rotateTo(double x, double y)
          Dreht die XBaseline um den Startpunkt so, daß sie durch den Punkt (x,y) geht.
 void scale(XPoint center, double xscale, double yscale)
          Skaliert das Objekt mit xscale und yscale so, daß der Punkt middle davon unberührt bleibt.
 void set(double x1, double y1, double x2, double y2)
          Konstruiert eine Gerade durch die Punkte (x1,y1) und (x2,y2).
 void set(XPoint s, XPoint t)
          Konstruiert eine Gerade durch die Punkte s und t.
 boolean similarDirection(XBaseline l)
          Liefert true, wenn l und dieses XBasline-Objekt ungefähr in dieselbe Richtung zeigen, also die Geraden höchstens einen Winkel von 90° aufspannen (gerichtet!).
 double slope()
          Liefert die Steigung des Geraden.
 XPoint source()
          Liefert eine Referenz auf den Source-Punkt zurück.
 boolean supportsIntersection(java.lang.Object O)
          Liefert true, falls diese Klasse den Schnitt mit dem übergebenen Objekt unterstützt.
 XPoint target()
          Liefert eine Referenz auf den Target-Punkt zurück.
 java.lang.String toString()
          Überschreibt Object.toString().
 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).
 XPoint vector(boolean forward, boolean orthogonal, boolean normalize)
          Liefert einen (normalisierten) Vektor auf oder orthogonal zum Linienobjekt.
 boolean vertical()
          Liefert true, falls die Gerade vertikal ist.
 double y_abs()
          Liefert die Y-Koordinate des Schnittpunktes der Geraden mit der Y-Achse.
 
Methods inherited from class gishur.x.XObject
clone, 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
 

Field Detail

DIRECTION_RIGHT

public static final byte DIRECTION_RIGHT
Richtungskonstante. Nach rechts (Steigung>0).

DIRECTION_LEFT

public static final byte DIRECTION_LEFT
Richtungskonstante. Nach links (Steigung<0)

DIRECTION_UP

public static final byte DIRECTION_UP
Richtungskonstante. Nach oben (Steigung==unendlich)

DIRECTION_DOWN

public static final byte DIRECTION_DOWN
Richtungskonstante. Nach unten (Steigung==unendlich)

INFINITE_BOUND

public static final double INFINITE_BOUND
Schranke für 'unendliche Segmente'
Constructor Detail

XBaseline

public XBaseline()
Method Detail

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)

source

public XPoint source()
Liefert eine Referenz auf den Source-Punkt zurück.
Returns:
Source-Punkt

target

public XPoint target()
Liefert eine Referenz auf den Target-Punkt zurück.
Returns:
Target-Punkt

y_abs

public double y_abs()
Liefert die Y-Koordinate des Schnittpunktes der Geraden mit der Y-Achse.
Returns:
Y-Koordinate des Schnittpunktes mit der Y-Achse

slope

public double slope()
Liefert die Steigung des Geraden.
Returns:
Steigung

direction

public byte direction()
Liefert die Richtung, in die die gerichtete Gerade zeigt. Das Ergebnis ist eine der Richtungskonstanten.
Returns:
Richtung der gerichteten Gerade

oppositeDirection

public static final byte oppositeDirection(byte direction)
Liefert die entgegengesetzte Richtung zur Richtung direction.
Parameters:
direction - Richtung
Returns:
entgegengesetzte Richtung

set

public void set(double x1,
                double y1,
                double x2,
                double y2)
Konstruiert eine Gerade durch die Punkte (x1,y1) und (x2,y2). Als Source-Punkt wird (x1,y1) genommen.
Parameters:
x1,y1 - erster Punkt, durch den die Gerade gelegt wird
x2,y2 - zweiter Punkt, durch den die Gerade gelegt wird

set

public void set(XPoint s,
                XPoint t)
Konstruiert eine Gerade durch die Punkte s und t. Als Source-Punkt wird s genommen.
Parameters:
s - erster Punkt, durch den die Gerade gelegt wird
t - zweiter Punkt, durch den die Gerade gelegt wird

rotateTo

public void rotateTo(double x,
                     double y)
Dreht die XBaseline um den Startpunkt so, daß sie durch den Punkt (x,y) geht.
Parameters:
x,y - neuer Punkt, durch den die Baseline gehen soll

flip

public void flip()
Dreht das Linienelement um, vertauscht also source() mit target(). Bei Geraden ändert sich somit lediglich die Orientierung, bei Segmenten tauschen die Endpunkte und bei Strahlen wird der Startpunkt verschoben und die Richtung umgekehrt.

angle

public double angle()
Liefert den Winkel, den die Gerade mit der X-Achse bildet. Der Winkel wird zwischen dem positiven Schenkel der X-Achse und dem positiven Schenkel der Geraden gemessen (also source()->target()). Falls die Gerade parallel zur X-Achse verläuft: 0 wird zurückgegeben, falls sie in dieselbe Richtung zeigt wie die Gerade, ansonsten PI.

angle

public double angle(XBaseline l)
Liefert den Winkel, den das Linienobjekt mit dem Linienobjekt l bildet. Dabei ist nicht relevant, ob sich die Objekte schneiden. Der Winkel wird in positiver Richtung (entgegen dem Uhrzeigersinn) von this aus nach l gemessen und kann somit größer als PI sein.
Parameters:
l - Basline-Objekt, mit dem der Winkel berechnet wird
Returns:
Winkel

getPointInLineDirection

public final XPoint getPointInLineDirection(XPoint start,
                                            double length)
Liefert den Punkt, der von start aus genau length entfernt in Richtung der Geraden liegt.
Parameters:
start - Startpunkt
length - Entfernung

calculatePoint

public XPoint calculatePoint(double x)
Berechnet den Punkt auf der Geraden, der die x-Koordinate x besitzt.
Parameters:
x - X-Koordinate
Returns:
Punkt auf der Gerade

vertical

public boolean vertical()
Liefert true, falls die Gerade vertikal ist.
Returns:
true, falls vertikal

horizontal

public boolean horizontal()
Liefert true, falls die Gerade horizontal ist.
Returns:
true, falls horizontal

parallel

public boolean parallel(XBaseline l)
Liefert true, falls die beiden Geraden parallel sind.
Parameters:
l - zu vergleichende Gerade
Returns:
true, falls parallel

orientation

public byte orientation(XPoint p)
Testet, ob der Punkt p auf der rechten oder linken Seite der Geraden liegt.
Parameters:
p - Testpunkt
Returns:
Lagekonstante
See Also:
XPoint.ORIENTATION_LEFT, XPoint.ORIENTATION_RIGHT, XPoint.ORIENTATION_COLLINEAR

liesOn

public boolean liesOn(XPoint q)
Liefert true, falls p auf der Geraden liegt.
Parameters:
p - zu testender Punkt
Returns:
true, falls p auf der Geraden

orthogonal

public XLine orthogonal(XPoint point)
Berechnet die orthogonale Gerade durch den Eingabepunkt.
Parameters:
point -  
Returns:
die orthogonale Gerade

orthogonal

public XLine orthogonal()
Berechnet die orthogonale Gerade.
Returns:
orthogonale Gerade

plumb

public XPoint plumb(XPoint point)
Fällt das Lot vom Eingabepunkt auf die Gerade und gibt den Schnittpunkt zurück. Falls kein Schnittpunkt existiert, wird null zurückgegeben. (Funktioniert auch mit XSegment und XRay.)
Parameters:
point - Punkt von dem aus Lot gefällt werden soll
Returns:
Schnittpunkt

plumbTo

public XPoint plumbTo(XPoint p,
                      XBaseline l)
Bestimmt die Gerade senkrecht zu dieser durch den Punkt p und gibt deren Schnittpunkt mit dem Linienobjekt l zurück.
Parameters:
p - Punkt, durch den Lot definiert wird
l - Gerade, mir der geschnitten werden soll
Returns:
Schnittpunkt des Lotes durch p auf this mit l

closestPoint

public XPoint closestPoint(XPoint point)
Liefert den zu point nächsten Punkt auf dem Rand. (Funktioniert auch mit XSegment und XRay.)
Parameters:
point - Punkt
Returns:
nächster Punkt auf dem Rand

incident

public boolean incident(XBaseline b)
Liefert true, falls sich dieses Objekt und b in einem Randpunkt berühren.
Parameters:
b - XBaseline-Objekt, mit dem Berührung getestet wird.
Returns:
true, falls die Objekte inzidieren

getDirectionVector

public XPoint getDirectionVector()
Liefert einen Richtungsvektor der XBaseline. Die Länge ist ebenfalls abhängig von source und target.
Returns:
ein Richtungsvektor in Richtung des XBaselines

similarDirection

public boolean similarDirection(XBaseline l)
Liefert true, wenn l und dieses XBasline-Objekt ungefähr in dieselbe Richtung zeigen, also die Geraden höchstens einen Winkel von 90° aufspannen (gerichtet!).
Parameters:
l - XBaseline, mit der verglichen werden soll
Returns:
true, falls beide Objekte in dieselbe Richtung zeigen

vector

public XPoint vector(boolean forward,
                     boolean orthogonal,
                     boolean normalize)
Liefert einen (normalisierten) Vektor auf oder orthogonal zum Linienobjekt.
Parameters:
forward - falls true: Vektor ist in Richtung des Linienobjektes orientiert bzw. nach links, falls orthogonal. falls false: Vektor ist entgegen der Richtung des Linienobjektes bzw. rechts (falls orthogonal) orientiert
orthogonal - falls true, wird ein orthogonaler, ansonsten ein Vektor auf dem Linienobjekt, zurückgegeben
normalize - falls true, wird der Vektor normalisiert, ansonsten hat er die Länge des Linienobjektes

getInfiniteBoundIndex

public static final int getInfiniteBoundIndex(XPoint p)
Liefert den Index des Segmentes der Bounding Box, auf der der Punkt p liegt oder -1, falls er nicht auf dem Rand der Bounding Box liegt.
Parameters:
p - Punkt
Returns:
Index

getInfinitePoint

public static final XPoint getInfinitePoint(int i)
Liefert den Eckpunkt Nummer i der unendlichen Bounding Box.
Parameters:
i - Index: 0 links unten, 1 rechts unten, 2 rechts oben, 3 links oben

copyInfiniteChain

public static final void copyInfiniteChain(XPoint p1,
                                           XPoint p2,
                                           XPoint[] array,
                                           int start)
Kopiert die Kette von Punkten der unendlichen Boundingbox zwischen p1 und p2 in das Array array ab Index start. Es werden maximal 6 Einträge benutzt.
Parameters:
p1,p2 - Punkte auf der Boundingbox
array - Feld, indem Kettenpunkte gespeichert werden sollen
start - Index, ab dem im Array gespeichert werden sollte

getInfiniteBounds

public static final XPolygon getInfiniteBounds()
Liefert die Bounding-Box als XPolygon.
Returns:
Bounding-Box

getInfiniteEndPoint

public XPoint getInfiniteEndPoint(boolean forward)
Liefert einen (eventuell unendlichen) Endpunkt des Linienobjektes. unendlich heißt in diesem Zusammenhang den Schnittpunkt mit der Bounding Box (INFINITE_BOUND). Ist forward==true, wird der Schnitt in Vorwärtsrichtung berechnet bzw. target() zurückgegeben, ist forward==false, wird der Schnitt in Rückwärtsrichtung berechnet bzw. source() zurückgegeben.
Parameters:
forward - Richtung
Returns:
Endpunkt

getInfiniteSegment

public XSegment getInfiniteSegment()
Liefert das 'unendliche Segment' zu diesem Linienobjekt. Bei Segmenten wird das Segment zurückgegeben, bei Strahlen und Geraden das Schnittsegment mit der Bounding Box.
Returns:
'unendliches Segment'

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.

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.

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
start - 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).