Найти тему
лишние мысли

Попадает ли точка в прямоугольник?

Возникла небольшая задачка: на плоскости заданы точка и прямоугольник. Требуется определить, попадает ли точка в прямоугольник.

Прямоугольник - и точка!
Прямоугольник - и точка!

Ни для кого не секрет, что задача эта решена на сто рядов самыми различными способами, поэтому вряд ли я предложу что-то новое. Но сам подход мне показался любопытным.

Итак. Когда говорят, что заданы точка и прямоугольник, обычно имеют в виду, что на плоскости есть система координат, в которой известны координаты точки и координаты вершин прямоугольника:

Эта картинка, в отличие от предыдущей, богата на подробности.
Эта картинка, в отличие от предыдущей, богата на подробности.

Точка A имеет координаты: (x, y)

Вершины прямоугольника P имеют координаты:
(x1, y1)
(x2, y2)
(x3, y3)
(x4, y4)

А дальше начинается небольшая хитрость. Если присмотреться, то две смежные стороны прямоугольника P можно выбрать в качестве новой системы координат O'X'Y'. В ней прямоугольник превратится в единичный квадрат, а принадлежность точки единичному квадрату проверить легко.

Две системы координат и радиус-вектор точки А в системе O'X'Y'.
Две системы координат и радиус-вектор точки А в системе O'X'Y'.

Осталось только выписать формулы перехода от системы координат OXY к системе координат O'X'Y'. Для этого возьмём формулы перехода O'X'Y' OXY и обратим их.

Это сделать легко. Действительно, если некая точка имеет в системе координат O'X'Y' координаты (x', y'), то в системе координат OXY она будет иметь координаты:

x = (x3 − x2) ∙ x' + (x1 − x2) ∙ y' + x2
y = (y3 − y2) ∙ x' + (y1 − y2) ∙ y' + y2

Выражая координаты (x', y') через координаты (x, y) получим:

x' = [ (y1 − y2) ∙ (x − x2) − (x1 − x2) ∙ (y − y2) ] / d
y' = [ −(y3 − y2) ∙ (x − x2) + (x3 − x2) ∙ (y − y2) ] / d
где
d = (x3 − x2) ∙ (y1 − y2) − (x1 − x2) ∙ (y3 − y2)

Тут надо отметить небольшую особенность. Мы специально выбрали перечисление вершин прямоугольника против часовой стрелки - чтобы величина d была неотрицательной.
Мир с точки зрения системы координат O'X'Y'.
Мир с точки зрения системы координат O'X'Y'.

Получили следующий простой критерий. Точка A попадает в прямоугольник P, если выполнены неравенства:

0 ≤ x' ≤ 1
0 ≤ y' ≤ 1

Или, после несложных преобразований:

0 ≤ (y1 − y2) ∙ (x − x2) − (x1 − x2) ∙ (y − y2) ≤ d
0 ≤ (x3 − x2) ∙ (y − y2) − (y3 − y2) ∙ (x − x2) ≤ d

Больше того, этот подход позволяет обобщить эту формулу не только на прямоугольники, но и на параллелограммы. А также выписать критерий для треугольника, если заметить, что треугольник (x1, y1)-(x2, y2)-(x3, y3) в системе координат O'X'Y' имеет вид (0,1)-(0,0)-(1,0):

0 ≤ x'
0 ≤ y'
x' + y' ≤ 1

Или, после несложных преобразований:

0 ≤ (y1 − y2) ∙ (x − x2) − (x1 − x2) ∙ (y − y2)
0 ≤ (x3 − x2) ∙ (y − y2) − (y3 − y2) ∙ (x − x2)
(y1 − y3) ∙ (x − x2) − (x1 − x3) ∙ (y − y2) ≤ d

Таким образом, аффинное преобразование координат позволило решить сразу целый класс однотипных задач.

-5

Наука
7 млн интересуются