江苏大学 计算机图形学第三次实验报告 二维图形变换

合集下载

计算机图形学实验:二维图形变换

计算机图形学实验:二维图形变换

实验三 二维图形变换一、实验任务1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换; 2. 实现图形变换的交互式操作:缩放、旋转、对称变换等;二、实验内容1. 放大缩小变换放大缩小变换公式为:x’=x..S x , y’=y.S y ; 其中S x , S y 分别为x,y 方向的放缩比例系数。

变换矩阵表达式为: [x’ y’(1)S x =S y = 1.5;等比例放大 (2)S x =S y = 0.5;等比例缩小 2. 对称变换包括以x 轴对称、y 轴对称和原点O 对称三种。

由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。

在第一象限画出一个三角形,然后分别求出三个对称图形。

3. 旋转变换将图形上的点(x ,y )旋转θ角度,得到新的坐标(x’,y’)为:x’=xcos θ-ysin θ, y’=xsin θ+ycos θ;[x’ y’ 4.三、设计思路1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2. 以(500,240)为原点建立图形变换的参考坐标系; 3. 通过键盘按键控制图形的缩放、旋转、对称变换;4. 变换图形设定为以Pt[0](540,220)、Pt[1](670,130)、Pt[2](560,120)为顶点的三角形。

步骤:1.建立Trans工程文件;2.利用Resource View设计菜单,如图所示;3.在CTransView视图类中添加消息映射函数;4.添加自定义的成员变量:CPoint Pt[3]; //三角形定点数组float dAngle; //每一次旋转的角度在视图类CPP文件的构造函数中初始化成员变量Pt[0].x = 540; Pt[0].y = 220;Pt[1].x = 670; Pt[1].y = 130;Pt[2].x = 560; Pt[2].y = 120;dAngle = 0;5.在视图类的OnDraw()函数中加入下列代码,实现视图绘图。

计算机图形学实验3------二维几何变换

计算机图形学实验3------二维几何变换

实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 Win32、Visual C++环境MFC绘制图形配置过程制过程二、实验原理及思想1.基本几何变换2.齐次坐标给定2D 坐标 (x, y), 引入第3维:[x, y, 1]通常, 一个 2D 坐标点的齐次坐标有如下形式:[x, y, W]两个齐次坐标点 [x, y, W] and [x’, y’, W’] 相同 if x = kx’eg: [2, 3, 6] = [4, 6, 12]y = ky’for some k ≠ 0 where k=2W = kW’因此,任意 [x, y, W] 可归一化:[x/W, y/W, 1]3.三、实验关键代码void C2DChangeView::ClearMatrix(double A[3][3])//清除变换矩阵{for(int i=0;i<3;i++){for(int j=0;j<3;j++)A[i][j]=0;}}void C2DChangeView::Draw(double D[][3],int n)//绘制图形{RedrawWindow();CClientDC dc(this);CPen pen,*pOldpen;pen.CreatePen(PS_SOLID,2,RGB(0,0,0));pOldpen=dc.SelectObject(&pen);for(int i=0;i<n;i++){if(i==0)dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));elsedc.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();}void C2DChangeView::Calculate(double P0[][3],double T[][3])//两个矩阵相乘{double Ptemp[4][3];KeepMatrix(P,Ptemp);for(int i=0;i<4;i++)for(int j=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];}void C2DChangeView::OnMENUleft()//向左平移{// TODO: Add your command handler code hereTmove(-10,0);}void C2DChangeView::OnMENUright()//向右平移{// TODO: Add your command handler code hereTmove(10,0);}void C2DChangeView::OnMENUup() //向上平移{// TODO: Add your command handler code hereTmove(0,10);}void C2DChangeView::OnMENUdown()//向下平移{// TODO: Add your command handler code hereTmove(0,-10);}void C2DChangeView::OnMENUClockwise()//顺时针旋转{// TODO: Add your command handler code hereTrotate(30);}void C2DChangeView::OnMENUAnticlockwise()//逆时针旋转{// TODO: Add your command handler code hereTrotate(-30);}void C2DChangeView::OnMENUIncrease()//放大比例{// TODO: Add your command handler code hereTscale(2,2);}void C2DChangeView::OnMENUDecrease()//缩小比例{// TODO: Add your command handler code hereTscale(0.5,0.5);}void C2DChangeView::OnMENUXdirectionplus()//X正向错切{// TODO: Add your command handler code hereTreform(0,1);}void C2DChangeView::OnMENUXdirectionneg()//X负向错切{// TODO: Add your command handler code hereTreform(0,-1);}void C2DChangeView::OnMENUITYdirectionplus()//Y正向错切{// TODO: Add your command handler code hereTreform(1,0);}void C2DChangeView::OnMENUYdirectionneg()//Y负向错切{// TODO: Add your command handler code hereTreform(-1,0);}void C2DChangeView::OnMENUReset() //复位{// TODO: Add your command handler code hereif(p3==4){KeepMatrix(OSquare,P);}if(p3==3){KeepMatrix(OTriangle,P);}if(p3==2){KeepMatrix(OLine,P);}Draw(P,p3);}void C2DChangeView::Tmove(double Tx,double Ty)//平移变换矩阵{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,p3);}void C2DChangeView::Tscale(double Sx,double Sy)//比例变换矩阵{ClearMatrix(TS);RedrawWindow();TS[0][0]=Sx;TS[1][1]=Sy;TS[2][2]=1;Calculate(P,TS);AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");Draw(P,p3);}void C2DChangeView::Trotate(double thta)//旋转变换矩阵{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,p3);}void C2DChangeView::Treflect(double Fx,double Fy)//反射变换矩阵{ClearMatrix(TF);RedrawWindow();TF[0][0]=Fx;TF[1][1]=Fy;TF[2][2]=1;Calculate(P,TF);AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");Draw(P,p3);}void C2DChangeView::Treform(double b,double c)//错切变换矩阵{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,p3);}void C2DChangeView::KeepMatrix(double Orig[][3],double Dest[][3]){int i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)Dest[i][j]=Orig[i][j];}四、实验结果1. 初始图2 --平移(左移)2 --平移(下移)3 、缩放-——放大3 、缩放-——缩小4 、旋转5 、错切——X负向错切5 、错切——Y正向错切五、心得体会通过这次MFC对计算机图形的编程,进一步掌握了MFC的菜单的实现及其响应函数的实现。

计算机图形学 实验报告(3)

计算机图形学 实验报告(3)

(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列 的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿 着初始中心旋转90度;最后沿着y轴平移100个单位。 四、实验结果与数据处理
1、矩形在窗口内沿着水平线匀速移动
代码如下:
实验结果如图示:
2、对一个三角形分别实现平移、缩放、旋转等变化 代码如下:
三、实验内容与步骤 本实验要求完成: 1、实现矩形在窗口内沿着水平线匀速移动; 2、已知某三角形的三顶点坐标为{50.0,25.0},{150.0,25.0},
{100.0,100.0}。 要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于 屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数, 使得绘制的三角形尽可能居中显示)
怀化学院数学实验中心
《计算机图形学》 实验报告
学 号实验Biblioteka 点姓 名指导教 师
年级、班 实验时间
实验三 二维图形的几何变换
一、实验目的 1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错
切变换; 2、掌握OpenGL中模型变换函数,实现简单的动画技术。
二、实验设备(环境)及要求 硬件:普通PC386以上微机; 软件:操作系统:Windows XP,Window7; 开发语言: Turbo C 、Visual C++ 6.0、OpenGl,或其它学生掌握 的高级语言。
结果如图示:
五、分析与讨论 通过本实验的学习,我了解了二维图形的基本几何变换,如平移、
旋转、缩放、对称、错切变换;了解了OpenGL中模型变换函数,实现
简单的动画技术,在老师同学的帮助下运用OpenGL实现了矩形在窗口 内沿着水平线匀速移动。

计算机图形学实验报告4

计算机图形学实验报告4

《计算机图形学》实验报告实验九 二维图形变换一、实验教学目标与基本要求1.掌握图形变换的基本算法原理;2.实现若干典型二维图形变换算法。

二.理论基础1.生成前几次实验中的基本图形;2.对生成的基本图形进行平移、旋转、放缩、对称等变换。

3. 对计算机绘图的原理有一定的认识。

三.算法设计与分析 1.二维变换1. 平移变换2.比例变换• Sx = Sy =1等比例变换• Sx = Sy >1 放大 • Sx = Sy <1 缩小[][][]100**1101011x yxyx y xyx T y T T T ⎡⎤⎢⎥=∙=++⎢⎥⎢⎥⎣⎦[][]100**1101011x y xyx y xyT T x T y T ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎡⎤=++⎣⎦[][][]00**11000011xy x y S x y xyS S xS y∙∙⎡⎤⎢⎥=∙⎢⎥⎢⎥⎣⎦=• Sx ≠ Sy ≠13.对称变换当b=d =0, a =-1, e =1时关于Y 轴对称当b=d =0, a =1, e =-1时关于X 轴对称当b=d =0, a =-1, e =-1时关于原点对称当b=d =1, a =e =0时关于直线y=x 对称当b=d =-1, a =e =0时[][][]0**1100011a d x y xyb e a x b yd x ey⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦=++[][]''100110100011x yx yxy-⎡⎤⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥⎣⎦=-[][]''10011010011x y x y x y ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=-[][]''100110100011x y xyx y-⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=--[][]''10111000011x yx yyx⎡⎤⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥⎣⎦=[][]''010*******11xyx yyx-⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=--关于直线y=-x 对称4.旋转变换绕原点逆时针旋转θ5.错切变换• 当d=0时,x*=x+by,y*=y ,沿x 方向错切位移• 当b=0时,x*=x,y*=dx+y, 沿y 方向错切位移 • 当b ≠0时,当d ≠0时,x*=x+by,y=dx+y6.复合变换----复合平移对同一图形做两次平移相当于将两次的平移两加起来:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⋅=1010001101000110100012121221121y y x x y x y x t t t T T T T T T T T T T T复合变换----复合缩放⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⋅⋅=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⋅=1000000100000010000002121221121y y x x y x y x s s s s s s s s s s s T T T[][]''co s sin 011sin co s 001co s sin sin co s 1x yxyx y x y θθθθθθθθ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=-+[][][]10**1110101d x y xybx b y d x y⎡⎤⎢⎥=∙=++⎢⎥⎢⎥⎣⎦复合变换----复合旋转⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++-++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⋅=1000)cos()sin(0)sin()cos(1000cos sin 0sin cos 1000cos sin 0sin cos 212121212222111121θθθθθθθθθθθθθθθθr r r T T T复合变换----关于F (xf,yf)点的缩放变换先把坐标系平移到(xf,yf),在新的坐标系下做比例变换,然后再将坐标原点平移回去。

实验三二维图形编辑(一)实验报告参考模板

实验三二维图形编辑(一)实验报告参考模板

AutoCAD课程上机实验报告实验序号:实验三实验名称:二维图形编辑(一)班级:08计科学号:2008032514 姓名:黄智华分组人数:5 人指导老师:李伙友实验日期:年月日实验成绩:一、实验目的及要求目的:1.理解选择集概念,熟练掌握各种对象选择方式。

2.熟练掌握二维图形编辑(ERASE、COPY、MIRROR、OFFSET、ARRAY、MOVE、LENGTH、TRIM、EXEND、BREAK等)命令的使用。

3.熟悉掌握绘图环境设置(图形单位、图形范围、对象颜色、对象线型和对象线宽)。

4.熟练掌握辅助绘图工具(栅格显示、网格捕捉、正交模式、对象捕捉和自动跟踪)。

要求:1.将图形绘制在文件“实验三二维图形编辑(一)”中,图形界限为120*90,绘图尺寸自定,但要与原图相似。

2.绘图时设置合适的绘图环境。

3.绘图时使用合适的绘图工具。

4.使用绘图、编辑、辅助绘图命令绘制图形。

5.尺寸标注略。

二、实验环境本次上机实践所使用的平台为:windows7操作系统所使用的软件为:AutoCAD 2006三、实验内容绘制图s5-1、图s5-2、图s5-3、图s5-4所示的图形。

四、实验主要步骤1.绘制图s5-1:1)启动AutoCAD2006系统,进入AutoCAD2006绘图界面。

2)用LIMITS命令设置图形界限为120-90。

