旋转矩阵的表现形式
点A以列表示且右乘旋转矩阵
原坐标轴改变至新坐标轴
旋转矩阵M={新x轴x,新y轴x,
新x轴y,新y轴y}
绕原坐标轴原点旋转角度a
旋转矩阵M={ cos(a), -sin(a),
sin(a), cos(a) }
以上两者意思一样,不难证明
绕特定点旋转
不论绕哪点旋转,物体旋转相同角度后的形状均相同。
要绕特定点旋转,只需要在旋转后将同样进行旋转变化后的旋转中心移动回原本的旋转中心即可。
#pragma once
#include"CPoint.h"
#include<cmath>
#define PI 3.1415926
Point *Rotate(const Point *pts,int numPts, Point center,
float angle, float t[2] , float zoom = 1.0F);//顺时针旋转 平移 放大
float ( *GetM(float angle, float zoom = 1.0F) )[2];//根据旋转角度获取旋转矩阵
Point *Rotate(const Point *pts,int numPts, Point center,
float angle, float t[2], float zoom )
{
//绕中心点顺时针旋转angle度放大zoom倍
//同时平移t
Point *new_pts = new Point[numPts];
float (*m)[2] = GetM(angle, zoom);//获取旋转矩阵
//计算中心点移动
//把t的计算放到c_move中,减少点循环中t的加次数
float c_new_x = center.x * m[0][0] + center.y * m[0][1];
float c_new_y = center.x * m[1][0] + center.y * m[1][1];
float c_x_move = center.x - c_new_x + t[0];
float c_y_move = center.y - c_new_y + t[1];
for(int i = 0; i < numPts; i++){//对点进行旋转和平移
new_pts[i].x = pts[i].x * m[0][0] + pts[i].y * m[0][1] + c_x_move;
new_pts[i].y = pts[i].x * m[1][0] + pts[i].y * m[1][1] + c_y_move;
}
return new_pts;
}
float ( *GetM(float angle, float zoom ) )[2] {
float m[2][2];
float radian = angle/180 * PI;
m[0][0] = cos(radian) * zoom;
m[0][1] = 0 - sin(radian) * zoom;
m[1][0] = sin(radian) * zoom;
m[1][1] = cos(radian) * zoom;
return m;
}