Angle betwen two 3d vectors in the range 0-360 degree
    61 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    UWM
 el 22 de En. de 2020
  
    
    
    
    
    Comentada: Jan
      
      
 el 23 de Feb. de 2022
            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 comentarios
  James Tursa
      
      
 el 22 de En. de 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?
Respuesta aceptada
  James Tursa
      
      
 el 23 de En. de 2020
        
      Editada: James Tursa
      
      
 el 23 de En. de 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.
3 comentarios
  Erik
 el 23 de Feb. de 2022
				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
      
      
 el 23 de Feb. de 2022
				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.
Más respuestas (0)
Ver también
Categorías
				Más información sobre Propagation and Channel Models en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!