3)用ZOOM命令及“全部”选项设置绘图区为图界范围。

4)用LINE命令、正交方式和45度极轴追踪方式绘制图s5-1的基本图形(三角旗)。

5)用COPY、MOVE、MIRROR、ROTATE和ALIGN命令及对象捕捉绘制s5-1其余图形。

2.绘制图s5-2:1)用LINE命令、网格捕捉喝正交方式绘制辅助线。

2)用CIRCLE和LINE命令,以及对象捕捉功能绘制图形。

3)用TRIM命令修剪圆绘制图形。

4)用ERASE命令删除辅助线,生成s5-2图形。

3.绘制图形s5-31)用CIRCLE和LINE命令,以及对象捕捉功能绘制图形。

实验二维图形基本变换

实验二维图形基本变换

实验一二维图形的基本变换一.实验目的1、掌握CAD图形处理的原理和方法;2、通过上机操作,熟悉多边形的平移、比例和旋转变换,掌握二维图形的基本变换。

3、理解CAD对图形进行复合变换(平移、比例和旋转变换)的过程。

二.实验要求1、上机调试所编程序,实现图形的绘制、平移变换、比例变换和旋转变换。

2、二维图形各点的坐标、平移、比例、旋转角度可由用户任意输入,原图形和变换后的图形必须同时显示在显示器上。

