实验五、二维图形的几何变换
一.作业名称:二维图形的几何变换
二.算法分析
以下实现了二维图形的空间平移、比例缩放、旋转、对称、转位。
平移变换
| | [
![](https://img.haomeiwen.com/i8043545/7d3cbc5ca6f51298.png)
旋转变换
![](https://img.haomeiwen.com/i8043545/1b18336b963b3eb3.png)
放缩变换
![](https://img.haomeiwen.com/i8043545/6a0deb095584955d.png)
l 平移变换只改变图形的位置,不改变图形的大小。
l 旋转变换不改变图形的形状
l 放缩变换引起图形形状的变化。
复合变换
的结果与变换的顺序有关(矩阵乘法不可交换)
三.算法实现
1.平移变换
void CMyView::OnTranslation()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][1]=15;
my1.A[3][2]=45;
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
2.旋转变换
void CMyView::OnRotation()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=cos(PI*60);//旋转60度
my1.A[1][2]=sin(PI*60);
my1.A[2][1]=-sin(PI*60);
my1.A[2][2]=cos(PI*60);
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
3.缩放变换
void CMyView::OnScaling()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=5;
my1.A[2][2]=2;
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
4.关于x轴对称
void CMyView::OnMirrorX()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
5关于y轴对称
void CMyView::OnMirrorY()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=-1;
my1.A[2][2]=1;
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
6.关于原点对称
void CMyView::OnMirrorO()
{
// TODO: Add your command handler code here
int i,j;
CMyClass my1; //构造新的CMyClass对象
//将图形变换矩阵清零
for ( i=1;i<=3;++i)
{
for ( j=1;j<=3;++j)
my1.A[i][j]=0;
}
//给图形变换矩阵赋值
my1.A[1][1]=-1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
RedrawWindow();
my1. Display ();
}
四.效果截图
(一)三角形
![](https://img.haomeiwen.com/i8043545/97c382b69be82acb.png)
1.****平移变换
![](https://img.haomeiwen.com/i8043545/a575f0c82f024a16.png)
2.****旋转变换
![](https://img.haomeiwen.com/i8043545/00f11d34bb5f5a6d.png)
3.****缩放变换
![](https://img.haomeiwen.com/i8043545/1bc91b0838d6c6e3.png)
4.****对称
(1)****关于****X****轴对称
![](https://img.haomeiwen.com/i8043545/e8ab33ccc12e362f.png)
(2)****关于****Y****轴对称
![](https://img.haomeiwen.com/i8043545/a1b6ea096186a038.png)
(3)****关于原点对称
![](https://img.haomeiwen.com/i8043545/a0dd647beec35b51.png)
(二)四边形
将一四边形以原点为中心,以150为间隔旋转。
要求: 写出程序框图,程序,及运行结果.
![](https://img.haomeiwen.com/i8043545/05dc00514fd55cda.png)