已知2个坐标点,求从 0------->x 逆时针需旋转多少角度到该位置

已知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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值