Joe Joe - 1 year ago 97 Question

Determine angle of a straight line in 3D space

I have a straight line in space with an start and end point (x,y,z) and I am attempting to get the angle between this vector and the plane defined by

. I am using VB.NET

Here is a picture of the line in my 3d environment (the line I'm intersted in is circled in red) :

enter image description here

It is set to an angle of 70 degrees right now.

Answer Source

You need 2 rays to define an angle.

If you want the angle between a vector and a plane, it is defined for any vector in that plane. However, there is only one minimal value for that, which is the angle between a vector and its projection onto said plane.

Therefore, that minimal value is the one we take when we speak of the angle between a vector and a plane.

This value is also π/2 - the angle between your vector and the the vector that is normal to the plane.You can read more about it all on this site.

With v your vector (thus v.x = end.x - start.x and idem for y and z), n the normal to the plane and a the angle you are looking for, we know from the definition of a scalar product that:

<v,n> = ||v|| * ||n|| * cos(π/2 - a)

We know cos(π/2 - a) = sin(a), and the normal to the z=0 plane is simply the vector n = (0, 0, 1). Thus both the scalar product, v.x * n.x + v.y * n.y + v.z * n.z, and the norm of n, ||n|| = 1, can be simplified a lot. We get the following expression:

sin(a) = v.z / ||v||

Thus finally, the formula by taking the reciprocical of the sine and expliciting the norm of v:

a = Asin(v.z / sqrt( v.x*v.x + v.y*v.y + v.z*v.z ))

According to this documentation the Asin function exists in your System.Math class. It does, however, return the value in radians:

Return Value Type: System.Double An angle, θ, measured in radians, such that -π/2 ≤ θ ≤ π/2 -or- NaN if d < -1 or d > 1 or d equals NaN.

Luckily the same System.Math class contains the value of π so that you can do the conversion:

a *= 180 / Math.PI