Java Programm macht Käse

LeoIV

El Leo
Hallo, ich stehe noch am Anfang meine Programmiertechniken. Ich beschäftige mich neben der Schule ein bisschen mit Java und habe ein Programm geschrieben was nicht tut, was es soll. Ziel ist es im Moment, dass die Konsole überprüft ob ein Punkt auf einer Geraden liegt, das Programm behandelt Geometrie. So wie ich die Punkte gesetzt habe sollte das eigentlich Funktionieren, doch das tut es nicht.

Hier die Klasse "Punkt", die ich nutze um Punkte zu verwalten.

Code:
package dreieckanwendung;
public class Punkt {
    private double zX;
    private double zY;

    //Konstruktor mit Parameter
    public Punkt(double pX, double pY){
        zX=pX;
        zY=pY;
    }

    //Konstruktor ohne Parameter
    public Punkt(){
        zX=0;
        zY=0;
    }

    // Getter-Methoden
    public double getX(){
        return zX;
    }
    public double getY(){
        return zY;
    }

    // Setter-Methoden
    public void setX(double pX){
        zX=pX;
    }
    public void setY(double pY){
        zY=pY;
    }

    // Andere Methoden distance, isSame, moved
    public double distance(Punkt pPunkt)
    {
        double a,b;
        if(zX>pPunkt.zX)
            a=zX-pPunkt.zX;
        else if (pPunkt.zX>zX)
            a=pPunkt.zX-zX;
        else
            a=0;
        if(zY>pPunkt.zY)
            b=zY-pPunkt.zY;
        else if(pPunkt.zY>zY)
            b=pPunkt.zY-zY;
        else
            b=0;
        return (Math.sqrt((a*a)+(b*b)));
    }
    public boolean isSame(Punkt pPunkt, double pWithin){
        if ((distance(pPunkt))<=pWithin)
            return true;
        else
            return false;
    }
    public Punkt moved(double pXVerschiebung, double pYVerschiebung){
        Punkt pPunkt;
        pPunkt=new Punkt();
        pPunkt.zX=(zX+pXVerschiebung);
        pPunkt.zY=(zY+pYVerschiebung);
        return pPunkt;
    }

}

Die Klasse "Gerade", die sich um Geraden kümmert.

Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dreieckanwendung;

/**
 *
 * @author Leo
 */
public class Gerade {
    private double Steigung;   // Eine Gerade ist definiert durch die Steigung
    private double yAbschnitt; // und den y-Achsen-Abschnitt.

    public Gerade(){           // Standardkonstruktor
        Steigung = 0;
        yAbschnitt = 0;
    }

    // Getter und Setter Methoden

    public Gerade(double pSteigung, double pyAbschnitt){ // Konstruktor mit Parametern
        Steigung = pSteigung;
        yAbschnitt = pyAbschnitt;
    }
    public double getSteigung(){
        return Steigung;
    }
    public double getyAbschnitt(){
        return yAbschnitt;
    }
    public void setViaPoints(Punkt P1, Punkt P2){
        Steigung = ((P2.getY()-P1.getY())/(P2.getX()-P1.getX()));
        yAbschnitt = (P1.getY()-(P1.getX()*(Steigung)));
    }
    public void setSteigung(double pSteigung){
        Steigung = pSteigung;
    }
    public void setyAbschnitt(double pyAbschnitt){
        yAbschnitt = pyAbschnitt;
    }

    public void printFunction(){
        if(yAbschnitt > 0)
            System.out.printf("f(x) = %.2fx+%.2f", Steigung, yAbschnitt);
        else if(yAbschnitt == 0)
            System.out.printf("f(x) = %.2fx", Steigung);
        else
            System.out.printf("f(x) = %.2f%.2f", Steigung, yAbschnitt);
    }
    public Punkt intersection(Gerade pG){ // Schnittpunkt
        Punkt P1;
        P1 = new Punkt();
        P1.setX((yAbschnitt/(pG.Steigung-Steigung))-pG.yAbschnitt);
        P1.setY(Steigung*P1.getX()+yAbschnitt);
        return P1;
    }
    public boolean isPointOn(Punkt P1){ // Ist ein Punkt auf der Geraden?
        Punkt P2;
        P2 = new Punkt(0,yAbschnitt);
        Gerade G1;
        G1 = new Gerade();
        G1.setViaPoints(P1,P2);
        if((G1.Steigung == Steigung) && (G1.yAbschnitt == yAbschnitt))
            return true;
        else
            return false;
    }
    public Gerade orthogTroughPoint(Punkt P1){ //Senkrechte durch einen Punkt
        Gerade G1;
        G1 = new Gerade();
        G1.Steigung = (-1)*(1/Steigung);
        G1.yAbschnitt = (P1.getY()-P1.getX()*(Steigung));
        return G1;
    }
    }

