2016-06-21 16 views
2

Diese beiden Zeilen sind effektiv Punkte, aber wenn ich die LineIntersects-Methode ausführen, bekomme ich "True" als Rückgabewert, weiß jemand, was ist los oder ist das ein Fehler? Hier ist die documentation link und hier ist die source, keine warnen über Sonderfälle, wenn dies fehlschlagen könnte.Java Line2D ZeilenIntersect gebrochen

import java.awt.geom.*; 
public class Test { 
    public static void main(String[] args) { 

    //        x1, y1, x2, y2 
    Line2D l1 = new Line2D.Double(1.0, 1.0, 1.0, 1.0); 
    Line2D l2 = new Line2D.Double(2.0, 2.0, 2.0, 2.0); 

    System.out.println(l1.intersectsLine(l2)); // true 

    } 
} 

FYI renne ich java version „1.8.0_74“

Antwort

2

The Oracle Java test uses cross products, um zu bestimmen, ob jedes Segment Endpunkte die unendliche Linie spreizen, die das andere Segment in eingebettet ist. Wenn das wahr ist, dann sind die Linien sagte sich zu kreuzen. Das Problem besteht darin, dass die Kreuzprodukte für übereinstimmende Endpunkte auf Null degenerieren, und die "spreiztenden" Tests werden alle wahr, wenn die zu prüfenden Punkte die Linie berühren, dh wenn das Kreuzprodukt Null ist.

Daher geben zwei als Eingabe bereitgestellte Punkte immer wahr zurück.

Die geometrische Interpretation ist, dass eine "Linie", die durch zwei zusammenfallende Punkte definiert ist, immer ist, die von einem anderen Paar von Punkten gespreizt wird. Daher haben zwei Linien mit der Länge Null einen Endpunkt, der sich überbrückt.

Dies ist vielleicht nicht intuitiv, aber es ist konsistent. Viele geometrische Algorithmen machen skurrile Dinge um Entartungen herum. Wenn Sie dieses Verhalten nicht mögen, wickeln Sie die Funktion um und geben Sie zurück, was Sie brauchen.

+0

Außerdem akzeptiert die Line2D-Klasse von Java "Liniensegmente", die definitionsgemäß aus zwei verschiedenen Punkten gebildet werden. Obwohl ich immer noch denke, dass Java einen schlampigen Job gemacht hat, um diesen Randfall durchkommen zu lassen. –

+0

@ will.fiset Wirklich alles, was sie falsch gemacht haben, konnte undefiniertes Verhalten für entartete Segmente nicht dokumentieren. Exakte Fließkomma-Vergleiche sind einfach nutzlos, und jede Art von Epsilon-basierten Berechnungen ist ziemlich teuer und unwahrscheinlich, die meisten Benutzer zu helfen. – Gene