三.实验设备1、计算机系统;2、安装Turbo C或其他C语言集成开发工具四.实验原理在计算机图形处理中,经常需要对已经生成的图形进行几何变换处理。

例如,改变原始图形的大小、移动图形到某一指定位置或根据需要将图形旋转某一个角度,这就要求图形的处理软件能够实现缩放、平移、旋转等几何变换。

由于点是构成一个几何形体的最基本的元素,而一幅二维图形可以看成是一个点集,如三角形有三个特征点……,因此,我们就可以把对图形的几何变换归结对点的变换。

通过对构成几何图形的特征点集的几何变换即可实现整个图形的几何变换。

即如何实现一个旧点到变化后新点的计算求解是本次实验的重点。

我们给出平移、比例、旋转变换的矩阵分别为:平 移: T t =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1010001n m (m,n 分别为x,y 方向上的平移量) 全比例: T s =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000b a (a,b 分别为x,y 方向上的比例因子)旋 转: T r =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ (θ为旋转角,逆时针为正)假设一几何图形由A(x A,y A ) B(x B ,y B ) C(x C ,y C ) D(x D ,y D )四点组成,那么变换后四点坐标为A ’(x ’A,y ’A ) B ’(x ’B ,y ’B ) C ’(x ’C ,y ’C ) D ’(x ’D ,y ’D )平移:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T t =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1010001n m =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡++++++++1111n Y m X n Y m X n Y m X n Y m X D D C C B B A A 比例:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T s =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000b a =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B B A bY aX bY aX bY aX bY aX旋转:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T r =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡+-+-+-+-1cos sin sin cos 1cos sin sin cos 1cos sin sin cos 1cos sin sin cos θθθθθθθθθθθθθθθθC D D D C C C C B B B BA A A A Y X Y X Y X Y X Y X Y X Y X Y X 由以上的推导过程,我们得到变换前点与变化后点的关系,进而可以用图形处理软件实现相应的变换。

