2013-03-20 3 views
7

Der Titel sagt alles, ich habe gesucht und konnte nichts finden, das gerade und auf den Punkt war. Wie würde ich eine Linie mit Punkten (x1, y1) & (x2, y2) nehmen und ihren Schnittpunkt zwischen einem Rechteck (xR, yR) prüfen? Ich sah im Line2D-Paket, dass es einige Schnittmethoden gab, aber nicht sicher, wie man alles aufbaut. Kann mir jemand einen korrekten Weg zeigen, um eine Kreuzung zu finden (Kollision)?Wie überprüft man den Schnittpunkt zwischen einer Linie und einem Rechteck?

+0

* "Danke Dan" * Keine Sigs. in Fragen. Kollisionen zwischen "Area" -Objekten können relativ einfach durchgeführt werden. Hier ist [ein Beispiel] (http://stackoverflow.com/a/14575043/418556). –

+0

Warnung. Da Sie die Java-Area-Klasse allgemein für die Kollisions-/Kreuzungsdetektion für fast alle Java-2D-Grafikobjekte verwenden können, ist es verlockend anzunehmen, dass sie für ALLE grafischen Objekte verwendet werden kann. Aber es kann nicht sein - denn wenn Sie einen Bereich für eine 'Linie' konstruieren, beginnt der Bereich der Linie selbst leer. Daher ist die Schnittmenge mit einem anderen Bereich immer leer - auch wenn die Linie in den anderen Bereich übergeht. Du wurdest gewarnt! –

Antwort

5

Verwenden Sie die verfügbaren Klassen aus der 2D-Grafik-API.

Rectangle r1 = new Rectangle(100, 100, 100, 100); 
Line2D l1 = new Line2D.Float(0, 200, 200, 0); 
System.out.println("l1.intsects(r1) = " + l1.intersects(r1)); 

Was Ihnen nicht sagen, ist, wo ...

+0

Danke, ich brauche nicht zu wissen, wo, muss nur wissen, ob sie tun oder nicht. –

4

Ein Rechteck ist 4 Zeilen. Sie könnten den Schnittpunkt zwischen Ihrer Linie und den 4 Linien des Rechtecks ​​berechnen.

die Gleichungen von zwei Linien, würden sie schneiden, wenn x und y gleich sind.

y = M1X + b1 y = m2x + b2

Lösung der Gleichung sollten Sie:

x = b2 - b1/(m1 - m2);

Beachten Sie, dass, wenn m1 == m2, die Linien parallel sind und sich niemals schneiden, achten Sie in diesem Fall auf die Division durch 0.

Dann, da Sie Segmente ratter als unendliche Linien beschäftigen, überprüfen Sie, ob der Schnittpunkt innerhalb Ihrer Segmente fällt (überprüfen Sie, ob X und Y innerhalb der Grenzen jedes Segments sind).

+0

+1, nur weil es so gut aussieht – MadProgrammer

+0

Danke :) Ill spielen mit Ihrer Antwort :) Danke –

+0

Es ist ein wenig komplizierter als das - die y = mx + c Darstellung kann nicht mit vertikalen Linien umgehen. – aaronsnoswell

4

Returns null, wenn Linien nicht schneiden. Einige C-Code aus einer anderen Antwort auf ähnliche Frage geändert, um es Java zu machen. Ich habe mir nicht die Mühe gemacht zu sehen, wie/warum es funktioniert, aber ich mache den Job, für den ich es brauchte.

static Point get_line_intersection(Line2D.Double pLine1, Line2D.Double pLine2) 
{ 
    Point 
     result = null; 

    double 
     s1_x = pLine1.x2 - pLine1.x1, 
     s1_y = pLine1.y2 - pLine1.y1, 

     s2_x = pLine2.x2 - pLine2.x1, 
     s2_y = pLine2.y2 - pLine2.y1, 

     s = (-s1_y * (pLine1.x1 - pLine2.x1) + s1_x * (pLine1.y1 - pLine2.y1))/(-s2_x * s1_y + s1_x * s2_y), 
     t = (s2_x * (pLine1.y1 - pLine2.y1) - s2_y * (pLine1.x1 - pLine2.x1))/(-s2_x * s1_y + s1_x * s2_y); 

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
    { 
     // Collision detected 
     result = new Point(
      (int) (pLine1.x1 + (t * s1_x)), 
      (int) (pLine1.y1 + (t * s1_y))); 
    } // end if 

    return result; 
} 
+0

Nur überprüft. Funktioniert. – Danon

Verwandte Themen