2012-02-03 5 views
2

В C++, в 2D, как я могу найти точку пересечения между лучом (определяемым одной точкой и вектором направления) и прямоугольником (определяемым x, y, w, h) ?Пересечение между лучом и прямоугольником

    ________ 
        |  | 
        |  | 
------------------|  | 
        |________| 

Это не для моделирования на основе кадра, поэтому я не совсем уверен, как решить эту проблему.

ответ

5

Прямоугольник в 2D = 4 отрезка.

Так что ваш вопрос на самом деле: How do I determine whether or not two lines intersect, and if they do, at what x,y point?

Вы вычислить пересечение всех отрезков, а не выбирать замыкает один основанный на |A-Xi|, где A является вектор происхождения, Xi является пересекает точку и || представляет длину вектора (sqrt(A.x*Xi.x + A.y*Xi.y), вам не нужно использовать sqrt(), если вам просто нужно сравнить расстояния и не нужно точное число).

+0

Связанный вопрос тонко отличается; линии не являются отрезками. Кроме того, это, по-видимому, особый случай, когда прямоугольник не под углом w.r.t. основная ось, т. е. это не ♢ – MSalters

+0

@MSalters Возможно, это не точный ответ, который ему нужен, но я думаю, что думать о прямоугольнике как о четырех строках - это, безусловно, путь в 2D (до тех пор, пока ему не нужны внутренние координаты только границы/out intersect point), и это отличное место для его начала. Если у вас есть ссылка на лучшее решение, я буду рад обновить свой ответ. – Vyktor

+0

@MSalters, и если мой словарь является правильным 'line = бесконечный сегмент линии' (или если вы хотите' line segment = строка с границами '), а проверка действительно очень проста: 'if ((((p1.x> = xx) && (p2.x <= xx)) || ((p1.x <= xx) && (p2.x> = xx))) && (((p1.y> = xy) && (p2.y <= xy)) || ((p1.y <= xy) && (p2.y> = xy))) '(Надеюсь, что я правильно понял индексы), где' p1' и 'p2' являются конечными точками прямоугольная линия и 'x' - это точка пересечения. – Vyktor

1

Ваш луч определяется по y=px+q. Определение вашего поля как {R,B,L=R+w,T=B+h}, это означает, что правый край пересекается на y=pR+q; левый край - y=pL+q, нижний - x=(B-q)/p и верхний - x=(T-q)/p.

Чтобы проверить, что эти пересечения имеют сегменты линии, определяющие ваше поле, вам необходимо будет проверить, что R <=x && x <= L и B <= y && y <= T соответственно.

Смежные вопросы