Имея два угла 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