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

127 次查看(过去 30 天)
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?
  4 个评论
James Tursa
James Tursa 2020-1-22
@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
UWM 2020-1-23
Thanks for clarification. I will try to do this according your tips.

请先登录,再进行评论。

采纳的回答

James Tursa
James Tursa 2020-1-23
编辑:James Tursa 2020-1-23
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.
  3 个评论
Erik
Erik 2022-2-23
I have found several examples of this solution online through searching but they never explain how you get the plane normal vector.
>> p = [0; 0; 1]; % The v1 & v2 plane normal vector
Where does this come from? How do I calculate it?
Jan
Jan 2022-2-23
The vector cross(x,y) is perpendicular to the vectors x and y. If you normalize it, it is the orthonormal vector to the plane built by the vectors x and y.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by