图形学实验六.docx
- 文档编号:3158316
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:14
- 大小:158.82KB
图形学实验六.docx
《图形学实验六.docx》由会员分享,可在线阅读,更多相关《图形学实验六.docx(14页珍藏版)》请在冰豆网上搜索。
图形学实验六
贵州大学实验报告
学院:
计信学院专业:
计科班级:
计科101
姓名
罗琳
学号
1008060016
实验组
实验时间
2013-4-29
指导教师
吴云
成绩
实验项目名称
二维图形的几何变换
实验目的
掌握二维图形的基本几何变换:
位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。
实验要求
1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。
2.将一四边形以原点为中心,以15°为间隔旋转。
实验原理
标准齐次坐标(x,y,1)二维变换的矩阵表示
平移变换
旋转变换
放缩变换
●平移变换只改变图形的位置,不改变图形的大小。
●旋转变换不改变图形的形状
●放缩变换引起图形形状的变化。
复合变换
结果与变换的顺序有关(矩阵乘法不可交换)
例:
对一矩形先缩放S(2,0.5),再旋转R(/6)。
对称变换
关于x轴的对称变换:
关于y轴的对称变换:
例:
设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),求对于直线-2x+3y+3=0的对称变换后的图形结果。
%-2x+3y+3=0
clear;
clc;
X1=[-110];
Y1=[-5/317/3];
plot(X1,Y1);
holdon;
x=atan(2/3);
X2=[5185];
Y2=[102510];
plot(X2,Y2,'b');
%用鼠标标出ABC
gtext('A(5,10)');
gtext('B(1,2)');
gtext('C(8,5)');
P=[5101
121
851];
T=[cos(2*x)sin(2*x)0
sin(2*x)-cos(2*x)0
-(cos(2*x)-1)*3/2-sin(2*x)*3/21];
P1=P*T;
X3=[P1(1,1),P1(2,1),P1(3,1),P1(1,1)];
Y3=[P1(1,2),P1(2,2),P1(3,2),P1(1,2)];
plot(X3,Y3,'r');
%画X及Y轴
X4=[-2,14];
Y4=[0,0];
plot(X4,Y4,'m');
X4=[0,0];
Y4=[-2,12];
plot(X4,Y4,'m');
%用鼠标标志有关点
gtext('0(0,0)');
xlabel('X-轴');
ylabel('Y-轴');
gtext('A1(12.1,-0.6)');
gtext('B1(3.2,-1.2)');
gtext('C1(8.6,4.1)');
gtext('X');
gtext('Y');
gtext('-2x+3y+3=0');
axisequal;
T1=[100
010
-3/201];
T2=[cos(x)-sin(x)0
sin(x)cos(x)0
001];
T3=[100
0-10
001];
T4=[cos(x)sin(x)0
-sin(x)cos(x)0
001];
T5=[100
010
3/201];
T=T1*T2*T3*T4*T5;
P1=P*T;
实验环境
硬件平台:
PC
软件(推荐):
Windows平台,VisualC++,matlab
实验步骤
1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
5.按格式书写实验报告。
实验内容
设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图;将一四边形以原点为中心,以15°为间隔旋转。
程序如下:
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.选择基本图形: 2.矩形如下图: 3.将矩形向上平移: 4.顺时针旋转45°: 5.关于原点对称: 实验总结 做这个实验的过程中需要认真去思考关于对称的一些特点,通过本次实验进一步理解了二维图形的几何变换(缩放、旋转、平移等)的基本原理;从实验中学到了很多的东西,更进一步的理解了图形变换,这在我们生活中很多方面都用到的,例如设计建筑,图片的转变等; 指导教师意见 签名: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 实验