Необходимо 2 rays to define an angle.
Если вам нужен угол между вектором и плоскостью, он определен для любого вектора в этой плоскости. Однако для этого есть только одно минимальное значение, которое представляет собой угол между вектором и его проекцией на указанную плоскость.
Следовательно, это минимальное значение является тем, которое мы принимаем, когда говорим о углу между вектором и плоскостью.
Это значение также является π/2 - углом между вашим вектором и вектором, который является нормальным для плоскости. Вы можете узнать больше обо всем этом on this site.
С v
вашего вектором (таким образом v.x = end.x - start.x
и Idem для y
и z
), n
нормали к плоскости и a
угла вы ищете, мы знаем из определения скалярного произведения, что:
<v,n> = ||v|| * ||n|| * cos(π/2 - a)
Мы знаем cos(π/2 - a) = sin(a)
, а нормаль к плоскости z=0
- это просто вектор n = (0, 0, 1)
. Таким образом, скалярное произведение v.x * n.x + v.y * n.y + v.z * n.z
и норма n, ||n|| = 1
, могут быть упрощены. Мы получаем следующее выражение:
sin(a) = v.z/||v||
Таким образом, в конце концов, формула, взяв reciprocical синуса и expliciting нормы v
:
a = Asin(v.z/sqrt(v.x*v.x + v.y*v.y + v.z*v.z))
Согласно this documentation функции Asin
существует в вашей системе. Класс математики. Это, однако, возвращает значение в радианах:
Возвращаемое значение Тип: System.Double Угол, θ, измеренный в радианах, например, что -л/2 ≤ ≤ & thetas П/2 -OR - NaN, если d < -1 или d> 1 или d равно NaN.
К счастью the same System.Math class contains the value of π так, что вы можете сделать преобразование:
a *= 180/Math.PI
Я думаю, что один, как правило, использует продукт Крест, чтобы найти угол между двумя векторами. Или это Dot Product? Бьюсь об заклад, парни математики SE наверняка будут знать наверняка ;-) – Kevin
Не ответ на этот вопрос, первая часть ** [this] (http://math.stackexchange.com/questions/463415/angle- между-двумя-3d-линиями) ** вопрос? –
Я пытаюсь получить код для решения этой проблемы (возможно, используя функцию Math.NET), и в то же время это всего лишь 1 строка в трехмерной среде, а не две @ Bjørn-RogerKringsjå – Joe