Angle between two vectors

길이가 1인 두 개의 벡터 A와 B가 주어졌을 때, 두 벡터 사이의 각도를 구하는 함수

float Angle1( const Vector& A, const Vector& B )
{ return acosf( DotProduct(A,B) ); }

: A와 B가 거의 평행하게 될 때 DotProduct(A,B)의 값이 -1 보다 작거나 +1 보다 큰 경우가 생기며, 이 때 문제가 발생할 수 있다.

#define Clamp(x,min,max) (((x)<(min))?((min)):(((x)>(max))?((max)):(x)))

float Angle2( const Vector& A, const Vector& B )
{ return acosf( Clamp( DotProduct(A,B), -1.f, 1.f ) ); }

: Angle1() 함수의 문제점을 해결하였지만, acos(x) 또는 acosf(x) 함수는 x가 매우 작을 때 부정확한 결과를 출력한다.

따라서, 다음과 같은 Angle3() 함수를 사용하는 것이 좋다.

float Angle3( const Vector& A, const Vector& B )
{ return atan2f( Length(CrossProduct(A,B)), DotProduct(A,B) ); }

답글 남기기