2013-03-20 40 views
7

Tytuł mówi wszystko, szukałem w pobliżu i nie mogłem znaleźć niczego, co było proste i na temat. Jak wziąłbym linię z punktami (x1, y1) & (x2, y2) i sprawdziłbym jej przecięcie prostokąta (xR, yR)? Widziałem w pakiecie Line2D, że istnieją pewne metody przecięcia, ale nie wiem, jak to wszystko ustawić. Czy ktoś może pokazać mi prawidłowy sposób ustawienia w celu sprawdzenia przecięcia (kolizji)?Jak sprawdzić przecięcie linii i prostokąta?

+0

* "Dzięki Dan" * Nie uwzględniaj znaków sigs. w pytaniach. Kolizję obiektów 'Area' można wykonać stosunkowo łatwo. Oto [przykład] (http://stackoverflow.com/a/14575043/418556). –

+0

Ostrzeżenie. Ponieważ można ogólnie używać klasy obszaru Java do wykrywania kolizji/skrzyżowań dla prawie wszystkich obiektów graficznych Java 2D, kusi ona, że ​​może być używana dla WSZYSTKICH obiektów graficznych. Ale nie może być - ponieważ jeśli skonstruujesz obszar dla "linii", obszar samej linii zaczyna być pusty. Stąd jest to przecięcie z jakimkolwiek innym obszarem, który zawsze wraca pusty - nawet jeśli linia przechodzi w inny obszar. Zostałeś ostrzeżony! –

Odpowiedz

5

Korzystanie z dostępnych klas z interfejsu API grafiki 2D.

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)); 

Co to nie powiem, gdzie jest ...

+0

Dziękuję, nie muszę wiedzieć, gdzie, wystarczy wiedzieć, czy robią lub nie. –

4

Prostokąt to 4 linie. Można obliczyć przecięcie między linią a 4 liniami prostokąta.

biorąc pod uwagę równania dwóch linii, przecinają się, gdy x i y są równe.

y = m1x + b1 y = M2x + b2

rozwiązując równanie należy uzyskać:

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

Należy zauważyć, że jeśli m1 == m2, linie są równoległe i nigdy się nie przecinają, w tym przypadku należy zwrócić uwagę na podzielone przez 0.

Następnie, skoro masz do czynienia z segmenterami ratter niż z nieskończonymi liniami, sprawdź, czy przecięcie nie występuje w obrębie twoich segmentów (sprawdź, czy oba X i Y znajdują się w granicach każdego segmentu).

+0

+1 tylko dlatego, że wygląda tak dobrze – MadProgrammer

+0

Dziękuję :) Chory pogawędzić z odpowiedzią :) Dzięki –

+0

To trochę trudniejsze niż to - reprezentacja y = mx + c nie może obsłużyć pionowych linii. – aaronsnoswell

4

zwraca NULL jeśli linie nie przecinają się. Zmodyfikowali trochę kodu c z innej odpowiedzi na podobne pytanie, aby uczynić ją Javą. Nie zastanawiałem się, jak/dlaczego to działa, ale wykonuje pracę, której potrzebowałem.

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

Właśnie sprawdziłem. Prace. – Danon