Package fmg.fmg8.graphVis.zeichenModi

Source Code of fmg.fmg8.graphVis.zeichenModi.Gerade2D

/*
* 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;
    }
}
TOP

Related Classes of fmg.fmg8.graphVis.zeichenModi.Gerade2D

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.