几何变换系列文章目录

easyx实现图形学中的二维变换——平移



前言

之前发布过学习图形学中的平移,这次学习图形学中的旋转,旋转相对较麻烦些,但道理基本一致


一、旋转的变换方法?

  • 旋转变换是基于原点进行旋转的,而原先的角度则是和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;

三、运行效果

在这里插入图片描述

结合平移的运行效果

效果展示

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