Return to Snippet

Revision: 36578
at November 23, 2010 13:58 by browny


Initial Code
struct Vector
{
    double x, y;
};


double getRotateAngle(Vector vec1, Vector vec2)
{
const double epsilon = 1.0e-6;
const double PI = acos(-1.0); // 180 degree
double angle = 0;

// normalize
Vector norVec1, norVec2;
norVec1.x = vec1.x / sqrt(pow(vec1.x, 2) + pow(vec1.y, 2));
norVec1.y = vec1.y / sqrt(pow(vec1.x, 2) + pow(vec1.y, 2));
norVec2.x = vec2.x / sqrt(pow(vec2.x, 2) + pow(vec2.y, 2));
norVec2.y = vec2.y / sqrt(pow(vec2.x, 2) + pow(vec2.y, 2));

// dot product
double dotProd = (norVec1.x * norVec2.x) + (norVec1.y * norVec2.y);
if ( abs(dotProd - 1.0) <= epsilon )
	angle = 0;
else if ( abs(dotProd + 1.0) <= epsilon )
	angle = PI;
else {
	double cross = 0;
	angle = acos(dotProd);
	//cross product (clockwise or counter-clockwise)
	cross = (norVec1.x * norVec2.y) - (norVec2.x * norVec1.y);

	if (cross < 0) // vec1 rotate clockwise to vec2
			angle = 2 * PI - angle;
	}

	return angle*(180 / PI);
	
}

Initial URL
http://www.cnblogs.com/lsmdiao0812/archive/2010/05/05/1728122.html

Initial Description

                                

Initial Title
Get the directional rotation angle between 2 vectors

Initial Tags

                                

Initial Language
C++