方法一:
// ptSrc: 圆上某点(初始点);
// ptRotationCenter: 圆心点;
// angle: 旋转角度° -- [angle * M_PI / 180]:将角度换算为弧度
// 【注意】angle 逆时针为正,顺时针为负
QPointF MathWidget::RotatePoint(const QPointF &ptSrc, const QPointF &ptRotationCenter, const qreal &angle)
{
//其中圆心(a,b), 圆上一点坐标(x0,y0), 旋转角度α ,
//那么旋转后的坐标 x=a+(x0-a)cosα-(y0-b)sinα , y=b+(x0-a)sinα+(y0-b)cosα
QPointF ptDst;
qreal a = ptRotationCenter.x();
qreal b = ptRotationCenter.y();
qreal x0 = ptSrc.x();
qreal y0 = ptSrc.y();
ptDst.rx() = a + (x0-a) * cos(angle * M_PI / 180) - (y0-b) * sin(angle * M_PI / 180);
ptDst.ry() = b + (x0-a) * sin(angle * M_PI / 180) + (y0-b) * cos(angle * M_PI / 180);
return ptDst;
}
一、推导过程:
1. 首先,极坐标系下,一个点绕原点( 0, 0)旋转一个角度后的坐标点
A (x1 ,y1)以原点为圆心旋转 n 度,求旋转后 A' (x' , y') 坐标值.
【注意】旋转 n 度:n 定义为 逆时针为正,顺时针为负
记原点为O,OA 与 X轴夹角为 θ
设 R = OA = √x1²+y1²
∴ 三角换元 x1 = Rcosθ,y1=Rsinθ
∴ cosθ = x1 / R,sinθ = y1 / R逆时针旋转 n 度后
x' = R cos(θ+n) = R(cosθcosn - sinθsinn)∵ cosθ = x1 / R,sinθ = y1 / R
∴ x' = x1cosn - y1sinn
同理: y' = R sin(θ+n) = R(sinθcosn + cosθsinn)
∵ cosθ = x1 / R,sinθ = y1 / R
∴ y' = y1cosn + x1sinn
2. 设原点为( x0, y0)
则:A (x1 ,y1) 以 ( x0, y0) 为圆心旋转 n 度,求旋转后 A' (x' , y') 坐标值.
x' = x0 + (x1 - x0) cosn - (y1 - y0)sinn
y' = y0 +(y1 - y0)cosn + (x1 - x0) sinn
二、旋转变换(一)旋转矩阵
1. 简介
2. 绕原点二维旋转
3. 绕任意点的二维旋转
4. 三维基本旋转
4.1 绕X轴的旋转
4.2 绕Y轴旋转
4.3 绕Z轴旋转
4.4 小结
5. 绕任意轴的三维旋转
详情请参照:
https://blog.csdn.net/csxiaoshui/article/details/65446125