已知2个坐标点,求从 0------->x 逆时针需旋转多少角度到该位置
/************************************************************************
*函数名: getAngle
*
*函数作用: 已知2个坐标点,求从 0------->x 逆时针需旋转多少角度到该位置
*
* |
* |
* |
* |
*------------------------------------> x
* | 0
* |
* |
* |
* v
* y
*
*函数参数:
*CvPoint2D32f pointO - 起点
*CvPoint2D32f pointA - 终点
*
*函数返回值:
*double 向量OA,从 0------->x 逆时针需旋转多少角度到该位置
**************************************************************************/
double getAngle(CvPoint pointO,CvPoint pointA)
{
double angle = 0;
CvPoint point;
double temp;
point = cvPoint((pointA.x - pointO.x), (pointA.y - pointO.y));//pointAdd(pointA,pointMultiply(pointO,-1));
if ((0==point.x) && (0==point.y))
{
return 0;
}
if (0==point.x)
{
angle = 90;
return angle;
}
if (0==point.y)
{
angle = 0;
return angle;
}
temp = fabsf(float(point.y)/float(point.x));
temp = atan(temp);
temp = temp*180/CV_PI ;
if ((0<point.x)&&(0<point.y))
{
angle = 360 - temp;
return angle;
}
if ((0>point.x)&&(0<point.y))
{
angle = 360 - (180 - temp);
return angle;
}
if ((0<point.x)&&(0>point.y))
{
angle = temp;
return angle;
}
if ((0>point.x)&&(0>point.y))
{
angle = 180 - temp;
return angle;
}
printf("getAngle error!");
return -1;
}
double get_line_angle(CvPoint pointO,CvPoint pointA)
{
double roadAngle = 0;
if (pointO.x < pointA.x)
{
return getAngle(cvPoint(pointA.x, pointA.y),cvPoint(pointO.x, pointO.y));
}
else if ((pointO.x == pointA.x) && (pointO.y < pointA.y))
{
return getAngle(cvPoint(pointA.x, pointA.y),cvPoint(pointO.x, pointO.y));
}
else
{
return getAngle(cvPoint(pointO.x, pointO.y),cvPoint(pointA.x, pointA.y));
}
}
bool compare_angle(double angleA, double angleB, double thresh)
{
if ( fabsf(angleA - angleB) < thresh )
{
return true;
}
return false;
}