Das Klasse Dreieck, die ich im Moment aber nicht nutze, da sie ohne Probleme läuft :

Code:
package dreieckanwendung;
public class Dreieck {
    //Punkte
    private Punkt hA = new Punkt(), hB= new Punkt(), hC= new Punkt();
    //Seiten
    private double za= hB.distance(hC);
    private double zb= hA.distance(hC);
    private double zc= hA.distance(hB);
    // Konstruktor ohne Parameter
    public Dreieck()
    {
        hA.setX(0);
        hA.setY(0);
        hB.setX(0);
        hB.setY(0);
        hC.setX(0);
        hC.setY(0);
        za= hB.distance(hC);
        zb= hA.distance(hC);
        zc= hA.distance(hB);
    }
    // Konstruktor mit Parameter
    public Dreieck(double pAx, double pAy, double pBx, double pBy, double pCx, double pCy){
        hA.setX(pAx);
        hA.setY(pAy);
        hB.setX(pBx);
        hB.setY(pBy);
        hC.setX(pCx);
        hC.setY(pCy);
        za= hB.distance(hC);
        zb= hA.distance(hC);
        zc= hA.distance(hB);
    }

    // Getter-Funktionen
    public Punkt getA(){
        return hA;
    }
    public Punkt getB(){
        return hB;
    }
    public Punkt getC(){
        return hC;
    }

    // Setter-Funktionen
    public void setA(double pAx, double pAy){
        hA.setX(pAx);
        hA.setY(pAy);
    }
    public void setB(double pBx, double pBy){
        hB.setX(pBx);
        hB.setY(pBy);
    }
    public void setC(double pCx, double pCy){
        hB.setX(pCx);
        hB.setY(pCy);
    }

    /* Andere Methoden: umfang, flächeninhalt, lower left, upper Right
                        moved, zoomed ( vom Nullpunkt), zoomed mit beliebigem (mit beliebigem Streckzentrum)*/
    public double umfang(){
        return (za+zb+zc);
    }
    public double flaecheninhalt(){ //Formel von Heron
        return ((1/4)*(Math.sqrt((za+zb+zc)*(za+zb-zc)*(zb+zc-za)*(zc+za-zb))));
    }

    public Punkt lowerLeft(){
        Punkt lPunkt;
        lPunkt = new Punkt();
        if(hA.getX()<hB.getX())
            if (hA.getX()<hC.getX())
                lPunkt.setX(hA.getX());
            else
                lPunkt.setX(hC.getX());
        else
            if(hB.getX()<hC.getX())
                lPunkt.setX(hB.getX());
            else
                lPunkt.setX(hC.getX());
        if(hA.getY()<hB.getY())
            if (hA.getY()<hC.getY())
                lPunkt.setY(hA.getY());
            else
                lPunkt.setY(hC.getY());
        else
            if(hB.getY()<hC.getY())
                lPunkt.setY(hB.getY());
            else
                lPunkt.setY(hC.getY());
        return lPunkt;
    }

    public Punkt upperRight(){
        Punkt lPunkt;
        lPunkt = new Punkt();
        if(hA.getX()>hB.getX())
            if (hA.getX()>hC.getX())
                lPunkt.setX(hA.getX());
            else
                lPunkt.setX(hC.getX());
        else
            if(hB.getX()>hC.getX())
                lPunkt.setX(hB.getX());
            else
                lPunkt.setX(hC.getX());
        if(hA.getY()>hB.getY())
            if (hA.getY()>hC.getY())
                lPunkt.setY(hA.getY());
            else
                lPunkt.setY(hC.getY());
        else
            if(hB.getY()>hC.getY())
                lPunkt.setY(hB.getY());
            else
                lPunkt.setY(hC.getY());
        return lPunkt;
    }

