/*
* Datei: Gerade2D.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Letzte Aenderung: 24.12.2008
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.graphVis.zeichenModi;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
* Implementierung einer Gerade.
*
* @author Lukas K�nig
*/
public class Gerade2D {
/**
* Der St�tzpunkt der Gerade.
*/
private Vektor2D stuetzPunkt;
/**
* Die Richtung der Geraden.
*/
private Vektor2D richtung;
/**
* Konstruktor.
*
* @param stuetz Der St�tzpunkt.
* @param richt Die Richtung.
*/
public Gerade2D(final Vektor2D stuetz, final Vektor2D richt) {
this.stuetzPunkt = new Vektor2D(stuetz);
this.richtung = new Vektor2D(richt);
}
/**
* Konstruktor, der die Gerade als Verl�ngerung einer Strecke erzeugt.
*
* @param s Die Strecke, aus der die Gerade erzeugt werden soll.
*/
public Gerade2D(final Strecke2D s) {
this.stuetzPunkt = new Vektor2D(s.getAnfPkt());
this.richtung = new Vektor2D(s.getEndPkt());
this.richtung.sub(s.getEndPkt());
}
/**
* Berechnet den Schnttpunkt der beiden Geraden this und h.
*
* @param h Die andere Gerade.
*
* @return Der Schnittpunkt von this ung h. Wenn die Geraden parallel
* sind, wird der Mittelpunkt zwischen den St�tzpunkten
* zur�ckgegeben. Als parallel werden Geraden angenommen, bei
* denen
* v1.x * v2.y - v2.x * v1.y > konst
* gilt, mit konst = 0.0001.
*/
public Vektor2D schnPktSpezial(final Gerade2D h) {
final double nullKonst = 0.0001;
final Vektor2D p1 = this.stuetzPunkt;
final Vektor2D v1 = this.richtung;
final Vektor2D p2 = h.stuetzPunkt;
final Vektor2D v2 = h.richtung;
Vektor2D zwisch;
// Der Schnittpunkt der Geraden.
Vektor2D q = new Vektor2D(p1);
q.add(p2);
q.div(2);
if (v1.distanz(Vektor2D.NULL_VEKTOR) < nullKonst
|| v2.distanz(Vektor2D.NULL_VEKTOR) < nullKonst
|| Double.isNaN(v1.x) || Double.isNaN(v1.y)
|| Double.isNaN(v2.x) || Double.isNaN(v2.y)
|| Double.isNaN(p1.x) || Double.isNaN(p1.y)
|| Double.isNaN(p2.x) || Double.isNaN(p2.y)
) {
if (Double.isNaN(p1.x) || Double.isNaN(p1.y)) {
q = new Vektor2D(p2);
}
if (Double.isNaN(p2.x) || Double.isNaN(p2.y)) {
q = new Vektor2D(p1);
}
} else {
zwisch = this.schnPkt(h);
if (zwisch != null) {
q = zwisch;
}
}
if (Double.isNaN(q.x) || Double.isNaN(q.y)) {
throw new RuntimeException("Geradenschnittpunkt nicht berechnet: "
+ p1 + " | " + p2);
}
return q;
}
/**
* Gibt den Schnittpunkt zweier Geraden zur�ck. Wenn sie sich nicht
* schneiden oder ein und dieselbe Gerade sind, wird <code>null</code>
* zur�ckgegeben.
*
* @param h Die andere Gerade.
* @return Schnittpunkt der Geraden oder <code>null</code>.
*/
public Vektor2D schnPkt(final Gerade2D h) {
double t;
double div;
final double nullKonst = 0.0001;
Vektor2D q = null;
final Vektor2D p1 = this.stuetzPunkt;
final Vektor2D v1 = this.richtung;
final Vektor2D p2 = h.stuetzPunkt;
final Vektor2D v2 = h.richtung;
t = v1.y * (p2.x - p1.x) - v1.x * (p2.y - p1.y);
div = v1.x * v2.y - v2.x * v1.y;
if (Math.abs(div) > nullKonst) {
t /= div;
q = new Vektor2D(v2);
q.mult(t);
q.add(p2);
}
return q;
}
/**
* @return Returns the stuetzPunkt.
*/
public Vektor2D getStuetzPunkt() {
return this.stuetzPunkt;
}
/**
* @return Returns the richtung.
*/
public Vektor2D getRichtung() {
return this.richtung;
}
}