计算机图形学实验报告实验6.docx
《计算机图形学实验报告实验6.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告实验6.docx(10页珍藏版)》请在冰点文库上搜索。
![计算机图形学实验报告实验6.docx](https://file1.bingdoc.com/fileroot1/2023-6/2/3244b794-50ab-4c58-a4d5-82fa444dbadb/3244b794-50ab-4c58-a4d5-82fa444dbadb1.gif)
计算机图形学实验报告实验6
贵州大学实验报告
学院:
计算机科学与信息学院专业:
计科班级:
101
姓名
吕杨
学号
1008060040
同组成员
实验时间
2010-5-11
指导教师
吴云
成绩
实验项目名称
图形的基本变换
实验目的
1.通过实验加深对知识的理解,并知道在生活哪些方面需要应用到这些知识。
2.熟练掌握图形变换(缩放、旋转、平移等)的基本原理;
3.通过编程,学习在VC环境下MFC完成用简单图形的绘制。
实验要求
实现基本图形的变换。
实验原理
1.平移变换
点(x,y,z)沿x轴方向平移Tx距离,沿y轴方向平移Ty距离,沿z轴方向平移Tz距离,变成点(x´,y´,z´),这一变换过程的变换矩阵为:
2.缩放变换
设一个点沿x,y,z轴缩放的比例分别为Sx,Sy,Sz,则缩放变换矩阵可表示为:
3.旋转变换
A.绕x轴
空间上的立体绕X轴旋转时,立体上各点的X坐标不变,只是Y、Z坐标发生相应的变化。
转角的正向满足右手螺旋法则。
B.绕y轴
此时,Y坐标不变,X,Z坐标相应变化。
C.绕z轴
此时,Z坐标不变,X,Y坐标相应变化。
4.对称变换
三维对称变换可以分为:
关于坐标轴的对称;
关于坐标平面的对称;
关于坐标原点的对称;
实验环境
VC++6.0开发环境.
实验步骤
程序的主要代码如下:
voidCMy2DView:
:
OnDraw(CDC*pDC)
{CMy2DDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
GetMaxX();
GetMaxY();
pDC->MoveTo(MaxX/2,0);
pDC->LineTo(MaxX/2,MaxY);
pDC->MoveTo(0,MaxY/2);
pDC->LineTo(MaxX,MaxY/2);
}voidCMy2DView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{//TODO:
addcleanupafterprinting
}
#ifdef_DEBUG
voidCMy2DView:
:
AssertValid()const
{CView:
:
AssertValid();}
voidCMy2DView:
:
Dump(CDumpContext&dc)const
{CView:
:
Dump(dc);}
CMy2DDoc*CMy2DView:
:
GetDocument()//non-debugversionisinline
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy2DDoc)));
return(CMy2DDoc*)m_pDocument;
}
#endif//_DEBUG
voidCMy2DView:
:
ClearMatrix(doubleA[][3])
{for(inti=0;i<3;i++)
{for(intj=0;j<3;j++)
A[i][j]=0;}}
voidCMy2DView:
:
GetMaxY()
{CRectRect;
GetClientRect(&Rect);
MaxX=Rect.right;}
voidCMy2DView:
:
GetMaxX()
{CRectRect;
GetClientRect(&Rect);
MaxY=Rect.bottom;}
voidCMy2DView:
:
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();}
voidCMy2DView:
:
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];}
voidCMy2DView:
:
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];}
voidCMy2DView:
:
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);
Draw(P,ntype);}
voidCMy2DView:
:
Tscale(doubleSx,doubleSy)
{ClearMatrix(TS);
RedrawWindow();
TS[0][0]=Sx;
TS[1][1]=Sy;
TS[2][2]=1;
Calculate(P,TS);
Draw(P,ntype);}
voidCMy2DView:
:
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);
Draw(P,ntype);}
voidCMy2DView:
:
Treflect(doubleFx,doubleFy)
{ClearMatrix(TF);
RedrawWindow();
TF[0][0]=Fx;
TF[1][1]=Fy;
TF[2][2]=1;
Calculate(P,TF);
Draw(P,ntype);}
voidCMy2DView:
:
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);
Draw(P,ntype);}
实验内容
通过自己定义一个相对简单的形体,比如矩形、直线、三角形等基本图形,然后通过选择实现一些简单的变换以下变形:
平移,旋转,对称等
实验结果
(1)通过定义一个基本图形来生成一个用来变换的基本图形(定义一个长度为200,宽度100的矩形):
(2)矩形生成如下:
(3)将矩形进行平移变换,结果如下:
(4)将矩形顺时针旋转45°,结果如下:
(5)将矩形关于原点对称:
(7)其余变换结果如下:
(8)由于篇幅有限,其余基本图形变换结果未罗列出。
实验总结
通过本次实验对一些基本图形进行变换,了解到了图形学中基本图形是经过怎样的算法和原理实现相应的变换要求。
通过对程序添加代码的过程中,了解到了基本图形的变换跟图形的矩阵密切相关,进行各种变换都是在图形的矩阵基础之上进行修改和变换而成的。
因此,这次实验中,了解到了一些基本图形的矩阵的代码表示方法和矩阵运算方法。
总之,通过这次实验,我对本章学习有了更进一步的了解,对基本图形的基本变换有了更一步了解和掌握。
指导教师意见
签名:
年月日
注:
可根据教学需要对以上栏目进行增减。
表格内容可根据内容扩充。