    public Dreieck moved(double pXVerschiebung, double pYVerschiebung){
        Dreieck lDreieck;
        lDreieck = new Dreieck(0,0,0,0,0,0);
        lDreieck.hA.setX((hA.getX()+pXVerschiebung));
        lDreieck.hA.setY((hA.getY()+pYVerschiebung));

        lDreieck.hB.setX((hB.getX()+pXVerschiebung));
        lDreieck.hB.setY((hB.getY()+pYVerschiebung));

        lDreieck.hC.setX((hC.getX()+pXVerschiebung));
        lDreieck.hC.setY((hC.getY()+pYVerschiebung));
        return lDreieck;
    }

    public Dreieck zoomed(double pFaktor){
        Dreieck lDreieck;
        lDreieck = new Dreieck(0,0,0,0,0,0);

        lDreieck.hA.setX(hA.getX()*pFaktor);
        lDreieck.hA.setY(hA.getY()*pFaktor);

        lDreieck.hB.setX(hB.getX()*pFaktor);
        lDreieck.hB.setY(hB.getY()*pFaktor);

        lDreieck.hC.setX(hC.getX()*pFaktor);
        lDreieck.hC.setY(hC.getY()*pFaktor);

        return lDreieck;
    }

    public Dreieck zoomed(Punkt pZentrum, double pFaktor){
        Dreieck lDreieck;
        lDreieck = new Dreieck(0,0,0,0,0,0);

        lDreieck.hA.setX((pZentrum.getX()+(hA.getX()-pZentrum.getX())*pFaktor));
        lDreieck.hA.setY((pZentrum.getY()+(hA.getY()-pZentrum.getY())*pFaktor));
        
        lDreieck.hB.setX((pZentrum.getX()+(hB.getX()-pZentrum.getX())*pFaktor));
        lDreieck.hB.setY((pZentrum.getY()+(hB.getY()-pZentrum.getY())*pFaktor));
        
        lDreieck.hC.setX((pZentrum.getX()+(hC.getX()-pZentrum.getX())*pFaktor));
        lDreieck.hC.setY((pZentrum.getY()+(hC.getY()-pZentrum.getY())*pFaktor));

        return lDreieck;
    }
}


Das Hauptprogramm (sehr kurz):

Code:
package dreieckanwendung;
public class Main {
    public static void main(String[] args) {
       Gerade G1, G2;
       Punkt P1 = new Punkt(2,-5.36);
       G1 = new Gerade(-1.5,-2.36);
       if (G1.isPointOn(P1))
           System.out.printf("YES%n");
       else
           System.out.printf("DEFAULT%n");
       G2 = new Gerade(6.5,-1.24);
       P1 = G1.intersection(G2);
       System.out.printf("(%.2f|%.2f)%n", P1.getX(), P1.getY());
    }

}

Und schließlich die Konsolenausgabe:
run:
DEFAULT
(0,95|-3,7
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 12 Sekunden)

Der Schnittpunkt stimmt nicht und DEFAULT stimmt auch nicht, da rein mathematisch gesehen, der Punkt auf der Gerade liegt.

Ich nutze NetBeans, gehe in die Stufe 11.

Vielen Dank für alle nützlichen Beiträge im Vorraus und ich hoffe, ich werde Spaß mit diesem Forum haben und ihr mit mir
 
Vorrausgesetzt du hast alles korrekt programmiert, liegt der Fehler in Folgender Zeile:
Java:
if((G1.Steigung == Steigung) && (G1.yAbschnitt == yAbschnitt))
            return true;

Denn Informatik != Mathematik.
Wenn du zwei double-Werte auf Gleichheit überprüfst, musst du mit einer Toleranz-Variable arbeiten.
Java:
double EPS = 0.00000001;
if((Math.abs(G1.Steigung - Steigung) < EPS) && (Math.abs(G1.yAbschnitt - yAbschnitt) < EPS))
            return true;
 
Danke schonmal für die Antwort. Wo liegt der Fehler mit dem Schnittpunkt?
 
Zurück