#define PI 3.1415926535897932384626433832795
//已知旋转中心和旋转角度,获得旋转之后的一组点坐标
bool rotPoint(CPoint center,float rotAngleNow,CPoint src_corners[],CPoint dst_corners[],int num)
{
float reverseH[6];
float x = (float) (cos (rotAngleNow * PI / 180.));
float y = (float) (sin (rotAngleNow * PI / 180.));
reverseH[0] = x;
reverseH[1] = y;
reverseH[2] = (1-x)* center.x - y * center.y ;
reverseH[3] = -y;
reverseH[4] = x;
reverseH[5] = y * center.x +(1-x)*center.y ;
for( int i = 0; i < num; i++ )
{
double x = src_corners[i].x, y = src_corners[i].y;
double X = (reverseH[0]*x + reverseH[1]*y + reverseH[2]);
double Y = (reverseH[3]*x + reverseH[4]*y + reverseH[5]);
dst_corners[i] = CPoint(cvRound(X), cvRound(Y));
}
return true;
}
/************************************************************************
*函数名: rotAngle
*
*函数作用: 已知2个坐标点,求从 0------->x 逆时针需旋转多少角度到该位置
*
* |
* |
* |
* |
*------------------------------------> x
* | 0
* |
* |
* |
* v
* y
*
*函数参数:
*CPoint pointO - 起点
*CPoint pointA - 终点
*
*函数返回值:
*double 向量OA,从 0------->x 逆时针需旋转多少角度到该位置
**************************************************************************/
double rotAngle(CPoint pointO,CPoint pointA)
{
double angle = 0;
CPoint point;
double temp;
point = pointA - pointO;// 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/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("sceneDrawing :: getAngle error!");
return -1;
}