已知旋转中心和旋转角度,获得旋转之后的一组点坐标

本文介绍了一种用于在二维平面上旋转一组点坐标的算法,并解释了如何通过两个坐标点确定逆时针旋转的角度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值