Простая алгебра.Сложная часть часто просто записывает основные уравнения, но как только они записаны, все остальное легко.
Можете ли вы определить линию, которая исходит из точки C = [c_x, c_y] и указывает вдольвектор V = [v_x, v_y]?Хороший способ представить такую линию - использовать параметрическое представление.Таким образом,
V(t) = C + t*V
В терминах векторных элементов мы имеем это как
V(t) = [c_x + t*v_x, c_y + t*v_y]
Посмотрим, как это работает.Когда t = 0, мы возвращаем точку C, но для любого другого значения t мы получаем какую-то другую точку на линии.
Как насчет отрезка, который проходит через A и B?Одним из способов решения этой проблемы было бы определение второй линии параметрически таким же образом.Затем найдите систему из двух уравнений с двумя неизвестными, чтобы найти пересечение.
Более простой подход - взглянуть на вектор нормали к отрезку AB.Этот вектор задается как
N = [b_y - a_y , a_x - b_x]/sqrt((b_x - a_x)^2 + (b_y - a_y)^2)
Обратите внимание, что здесь определено N, чтобы иметь единичную норму.
Итак, теперь, когда мы узнаем, лежит ли точка вдоль линии, соединяющейА и Б?Это легко сейчас.Это произойдет, когда определенное ниже скалярное произведение будет точно равным нулю.
dot(N,V(t) - A) = 0
Разверните это и решите для параметра t.Мы можем записать это, используя точечные произведения.
t = dot(N,A-C)/dot(N,V)
Или, если вы предпочитаете,
t = (N_x*(a_x - c_x) + N_y*(a_y - c_y)) / (N_x*v_x + N_y*v_y))
И как только мы получим t, подставим в выражение выше V (t).Давайте посмотрим всю эту работу на практике.Я выберу несколько точек A, B, C и вектор V.
A = [7, 3]
B = [2, 5]
C = [1, 0]
V = [1, 1]
Наш вектор нормалей N после нормализации будет выглядеть примерно так:
N = [0.371390676354104, 0.928476690885259]
Параметр линии,t, то будет
t = 3.85714285714286
И мы находим точку пересечения как
C + t*V = [4.85714285714286, 3.85714285714286]
Если вы нанесете точки на листе бумаги, все они должны совпасть, и все только внесколько простых выражений.