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?
Odpowiedz
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 ...
Dziękuję, nie muszę wiedzieć, gdzie, wystarczy wiedzieć, czy robią lub nie. –
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).
+1 tylko dlatego, że wygląda tak dobrze – MadProgrammer
Dziękuję :) Chory pogawędzić z odpowiedzią :) Dzięki –
To trochę trudniejsze niż to - reprezentacja y = mx + c nie może obsłużyć pionowych linii. – aaronsnoswell
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;
}
Właśnie sprawdziłem. Prace. – Danon
* "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). –
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! –