计算机图形学实验报告实验4.docx
《计算机图形学实验报告实验4.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告实验4.docx(11页珍藏版)》请在冰点文库上搜索。
![计算机图形学实验报告实验4.docx](https://file1.bingdoc.com/fileroot1/2023-5/26/8651ebdc-46ad-44fb-9cfe-5c7cc9262860/8651ebdc-46ad-44fb-9cfe-5c7cc92628601.gif)
计算机图形学实验报告实验4
贵州大学实验报告
学院:
计算机科学与信息学院专业:
计算机科学与技术班级:
10级计科101班
姓名
吴晨
学号
1008060248
实验组
实验时间
2013-6-10
指导教师
吴云
成绩
实验项目名称
实验四二维图形的几何变换
实验目的
掌握二维图形的基本几何变换:
位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。
实验要求
1、书写实验报告:
(1)给出算法描述,包括理论、算法和数据结构;
(2)根据算法和数据结构:
编制源程序;
(3)给出实验数据和结果
(4)编制源程序;
2、对于一些较为重要的算法,可以适当给出代码
实验原理
一、标准齐次坐标(x,y,1)二维变换的矩阵表示
1、平移变换
2、旋转变换
3、放缩变换
平移变换只改变图形的位置,不改变图形的大小。
旋转变换不改变图形的形状
放缩变换引起图形形状的变化
4、复合变换结果与变换的顺序有关(矩阵乘法不可交换)
5、对称变换
关于x轴的对称变换:
关于y轴的对称变换:
实验环境
硬件平台:
PC
软件:
VisualC++6.0
实验步骤
1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
按格式书写实验报告。
实验内容
1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。
2.将一四边形以原点为中心,以15°为间隔旋转。
实验结果
1、执行后选择所需绘制的图形形如下
2、绘制三角形,根据要求画出如下的三角形
3.改变边的大小,对称转换得到如下的结果
4.绘制四边形,以中点为中心
5、15°为间隔旋转得到如下的结果
实验总结
通过这次实验,我对二维图形的基本几何变换(平移、旋转、缩放、错切、反射、投影)和复合变换的理解更加深入了,在对图形进行复合变换时,将几个基本几何变换矩阵按一定顺序相乘便能得到一个复合矩阵,这个复合矩阵能够决定变换后图形的最终位置、形状和大小的信息。
在产生复合矩阵时,因为矩阵乘法并不满足交换律,所以如果基本几何变换矩阵相乘的顺序不同,可能会得到不同的复合矩阵,也就生成了不同的最终变换图形。
部分
源代码
voidCTestView:
:
ClearMatrix(doubleA[3][3])//清除变换矩阵
{
for(inti=0;i<3;i++)
{
for(intj=0;j<3;j++)
A[i][j]=0;
}
}
voidCTestView:
:
OnMENUChoose()//菜单函数
{
//TODO:
Addyourcommandhandlercodehere
Picdlgdlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Square==TRUE)//绘制矩形
{
P[0][0]=-dlg.m_Slength/2;P[0][1]=dlg.m_Swidth/2;P[0][2]=1;
P[1][0]=dlg.m_Slength/2;P[1][1]=dlg.m_Swidth/2;P[1][2]=1;
P[2][0]=dlg.m_Slength/2;P[2][1]=-dlg.m_Swidth/2;P[2][2]=1;
P[3][0]=-dlg.m_Slength/2;P[3][1]=-dlg.m_Swidth/2;P[3][2]=1;
ntype=4;
KeepOriginalMatrix(P,OSquare);
Draw(P,ntype);
}
if(dlg.m_Triangle==TRUE)//绘制等边三角形
{
P[0][0]=-dlg.m_Tlength/2;P[0][1]=0;P[0][2]=1;
P[1][0]=dlg.m_Tlength/2;P[1][1]=0;P[1][2]=1;
P[2][0]=0;P[2][1]=dlg.m_Tlength/2*tan(60*PI/180);P[2][2]=1;
P[3][0]=0;P[3][1]=0;P[3][2]=1;
ntype=3;
KeepOriginalMatrix(P,OTriangle);
Draw(P,ntype);
}
if(dlg.m_Line==TRUE)//绘制直线
{
P[0][0]=-dlg.m_Llength/2;P[0][1]=0;P[0][2]=1;
P[1][0]=dlg.m_Llength/2;P[1][1]=0;P[1][2]=1;
P[2][0]=0;P[2][1]=0;P[2][2]=1;
P[3][0]=0;P[3][1]=0;P[3][2]=1;
ntype=2;
KeepOriginalMatrix(P,OLine);
Draw(P,ntype);
}
}
InvalidateRect(NULL,FALSE);//重画窗口
}
voidCTestView:
:
Draw(doubleD[][3],intn)//绘制原始图形
{
RedrawWindow();
CClientDCdc(this);
CPenpen,*pOldpen;
pen.CreatePen(PS_SOLID,3,RGB(0,0,255));
pOldpen=dc.SelectObject(&pen);
for(inti=0;i{
if(i==0)
dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));
else
dc.LineTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));
}
dc.LineTo(ROUND(MaxX/2+D[0][0]),ROUND(MaxY/2-D[0][1]));
dc.SelectObject(pOldpen);
pen.DeleteObject();
}
voidCTestView:
:
Calculate(doubleP0[][3],doubleT[][3])//两个矩阵相乘
{
doublePtemp[4][3];
KeepOriginalMatrix(P,Ptemp);
for(inti=0;i<4;i++)
for(intj=0;j<3;j++)
P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[2][j];
}
voidCTestView:
:
Tmove(doubleTx,doubleTy)//平移变换矩阵
{
ClearMatrix(TM);
RedrawWindow();
TM[0][0]=1;
TM[1][1]=1;
TM[2][0]=Tx;
TM[2][1]=Ty;
TM[2][2]=1;
Calculate(P,TM);
AfxGetMainWnd()->SetWindowText("二维基本几何变换-平移变换");
Draw(P,ntype);
}
voidCTestView:
:
Tscale(doubleSx,doubleSy)//比例变换矩阵
{
ClearMatrix(TS);
RedrawWindow();
TS[0][0]=Sx;
TS[1][1]=Sy;
TS[2][2]=1;
Calculate(P,TS);
AfxGetMainWnd()->SetWindowText("二维基本几何变换-比例变换");
Draw(P,ntype);
}
voidCTestView:
:
Trotate(doublethta)//旋转变换矩阵
{
ClearMatrix(TR);
RedrawWindow();
TR[0][0]=cos(thta*PI/180);
TR[0][1]=sin(thta*PI/180);
TR[1][0]=-sin(thta*PI/180);
TR[1][1]=cos(thta*PI/180);
TR[2][2]=1;
Calculate(P,TR);
AfxGetMainWnd()->SetWindowText("二维基本几何变换-旋转变换");
Draw(P,ntype);
}
voidCTestView:
:
Treflect(doubleFx,doubleFy)//反射变换矩阵
{
ClearMatrix(TF);
RedrawWindow();
TF[0][0]=Fx;
TF[1][1]=Fy;
TF[2][2]=1;
Calculate(P,TF);
AfxGetMainWnd()->SetWindowText("二维基本几何变换-反射变换");
Draw(P,ntype);
}
voidCTestView:
:
Treform(doubleb,doublec)//错切变换矩阵
{
ClearMatrix(TC);
RedrawWindow();
TC[0][0]=1;
TC[0][1]=b;
TC[1][0]=c;
TC[1][1]=1;
TC[2][2]=1;
Calculate(P,TC);
AfxGetMainWnd()->SetWindowText("二维基本几何变换-错切变换");
Draw(P,ntype);
}
voidCTestView:
:
KeepOriginalMatrix(doubleOrig[][3],doubleDest[][3])//保留矩阵
{
inti,j;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
Dest[i][j]=Orig[i][j];
}
指导教师意见
签名:
年月日
注:
可根据教学需要对以上栏目进行增减。
表格内容可根据内容扩充。