Вычислить расстояние до точки на произвольной оси

#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)

Вот результат.