MATLAB: Angle betwen two 3d vectors in the range 0-360 degree

3d vectors anglefull range

I have set of two 3d vectors lying on the same plane. I would like to calculate
angles betwen each of these pairs, but in the "full" angle range: from 0 to 360 degree.
Using formula:
Angle = atan2d(norm(cross(v1,v2)),dot(v1,v2));
give me always angle in the rang from 0 to 180 degree, even if the second vector lies
on the right side of the first one.
How could this be improved?

Best Answer

E.g., here is one method:
function a = vecangle360(v1,v2,n)
x = cross(v1,v2);
c = sign(dot(x,n)) * norm(x);
a = atan2d(c,dot(v1,v2));
end
This is a simple (non-vectorized) function that takes two input vectors v1 and v2, and a vector n that is not in the plane of v1 & v2. Here n is used to determine the "direction" of the angle between v1 and v2 in a right-hand-rule sense. I.e., cross(n,v1) would point in the "positive" direction of the angle starting from v1. A sample run:
>> v1 = [2; 0; 0];
>> v2 = [1; 1; 0];
>> p = [0; 0; 1]; % The v1 & v2 plane normal vector
>> vecangle360(v1,v2,p)
ans =
45
>> vecangle360(v1,v2,-p)
ans =
-45
>> vecangle360(v2,v1,p)
ans =
-45
>> vecangle360(v2,v1,-p)
ans =
45
So you can see that the method returns an angle "from" the first vector "to" the second vector using a right-hand-rule with the n vector. It will be in the range -180 to 180, so if you really need 0 - 360 you will need to modify the result.