#java #math #vector
#java #математика #вектор
Вопрос:
Учитывая простой 2D вектор (представленный точкой и направлением), как вы находите расстояние до другой точки, но только в указанном направлении?
Например, скажем, у меня есть точки start: (1.0, 0.0)
и end: (2.0, 0.0)
. Если я получу расстояние от начала до конца по оси x, результатом будет 1, но при проверке по оси y оно равно 0. Мне нужно уравнение, которое работало бы для любого направления. Для наших целей мы будем говорить, что направление задано просто в радианах.
Комментарии:
1. Какие уравнения вы использовали до сих пор?
Ответ №1:
Преобразуйте угол направления в вектор (соответствующим образом адаптируйте, если ваш угол следует интерпретировать по-другому):
dir = (cos(angle), sin(angle))
Затем спроецируйте обе точки на этот вектор и найдите разницу в виде их расстояния вдоль этого вектора:
distance = dot(dir, end) - dot(dir, start)
= dir.x * (end.x - start.x) dir.y * (end.y - start.y)
Приведены ваши примеры:
start = (1, 0)
end = (2, 0)
dir = (1, 0)
=> distance = 1 * (2 - 1) 0 * (0 - 0) = 1
dir = (0, 1)
=> distance = 0 * (2 - 1) 1 * (0 - 0) = 0
Чтобы это сработало, dir
должен быть единичный вектор.
Ответ №2:
Вам нужно скалярное произведение.
Предположим, что векторами положения имеющихся у вас точек являются (a,b,c)
и (p,q,r)
.
Вектор расстояния будет (p-a, q-b, r-c)
.
Теперь предположим, что вектор направления равен (x, y, z), в котором вам нужна составляющая расстояния, вычисленная ранее.
Для вычисления этого нам нужно скалярное произведение векторов расстояния и направления.
Которое может быть вычислено как Sum(x1*x2) = X1*X2 *Cos(A)
или Sum(distanceX1 * directionX1) = |distance| * |direction| * Cos(A)
|vector| = magnitude of vector = sqrt(Sum(x1*x1))
Таким образом, точечное произведение равно x*(p-a) y*(q-b) z*(r-c)
Расстояние, которое нам нужно, равно distance * Cos(A)
поэтому мы должны разделить скалярное произведение на величину вектора направления.
Это ( x*(p-a) y*(q-b) z*(r-c) ) / sqrt(x*x y*y z*z)
Вот результат.