Я хочу узнать, лежит ли точка внутри прямоугольника или нет. Прямоугольник можно ориентировать любым способом, и его не требуется выравнивать по оси.
Один из методов, который я мог придумать, состоял в том, чтобы повернуть прямоугольник и координаты точки, чтобы выровнять ось прямоугольника, а затем просто проверить координаты точки, лежат ли они в пределах прямоугольника или нет.
Вышеупомянутый метод требует вращения и, следовательно, операций с плавающей запятой. Есть ли другой эффективный способ сделать это?
Ответы:
Как изображен прямоугольник? Три очка? Четыре очка? Точка, стороны и угол? Два очка и сторона? Что-то другое? Не зная этого, любые попытки ответить на ваш вопрос будут иметь чисто академическое значение.
В любом случае для любого выпуклого многоугольника (включая прямоугольник) проверка очень проста: проверьте каждое ребро многоугольника, предполагая, что каждое ребро ориентировано против часовой стрелки, и проверьте, лежит ли точка слева. от края (слева). -ручная полуплоскость). Если все ребра проходят проверку - точка внутри. Если хоть один выйдет из строя - дело во внешнем.
Чтобы проверить,
(xp, yp)
лежит ли точка слева от края(x1, y1) - (x2, y2)
, вам просто нужно вычислитьЕсли
D > 0
, точка находится слева. ЕслиD < 0
, точка находится справа. ЕслиD = 0
, то точка находится на линии.Предыдущая версия этого ответа описывала, казалось бы, другую версию левого теста (см. Ниже). Но легко показать, что он вычисляет то же значение.
... Чтобы проверить,
(xp, yp)
лежит ли точка на левой стороне кромки(x1, y1) - (x2, y2)
, необходимо построить линейное уравнение для линии, содержащей кромку. Уравнение выглядит следующим образомгде
Теперь все, что вам нужно сделать, это вычислить
Если
D > 0
, точка находится слева. ЕслиD < 0
, точка находится справа. ЕслиD = 0
, то точка находится на линии.Однако этот тест, опять же, работает для любого выпуклого многоугольника, а это означает, что он может быть слишком общим для прямоугольника. Прямоугольник может позволить более простой тест ... Например, в прямоугольнике (или в любом другом параллелограмме) значения
A
иB
имеют одинаковую величину, но разные знаки для противоположных (т. Е. Параллельных) краев, что может быть использовано для упрощения теста .источник
A'
иB'
могут быть заданы какA'=B
иB'=-A
. 3. Нет смысла вычислятьA xp + B yp
оба ребра, поэтому объедините их в один тест. Тогда ваш тест на нахождение в прямоугольнике станет(v_min < A xp + B yp < v_max) && ( w_min < B xp - A yp < w_max )
.v_min
и т. Д.?v_min
- минимальное значениеA x + B y
для всех значений внутри прямоугольника (которое является минимальным значением при оценке по углам).v_max
- соответствующий максимум. Этиw_?
значения одинаковы, ноBx - A y
.Предполагая, что прямоугольник представлен тремя точками A, B, C с перпендикулярами AB и BC, вам нужно только проверить проекции точки запроса M на AB и BC:
AB
это вектор AB, с координатами (Bx-Ax, Ay По-), иdot(U,V)
является скалярным произведением векторов U и V:Ux*Vx+Uy*Vy
.Обновить . Давайте рассмотрим пример, чтобы проиллюстрировать это: A (5,0) B (0,2) C (1,5) и D (6,3). Из координат точки получаем AB = (- 5,2), BC = (1,3), точка (AB, AB) = 29, точка (BC, BC) = 10.
Для точки запроса M (4,2) у нас AM = (- 1,2), BM = (4,0), точка (AB, AM) = 9, точка (BC, BM) = 4. М находится внутри прямоугольника.
Для точки запроса P (6,1) имеем AP = (1,1), BP = (6, -1), точка (AB, AP) = - 3, точка (BC, BP) = 3. P не находится внутри прямоугольника, потому что его проекция на сторону AB не находится внутри сегмента AB.
источник
Я позаимствовал из ответа Эрика Бейнвилля:
Что в javascript выглядит так:
например:
тогда:
Вот код для вывода результатов в качестве визуального теста :) http://codepen.io/mattburns/pen/jrrprN
источник
mouseover
событие в своем проекте, поэтому всякий раз, когда указатель мыши находится над точкой, которая должна находиться внутри прямоугольника, вокруг мыши будет отображаться черная круглая точка, а за пределами прямоугольника ничего не должно отображаться. Мне нужна помощь, чтобы заставить его работать, но я очень запутался.mouseover
должно бытьmousemove
, просто опечатка.источник
a
,b
иd
. В то время как три точки являются допустимым способом представления произвольного прямоугольника в теории, на практике это невозможно сделать точно в целочисленных координатах в общем случае. В общем случае получается параллелограмм, который очень близок к прямоугольнику, но все же не является прямоугольником.Я понимаю, что это старая тема, но для тех, кто хочет взглянуть на это с чисто математической точки зрения, есть отличная тема по обмену математическим стеком, здесь:
/math/190111/how-to-check-if-a-point-is-inside-a-rectangle
Изменить: Вдохновленный этой веткой, я собрал простой векторный метод для быстрого определения вашей точки зрения.
Предположим, у вас есть прямоугольник с точками в точках p1 = (x1, y1), p2 = (x2, y2), p3 = (x3, y3) и p4 = (x4, y4), идущий по часовой стрелке. Если точка p = (x, y) лежит внутри прямоугольника, то скалярное произведение (p - p1). (P2 - p1) будет лежать между 0 и | p2 - p1 | ^ 2 и (p - p1). (p4 - p1) будет лежать между 0 и | p4 - p1 | ^ 2. Это эквивалентно проецированию вектора p - p1 по длине и ширине прямоугольника с p1 в качестве начала координат.
Это может иметь больше смысла, если я покажу эквивалентный код:
Вот и все. Это также будет работать для параллелограммов.
источник
Я только что реализовал ответ AnT с помощью c ++. Я использовал этот код, чтобы проверить, находится ли координация пикселей (X, Y) внутри формы или нет.
источник
Если вы не можете решить проблему для прямоугольника, попробуйте разделить ее на более простые. Разделите прямоугольник на 2 треугольника и проверьте, находится ли точка внутри любого из них, как они объясняют здесь.
По сути, вы циклически перебираете края на каждых двух парах линий от точки. Затем используйте кросс-произведение, чтобы проверить, находится ли точка между двумя линиями, используя кросс-произведение. Если это проверено для всех трех точек, то точка находится внутри треугольника. Преимущество этого метода в том, что он не создает ошибок с плавающей запятой, которые возникают, если вы проверяете углы.
источник
Если точка находится внутри прямоугольника. На плоскости. Для математических или геодезических (GPS) координат
Составьте уравнение для каждого l i . Уравнение вроде:
f я (P) = 0.
P - точка. Для точек, принадлежащих l i , уравнение верно.
Итак, мы должны это проверить:
f AB (P) f AB (C)> = 0
f BC (P) f BC (D)> = 0
f CD (P) f CD (A)> = 0
f DA (P) f DA (B)> = 0
Неравенства не являются строгими, поскольку, если точка находится на границе, она также принадлежит прямоугольнику. Если точки на границе не нужны, можно сменить неравенства на строгие. Но пока вы работаете с операциями с плавающей запятой, выбор не имеет значения.
Осталось только получить уравнение для прямой, проходящей через две точки. Это известное линейное уравнение. Запишем это для прямой AB и точки P:
f AB (P) ≡ (x A -x B ) (y P -y B ) - (y A -y B ) (x P -x B )
Проверку можно было бы упростить - пройдемся по прямоугольнику по часовой стрелке - A, B, C, D, A. Тогда все правильные стороны будут справа от линий. Итак, нам не нужно сравнивать со стороной, где находится другая вершина. И нам нужно проверить набор более коротких неравенств:
f AB (P)> = 0
f BC (P)> = 0
f CD (P)> = 0
f DA (P)> = 0
Но это верно для обычного математического (из школьной математики) набора координат, где X находится справа, а Y сверху. А для геодезических координат, которые используются в GPS, где X - вверху, а Y - вправо, мы должны изменить неравенства:
f AB (P) <= 0
f BC (P) <= 0
f CD (P) <= 0
f DA (P) <= 0
Если вы не уверены в направлениях осей, будьте осторожны с этой упрощенной проверкой - проверьте одну точку с известным размещением, если вы выбрали правильные неравенства.
источник
Самый простой способ, который я придумал, - это просто спроецировать точку на ось прямоугольника. Позволь мне объяснить:
Если вы можете получить вектор от центра прямоугольника к верхнему или нижнему краю, а также к левому или правому краю. И у вас также есть вектор от центра прямоугольника до вашей точки, вы можете проецировать эту точку на свои векторы ширины и высоты.
P = точечный вектор, H = вектор высоты, W = вектор ширины
Получите единичный вектор W ', H', разделив векторы на их величину
proj_P, H = P - (P.H ') H' proj_P, W = P - (P.W ') W'
Если я не ошибаюсь, чего я не думаю ... (поправьте меня, если я ошибаюсь), но если величина проекции вашей точки на вектор высоты меньше, чем величина вектора высоты (которая равна половина высоты прямоугольника) и величина проекции вашей точки на вектор ширины равна, тогда у вас есть точка внутри вашего прямоугольника.
Если у вас универсальная система координат, вам, возможно, придется вычислить векторы высоты / ширины / точки с помощью векторного вычитания. Векторные проекции потрясающие! запомни это.
источник
В продолжение мат ответить. нам нужно использовать решение /math/190111/how-to-check-if-a-point-is-inside-a-rectangle/190373#190373, чтобы оно работало
Ниже не работает
0 <= точка (AB, AM) <= точка (AB, AB) && 0 <= точка (BC, BM) <= точка (BC, BC)
Ниже работает
0 <= точка (AB, AM) <= точка (AB, AB) && 0 <= точка (AM, AC) <= точка (AC, AC)
вы проверяете, вставив ниже в консоль javascript // Решение Javascript для того же
источник