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

37 views (last 30 days)
UWM on 22 Jan 2020
Commented: UWM on 24 Jan 2020
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?

Show 1 older comment
James Tursa on 22 Jan 2020
James Tursa on 22 Jan 2020
@UWM: You will need to define the method for calculating this full range angle. I.e., you need to pick a normal vector on one side of the plane and use that to determine this full range angle, along with a method for choosing which vector is "first". Have you done that?
UWM on 23 Jan 2020
Thanks for clarification. I will try to do this according your tips.

James Tursa on 23 Jan 2020
Edited: James Tursa on 23 Jan 2020
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.

#### 1 Comment

UWM on 24 Jan 2020
Many thanks!