Позиционирование точки внутри прямоугольника только с двумя известными вершинами - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над виджетом js и столкнулся с проблемой позиционирования, которую, похоже, не могу решить с помощью моих ограниченных знаний геометрии или с помощью Википедии / Google.

У меня есть четырехугольный прямоугольник, который расположен под углом. Я знаю его две противоположные вершины и соотношение ширина / высота . И на этом есть точка, координаты которой я тоже знаю. Мне нужно найти, как далеко (в% s от ширины / высоты) эта точка от сторон прямоугольника. Возможно ли это сделать? enter image description here

1 Ответ

1 голос
/ 14 апреля 2020

Имея два угла P1 = (x1,y1) и P2 = (x2,y2) и точку Q, вы можете найти длину диагонали

dx = (x2 - x1)
dy = (y2 - y1) 
dlen = sqrt(dx^2 + dy^2)

и вектор направления единицы измерения

dx = dx / dlen
dy = dy / dlen

и центр прямоугольника

cx = x1 + dx/2
cy = y1 + dy/2

Ширина и высота (с известным отношением r = w/h)

w = dlen / sqrt(1 + r^2)
h = w / r 

Теперь нам нужно направление стороны длины w. Обратите внимание, что данная информация не позволяет выбрать точную ориентацию прямоугольника из двух возможных случаев.

Угол между диагональю и стороной

sina = r / sqrt(1 + r^2)
cosa = 1 / sqrt(1 + r^2)

Вектор направления стороны

wx = dx * cosa - dy * sina
wy = dx * sina  + dy * cosa

и для второй ориентации

wx' = dx * cosa + dy * sina
wy' = -dx * sina + dy * cosa

Второй боковой вектор

hx = -wy
hy = wx

Теперь мы можем найти длину проекции точки p на стороны W и H, используя скалярное произведение

qx = q.x - x1
qy = q.y - y1

qw = qx * wx + qy * wy
qh = qx * hx + qy * hy

Последние значения являются координатами в W-H основе, поэтому значение qw изменяется от 0 для точек «слева» до w для точек «справа». Вы можете разделить эти значения на w и h, чтобы получить процентные значения.

Еще раз отметьте - есть два возможных прямоугольника и соответственно две позиции точки Q

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...