二维图形几何变换

二维图形几何变换

《计算机图形学》实验报告题目:二维图形几何变换院、系(院):计算机科学与技术学院专业及班级:姓名:学号:日期:1.实验目的1)掌握3*3矩阵乘法运算的编程实现;2)掌握平移,比例,旋转三种基本二维几何变换矩阵生成; 3)掌握相对于任意参考点的二维复合变换矩阵生成。

2.实验要求1)设计实现二维图形变换类,具有平移,比例,旋转二维几何变换功能,以及相对于任意参考点的二维复合变换功能;2)将2.2节直线类所绘制的菱形线框,绕最上端A 点匀速旋转,并要求相对于A 点来回缩放;3)使用双缓冲机制进行图形绘制,避免运动闪烁,所有图形先绘制到用户自定义的DC ,绘制完成后再统一拷贝到屏幕DC 。

3.详细设计3.1核心算法及类型设计平移变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1010001Tt ty tx 旋转变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=100cos sin 0sin cos Tr αααα比例变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1000000sy sx Ts相对于任意参考点的旋转变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=1010001100cos sin 0sin cos 1010001T ty tx ty tx fr αααα 相对于任意参考点的比例变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=101000110000001010001T ty tx sy sx ty tx fs3.2程序设计实现及流程开始定义变量a,A,points[4], s,step,tans,theta,*line 设置坐标系, 绘制双缓冲机制, 绘制坐标轴。

