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
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.
v your vector (thus
v.x = end.x - start.x and idem for
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)
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
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