Bewertungsphase : 2. Bsp (Line)

  • Also ich hab das ganze jetzt abgegeben
    und nur 16/20 Punkte bekommen und hab die Methode genommen


    return Line2D.linesIntersect(X1, Y1, X2, Y2, X3, Y3, X4, Y4);


    Output Paare: (vielleicht könnt ihr ja eure posten oder mir sagen was ich falsch habe)


    IOPaar Id Output Ergebnis
    1 true Line ( 0.0 \ 0.0 - 5.0 \ 5.0 ) OK
    2 false Line ( 0.0 \ 0.0 - 0.0 \ 8.0 ) FALSCH
    3 false Line ( 2.1 \ 5.1 - 5.9 \ 5.2 ) OK
    4 ? OK
    5 false Line ( -2.0 \ -2.0 - -2.0 \ 2.0 ) OK

  • Häng bei der auch etwas...kann mir wer sagen was ich falsch mache?
    Ich komm mit den ganzen if und else nicht zurecht, denn beim Kompilieren will er noch ein return nach den letzten else und dann if...
    Here it is:

    public static boolean linesIntersect(double X1, double Y1, double X2, double Y2,
    double X3, double Y3, double X4, double Y4){

    boolean is_parallel = false;
    boolean is_vertical_l1 = false;
    boolean is_vertical_l2 = false;
    double k1;
    double k2;
    double d1;
    double d2;
    double sx; // x Koordinate des Schnittpunkts
    double sy; // y Koordinate des Schnittpunkts
    is_vertical_l2 = (X1 == X2);
    is_vertical_l1 = (X3 == X4);
    if (is_vertical_l1 && is_vertical_l2) {
    boolean linesIntersects=false;
    return false;
    }
    // berechnen des schnittpunktes
    // verwendung der formel: kx+d=y
    // wobei k=Anstieg= (y2-y1) / (x2-x1)
    // d = Distanz des Schnittpunktes mit der y-Achse zum 0-Punkt
    // d = y-kx
    if (is_vertical_l1) {
    k2 = (Y4 - Y3) / (X4 - X3);
    d2 = Y3 - (k2 * X3);
    sx = X3;
    sy = k2 * sx + d2;
    return true;
    } else if (is_vertical_l2) {
    k1 = (Y2 - Y1) / (X2 - X1);
    d1 = Y1 - (k1 * X1);
    sx = X1;
    sy = k1 * sx + d1;
    return true;
    } else if (is_parallel){
    k1 = (Y2 - Y1) / (X2 - X1);
    k2 = (Y4 - Y3) / (X4 - X3);
    if (k1 == k2) {
    return false; // parallel
    }
    }

    }




    ???

    Und wie berechne ich, wenn sich die Linie außerhalb der Länge der Linien schneidet??

  • ich schätze einmal indem du überprüfst ob der Schnittpunkt innerhalb deltaX oder deltaY liegt.


    Edit:


    naja halt so irgendwie: x1<=Sx<=x2 und umgekehrt falls die koordinaten anders eingegeben werden.

  • So ich poste jetzt mal den ganze Sourcecode... kann doch nicht sein




    und noch die testen.java




    Das ganze ergibt 16 Punkte.. sagt mir warum es nicht 20 sind


    HIer nochmal die Output Paare:


    IOPaar Id Output Ergebnis
    1 true Line ( 0.0 \ 0.0 - 5.0 \ 5.0 ) OK
    2 false Line ( 0.0 \ 0.0 - 0.0 \ 8.0 ) FALSCH
    3 false Line ( 2.1 \ 5.1 - 5.9 \ 5.2 ) OK
    4 ? OK
    5 false Line ( -2.0 \ -2.0 - -2.0 \ 2.0 ) OK

  • Zitat

    public boolean intersectsLine(Line line_u)
    {
    return line_u.linesIntersect(line_u.getX1(),line_u.getY1(),line_u.getX2(),line_u.getY2(),this.x1,this.y1,this.x2,this.y1);
    }


    es sollte :

    PHP
    1. public boolean intersectsLine(Line line_u)
    2. {
    3. return line_u.linesIntersect(line_u.getX1(),line_u.getY1(),line_u.getX2(),line_u.getY2(),this.x1,this.y1,this.x2,this.y2);
    4. }



    sein !!

  • OMG


    Also ja.. ja ... OMG... da kann man eigentlich nur eins sagen


    DAMN


    es sind immer die Kleinigkeiten.. das mir das nicht aufgefallen ist


    Na ja Programmieren ist das Streben nach Perfektion.....


    :-) wenigstens is das ganze jetzt geklärt.. hab mich massig über die Funktion geärgert und schon meinen eigenen Algorithmus entwickelt gehabt, aber der hat mir natürlich auch nichts geholfen wenn der Aufruf falsch ist :-)


    kann ich da irgendwie meine Punkte wieder bekommen oder fällt das unter Schlampigkeit und Shit happens ?

  • Noch ein paar Fragen:


    Was soll ausgegeben werden wenn mehr als 8 Doubles eingelesen wird ?
    z.B: 1 2 3 4 5 6 7 8 9 10 11 12
    oder 1 2 3 4 5 6 7 8 a f g


    Sollen wir die ersten 8 einlesen und den Rest ignorieren ? Oder sollen wir FALSCHE EINGABE oder ? oder sonstwas ausgeben ?


    Wenn ein Punkt (also 1.0 \ 1.0) auf einer Linie liegt, zählt das als Intersect ? Und wie reagiert die Line2D.linesIntersect(blabla) darauf (dass der Punkt auf der Linie liegt) ?

  • Zitat

    Was soll ausgegeben werden wenn mehr als 8 Doubles eingelesen wird ?
    z.B: 1 2 3 4 5 6 7 8 9 10 11 12
    oder 1 2 3 4 5 6 7 8 a f g


    (Spezi:)
    Bei falschen Eingaben, geben Sie ein "?" gefolgt von einem Zeilenvorschub aus.

    Zitat

    Sollen wir die ersten 8 einlesen und den Rest ignorieren ? Oder sollen wir FALSCHE EINGABE oder ? oder sonstwas ausgeben ?


    Du gibst "?" gefolgt von einem Zv aus ....

    Zitat

    Wenn ein Punkt (also 1.0 \ 1.0) auf einer Linie liegt, zählt das als Intersect ? Und wie reagiert die Line2D.linesIntersect(blabla) darauf (dass der Punkt auf der Linie liegt) ?



    es gibt true aus .. wenn du die Methode Line2D.linesIntersect() benutzt dann muss du keine Sorgen mehr machen..

    Zitat

    Wenn ein Punkt (also 1.0 \ 1.0)


    Eigentlich 1.0 \ 1.0 - 1.0 \ 1.0 .. das ist ein Punkt(? eine Linie ? ) ..
    Wenn du nur 1.0 \ 1.0 hast dann ist ein Falsche eingabe ...

  • Ich hab grad nochmal einen Tutor gefragt, und der hat gesagt dass nur die ersten 8 Eingaben zählen, d.h.: wenn man
    1 2 3 4 5 6 7 8 9 10 eingibt, zählt nur 1 2 3 4 5 6 7 8 9 10


    Alles was nach der achten Eingabe kommt soll ignoriert werden. (egal ob danach ein DataTypeException kommt oder nicht)
    Ich editiere dann jetzt mal meine ArrayIndexOutOfBounds Exception und schau was dann rauskommt wenn ich's einreiche. :D


    Zing, 20/20 Punkte. Wer Hilfe braucht kann mir ne PM oder Email / sonstwas schicken (Ich kann aber nur noch bis einschliesslich morgen antworten, frisch umgezogen, noch kein Internet zuhause :))