2015-01-20 3 views
0

У меня есть прямая линия в пространстве с начальной и конечной точкой (x, y, z), и я пытаюсь получить угол между этим вектором и плоскостью, определяемой z=0. Я использую VB.NETОпределить угол прямой линии в 3D-пространстве

Вот картина линии в моей среде 3D (линия я интересуетесь обведена красным цветом):

enter image description here

Он устанавливается под углом 70 градусов прямо сейчас.

+0

Я думаю, что один, как правило, использует продукт Крест, чтобы найти угол между двумя векторами. Или это Dot Product? Бьюсь об заклад, парни математики SE наверняка будут знать наверняка ;-) – Kevin

+0

Не ответ на этот вопрос, первая часть ** [this] (http://math.stackexchange.com/questions/463415/angle- между-двумя-3d-линиями) ** вопрос? –

+0

Я пытаюсь получить код для решения этой проблемы (возможно, используя функцию Math.NET), и в то же время это всего лишь 1 строка в трехмерной среде, а не две @ Bjørn-RogerKringsjå – Joe

ответ

5

Необходимо 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 
Смежные вопросы