几何变换系列文章目录
前言
之前发布过学习图形学中的平移,这次学习图形学中的旋转,旋转相对较麻烦些,但道理基本一致
一、旋转的变换方法?
- 旋转变换是基于原点进行旋转的,而原先的角度则是和X轴的夹角α,规定逆时针旋转的角度为正值,所以当旋转了一个角度β后,和X轴的夹角则变成α+β,如下图所示
- 根据点的极坐标表示法可以知道原先的P点的极坐标表示为X=Rcosα,Y=Rsinα,而旋转后变为X’=Rcos(α+β),Y’=Rsin(α+β),根据三角函数公式cos(a+b)=cosacosb-sinasinb,sin(a+b)=sinacosb+sinbcos a,便可以推断出X’=Xcosβ-Ysinβ,Y’=Xsinβ+Ycosβ便可以将其表示为矩阵乘法
- 从图中便可以看出二维旋转变换矩阵为
由此可以看出只需要有个旋转角度便可以进行旋转,当顺时针旋转时,角度变为负数,此时sin会变化,可以算出顺时针的旋转矩阵 - 在实际应用中可能会存在不是绕原点旋转,此时就需要借助平移将参考点移动到原点然后旋转完后再平移至原地方
二、核心代码
//前面的代码可以参考上一节平移中的代码
//此处只展示了旋转部分代码
void E_Transform::E_Rotate(double thet)
{
Identity();
T[0][0] = cos(thet); T[0][1] = -sin(thet);
T[1][0] = sin(thet); T[1][1] = cos(thet);
MultiplyMatrix();
}
//主函数调用测试(线条的旋转)
HWND hwnd = initgraph(500, 500);
setbkcolor(WHITE);
cleardevice();
setlinecolor(LIGHTBLUE);
setlinestyle(PS_SOLID, 2);
setorigin(250, 250);//重新设置原点
setaspectratio(1, -1);//重新设置y轴方向
E_Point P[2] = {
{0,0},
{200,200}
};
E_Transform Rorate;
Rorate.SetMatrix(P, 2);
for (; 1;) {
moveto(P[0].x, P[0].y);
lineto(P[1].x, P[1].y);
Rorate.E_Rotate(PI / 6);
Sleep(1000);
cleardevice();
}
closegraph();
return 0;
三、运行效果
结合平移的运行效果
效果展示