200→a, (0,a)→A,points[0].x ←0, points[0].y ←a; points[1].x ←a, points[1].y ←0; points[2].x ←0, points[2].y ←-a; points[3].x ←-a,points[3].y ←0;s+step →s;tans.ScalePoint(s,s,A); theta=0.0;tans.RotatePoint(theta,A);-step →step;结束(s>=2.0||s<=0.5)theta>=360.0theta=0.0绘制菱形的AB,BC,CD,DA 四条边拷贝内存图到屏幕Invalidate(FALSE)4.典型测试结果5.实验问题总结通过本次试验让我有一次对MFC有了进一步的了解,在本次实验中我也遇到了一些错误,但是经过后来我和同学的讨论也得到了改正,本次试验让我进一步熟悉了二维图形几何变换的过程及变换矩阵。

计算机图形学二维几何变换

计算机图形学二维几何变换
可利用矩阵形式表示成:
简记成p‘=P*S,
其中
是比例变换矩阵。
3
3.1.3 二维对称变换
二维对称变换(或称反射变换)是产生物体镜像的一种变 换,该变换实际上是比例变换的几种特殊情况。 1、以y轴为对称线的对称变换 2、以x轴为对称线的对称变换
3、以原点为对称的对称变换
4、以直线y=x为对称线的对称变换 5、以直线y=-x为对称线的对称变矩换阵表矩示阵形表式示为形:式为:
图元点的坐标值满足关系式 x'=xcosθ-ysinθ
y'=xsinθ+ycosθ
用矩阵形式表示成[x’ y’]=[x y] ·[
]
简记为P'=P·R,其中 转变换矩阵。
是旋
5
3.1.5 二维错切变换
二维错切变换:是一种会使物体形状发生变化的 变换。常用的错切变换有两种:
1、图形沿x方向的错切
2、图形沿y方向的错切
步骤(2)
变换后的图形
(1)平移物体使固定点与坐标原点重合; (2)相对于坐标原点的比例变换; (3)平移物体使固定点回到原始位置。
11
该变换顺序的复合变换矩阵为:
12
3.1 二维几何变换
二维几何变换就是在平面上对二维点的 坐标进行变换,从而形成新的坐标。主 要包括:平移、比例、对称、旋转、错 切、仿射和复合变换。
13Βιβλιοθήκη 1.1 二维平移变换如图所示,它使图形移动位置。新图p‘的每一图元点是 原图形p中每个图元点在x和y方向分别移动Tx和Ty产生, 所以对应点之间的坐标值满足关系式 x'=x+Tx y'=y+Ty
结论:平移、比例、对称、旋转和错切变换是 二维仿射变换的特例,任何常用的二维仿射变 换总可表示为这五种变换的组合。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形变换学生姓名学号专业班级指导教师日期成绩评定表二维图形变换1. 实验内容完成对北极星图案的缩放、平移、旋转、对称等二维变换。

首先要建好图示的北极星图案的数据模型(顶点表、边表)。

另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。

2. 实验环境操作系统:Windows XP开发工具:visual studio 20083. 问题分析为了建立北极星图形,首先在二维空间中根据坐标绘制出北极星图形。

并且在此坐标系中确定好走笔顺序以便于进行连线操作。

同时需要好好的使用清屏函数以使得显示正常。

1. 放大缩小变换放大缩小变换公式为:x’=x.a, y’=y.d; 其中a,d分别为x,y方向的放缩比例系数。

可通过不同的比例系数来显示程序运行结果。

当a=d时为等比例放缩操作。

可令变换矩阵为T。

2. 对称变换包括以x轴对称、y轴对称和原点O对称三种。

由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。

在第一象限画出一个三角形,然后分别求出三个对称图形。

