2013-03-20 2 views
7

Название говорит все, Ive искал вокруг и не мог найти ничего, что было бы прямо и точно. Как бы взять строку с точками (x1, y1) & (x2, y2) и проверить ее пересечение между прямоугольником (xR, yR)? Я видел в пакете Line2D, что есть некоторые методы пересечения, но не уверен, как все это установить. Может ли кто-нибудь показать мне правильный способ настроить его для проверки пересечения (столкновения)?Как проверить пересечение между линией и прямоугольником?

+0

* "Спасибо Dan" * Не включайте в себя сиги. в вопросах. Столкновение объектов 'Area' можно сделать относительно легко. Вот [пример] (http://stackoverflow.com/a/14575043/418556). –

+0

Предупреждение. Поскольку вы можете в общих чертах использовать класс области Java для обнаружения столкновения/пересечения почти для всех 2D-графических объектов Java, возникает соблазн подумать, что он может использоваться для ВСЕХ графических объектов. Но этого не может быть - потому что, если вы построите область для «линии», область самой линии начинает пуста. Следовательно, это пересечение с любой другой областью всегда возвращает пустое - даже если линия пересекает вашу другую область. Вы были предупреждены! –

ответ

5

Использование доступных классов из API 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)); 

Что это не говорит вам, где ...

+0

Спасибо, мне не нужно знать, где, просто нужно знать, если они делают или не делают. –

4

Прямоугольник 4 линии. Вы можете вычислить пересечение между вашей линией и четырьмя строками прямоугольника.

Учитывая уравнения двух линий, они пересекаются, когда x и y равны.

у = m1x + b1 у = м2- + b2

решения уравнения вы должны получить:

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

Обратите внимание, что если m1 == m2, линии параллельны и никогда не пересекаются, следите за тем, чтобы в этом случае делилось на 0.

Затем, поскольку вы имеете дело с сегментами, превышающими бесконечные линии, проверьте, не пересекается ли пересечение внутри ваших сегментов (проверьте, не совпадают ли и X, и Y внутри границ каждого сегмента).

+0

+1 только потому, что он выглядит так хорошо – MadProgrammer

+0

Спасибо :) Поиграйте со своим ответом :) Спасибо –

+0

Это немного сложнее, чем это - представление y = mx + c не может обрабатывать вертикальные линии. – aaronsnoswell

4

Возвращает ноль, если линии не пересекаются. Изменен некоторый код c другого ответа на аналогичный вопрос, чтобы сделать его Java. Не потрудились посмотреть, как и почему это работает, но выполняет ли я работу, в которой я нуждался.

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

Только что проверено. Работает. – Danon