Как найти координаты пересечения двух отрезков зная их концы и угол при пересечении?
У меня есть координаты двух точек. А(1,7) и Б(8, 2). В коде, угол пересечения прямых, из этих точек, будет динамическим от 90 до -90 градусов (на картинке я показал угол). и для примера взял угол в 45 градусов.
От того какой угол я задам, мне надо будет отрисовать точку С по найденным координатам, но как их найти?
Какая последовательность действий мне нужна?
Снизу я добавил картинки того, как должны выглядеть прямые, если я задам угол в 90 и -90 градусов
Точка С лежит на диагонали
Ответы (2 шт):
Попробуй вот этот вариант:
coords1 - координаты точки А;
coords2 - координаты точки B;
angle - угол от 90 до -90;
function normalize0between1(min, max, value){
return (value - min) / (max - min);
}
function getCoords(coords1, coords2, angle) {
let { x1, y1 } = coords1;
let { x2, y2 } = coords2;
let hypo = Math.sqrt((x2 - x1) * (x2 - x1) + (y1 - y2) * (y1 - y2));
let offset = hypo * normalize0between1(90, -90, angle);
let computedAngle = Math.asin((y1 - y2) / hypo);
let _x = Math.cos(computedAngle) * offset + x1;
let _y = Math.sin(computedAngle) * offset + y2;
return {
x: _x,
y: _y
};
}
let coords = getCoords({x1: 1, y1: 7}, {x2: 8, y2: 2}, -90);
console.log(coords);
Аналитическое решение для этой задачи есть, но у меня получилось очень громоздкое. Поэтому предлагаю численно подобрать решение бинарным поиском. Код на Python. dx, dy - ширина и высота, an - угол в радианах. Ответ - два смещения от вершины.
from math import sqrt, cos, pi
def calcpos(dx, dy, an):
l = 0
r = 0.5
cosa = cos(an)
dx2 = dx * dx
dy2 = dy * dy
dxdy = dx2 + dy2
while (r - l > 0.0001):
t = (l + r) / 2
tt = 1 - t
ca = dxdy * t * tt / sqrt((dx2 * t * t + dy2 * tt * tt)*(dy2 * t * t + dx2 * tt * tt))
if ca > cosa:
r = t
else:
l = t
return [(dx * l, dy * (1 - l)), (dx * (1 - l), dy * l)]
print(calcpos(2, 3, pi/4))
>> [(0.5621337890625, 2.15679931640625), (1.4378662109375, 0.84320068359375)]
Проверочка (углы показаны дополнительные до 180):


