developer:sdksamples:anglebetweenvectors


Calculate the angle between two vectors

C++, .NET

The following example code demonstrates how to calculate the angle between two 3-D vectors.

C++

// Description: Calculates the angle between two 3-D vectors.
// Parameters:
//  v0           - [in]  The first angle.
//  v1           - [in]  The second angle.
//  reflex_angle - [out] The reflex angle.
// Returns: The angle in radians.
static double ON_3dVectorAngle( ON_3dVector v0, ON_3dVector v1, double* reflex_angle = 0 )
{
  // Unitize the input vectors
  v0.Unitize();
  v1.Unitize();
 
  double dot = ON_DotProduct( v0, v1 );
 
  // Force the dot product of the two input vectors to 
  // fall within the domain for inverse cosine, which 
  // is -1 <= x <= 1. This will prevent runtime 
  // "domain error" math exceptions.
  dot = ( dot < -1.0 ? -1.0 : ( dot > 1.0 ? 1.0 : dot ) );
 
  double angle = acos( dot );
 
  if( reflex_angle )
    *reflex_angle = (ON_PI * 2) - angle;
 
  return angle;
}

C#

public static double ON_3dVectorAngle(On3dVector v0, On3dVector v1)
{
  // Unitize the input vectors
  v0.Unitize();
  v1.Unitize();
  double dot = OnUtil.ON_DotProduct(v0, v1);
 
  // Force the dot product of the two input vectors to 
  // fall within the domain for inverse cosine, which 
  // is -1 <= x <= 1. This will prevent runtime 
  // "domain error" math exceptions.
  dot = (dot < -1.0 ? -1.0 : (dot > 1.0 ? 1.0 : dot));
 
  return System.Math.Acos(dot);
}

VB.NET

Public Shared Function ON_3dVectorAngle(ByVal v0 As On3dVector, ByVal v1 As On3dVector) _
  As Double
  ' Unitize the input vectors
  v0.Unitize()
  v1.Unitize()
  Dim dot As Double = OnUtil.ON_DotProduct(v0, v1)
 
  ' Force the dot product of the two input vectors to 
  ' fall within the domain for inverse cosine, which 
  ' is -1 <= x <= 1. This will prevent runtime 
  ' "domain error" math exceptions.
  If (dot < -1.0) Then dot = -1.0
  If (dot > 1.0) Then dot = 1.0
  Return System.Math.Acos(dot)
End Function
developer/sdksamples/anglebetweenvectors.txt · Last modified: 2010/01/26 16:37 (external edit) Driven by DokuWiki Recent changes RSS feed

 © 1997-2010 

McNeel North America Europe Latin AmericaAsia