3. 旋转变换将图形上的点(x,y)旋转θ角度,得到新的坐标(x’,y’)为:x’=xcosθ-ysinθ, y’=xsinθ+ycosθ;旋转矩阵T为4.平移变换4. 算法设计5. 源代码//北极星void hzbjx(CDC* pDC,long x[18],long y[18]){CPen newPen1,*oldPen;newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0));oldPen = pDC->SelectObject(&newPen1);POINTvertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]},{ x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}};pDC->Polyline(vertex1, 11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0));oldPen = pDC->SelectObject(&newPen1);POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}};pDC->Polyline(vertex2, 5);POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}};pDC->Polyline(vertex3, 5);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(255,0,90));oldPen = pDC->SelectObject(&newPen1);POINTvertex4[11]={{x[12],y[12]},{x[13],y[13]},{x[3],y[3]},{x[9],y[9]},{x[14],y[14]},{x[15],y[15]},{x[ 3],y[3]},{x[11],y[11]},{x[12],y[12]},{x[3],y[3]},{x[14],y[14]}};pDC->Polyline(vertex4, 11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(0,100,255));oldPen = pDC->SelectObject(&newPen1);POINT vertex5[5]={{x[15],y[15]},{x[16],y[16]},{x[3],y[3]},{x[16],y[16]},{x[7],y[7]}};pDC->Polyline(vertex5, 5);POINT vertex6[5]={{x[2],y[2]},{x[17],y[17]},{x[3],y[3]},{x[17],y[17]},{x[13],y[13]}};pDC->Polyline(vertex6, 5);pDC->SelectObject(oldPen);Sleep(10);}void CDiamondView::Polaris() {InvalidateRgn(NULL);UpdateWindow();CDC *pDC = GetDC();long x[18],y[18];x[1]=553,y[1]=100;x[2]=515,y[2]=251;x[3]=553,y[3]=338;x[4]=516,y[4]=426;x[5]=553,y[5]=551;x[6]=589,y[6]=253;x[7]=591,y[7]=426;x[8]=678,y[8]=212;x[9]=641,y[9]=311;x[10]=454,y[10]=438;x[11]=478,y[11]=364;x[12]=415,y[12]=338;x[13]=466,y[13]=301;x[14]=703,y[14]=338;x[15]=640,y[15]=375;x[16]=665,y[16]=450;x[17]=440,y[17]=226;hzbjx(pDC,x,y);Sleep(500);InvalidateRect(NULL);long x1[18],y1[18]; //缩小for(double n=1;n>=0.5;n-=0.01) {for (int i=1;i<18;i++){x1[i]=Round(x[i]*n);y1[i]=Round(y[i]*n);}hzbjx(pDC,x1,y1);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();long x2[18],y2[18]; //放大for(double n=1;n<=1.5;n+=0.01) {for (int i=1;i<18;i++){x2[i]=Round(x1[i]*n);y2[i]=Round(y1[i]*n);}hzbjx(pDC,x2,y2);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL);hzbjx(pDC,x,y);Sleep(500);long x3[18],y3[18]; //沿X轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x3[j]=x[j]+n;y3[j]=y[j];}hzbjx(pDC,x3,y3);Sleep(1);InvalidateRect(NULL); UpdateWindow();}long x4[18],y4[18]; //沿Y轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x4[j]=x3[j];y4[j]=y3[j]+n;}hzbjx(pDC,x4,y4);Sleep(1);InvalidateRect(NULL); UpdateWindow();}long x5[18],y5[18]; //顺时针旋转for (double t=0;t<=PI;t+=0.01){for(int k=1;k<18;k++){x5[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y5[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x5,y5);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x6[18],y6[18]; //逆时针旋转for (double t=PI;t>=0;t-=0.01){for(int k=1;k<18;k++){x6[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y6[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x6,y6);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x7[18],y7[18];//沿X=1000对称for(int l=1;l<18;l++){x[l]=Round(x[l]*0.5);y[l]=Round(y[l]*0.5);x7[l]=1000-x[l];y7[l]=y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x7,y7);Sleep(200);long x8[18],y8[18];//沿Y=600对称for(int l=1;l<18;l++){x8[l]=x[l];y8[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x8,y8);Sleep(200);long x9[18],y9[18];for(int l=1;l<18;l++){x9[l]=1000-x[l];y9[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x9,y9);}6. 程序运行结果图1 北极星图案的数据模型图2 北极星图案的缩放图3 北极星图案的平移图4 北极星图案的旋转图5 北极星图案的对称7. 总结在这次的实验中,我根据图形变换的基本原理简单实现了图形的几种变换。

但是由于自己对框架和函数运用的不熟悉,在实验中遇到了一些本可以被避免的困难。

因此,以后必须要在这方面有所改进。

通过这次的实验,我知道了如何利用程序进行二维图形的一些基本变换。

在以后的学习过程我还需要不断努力,这样才能在这门课程的学习中有所收获。

相关文档
最新文档