确定3D空间中直线的角度

Joe*_*Joe 0 vb.net math line

我在空间中有一条直线,有一个起点和终点(x,y,z),我试图得到这个矢量和定义的平面之间的角度z=0.我正在使用VB.NET

这是我的3D环境中的线条图片(我所介入的线条用红色圈出):

在此输入图像描述

它现在设置为70度的角度.

Cim*_*ali 5

您需要2条光线来定义角度.

如果想要矢量和平面之间的角度,则为该平面中的任何矢量定义它.然而,只有一个最小值,即矢量与其在所述平面上的投影之间的角度.

因此,当我们谈到矢量和平面之间的角度时,我们采用的是最小值.

这个值也是π/ 2 - 你的矢量和垂直于平面的矢量之间的角度.你可以在这个网站上阅读更多关于它的信息.

使用v你的矢量(因此v.x = end.x - start.x和同上,yz),n平面的法线和a你正在寻找的角度,我们从标量积的定义中知道:

<v,n> = ||v|| * ||n|| * cos(?/2 - a)
Run Code Online (Sandbox Code Playgroud)

我们知道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||
Run Code Online (Sandbox Code Playgroud)

最后,通过采用正弦的互反性并阐明以下公式的公式v:

a = Asin(v.z / sqrt( v.x*v.x + v.y*v.y + v.z*v.z ))
Run Code Online (Sandbox Code Playgroud)

根据此文档,Asin函数存在于System.Math类中.但是,它确实以弧度为单位返回值:

返回值类型:System.Double以弧度为单位测量的角度θ,如果d <-1或d> 1或d等于NaN,则-π/2≤θ≤π/ 2 - 或 - NaN.

幸运的是,相同的System.Math类包含π值,以便您可以进行转换:

a *= 180 / Math.PI
Run Code Online (Sandbox Code Playgroud)