二维几何变换课程设计
- 格式:doc
- 大小:153.00 KB
- 文档页数:8
实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 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的菜单的实现及其响应函数的实现。
宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:7 实验项目名称:二维图形变换菜单菜单项ID值图形变换(&T)缩放(&Z)ID_TRANSFORM_SCALE图形变换(&T)旋转(&R)ID_TRANSFORM_ROTATE图形变换(&T)对称(&S)ID_TRANSFORM_SYMMETRY 4、在CTransView视图类中添加消息映射函数;对象消息函数ID_TRANSFORM_SCALE COMMAND OnFigureCirleID_TRANSFORM_ROTATE COMMAND OnFigureEllipseID_TRANSFORM_SYMMETRY COMMAND OnTransformSymmetry5、添加自定义的成员变量: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;6、在视图类的OnDraw()函数中加入下列代码,实现视图绘图。
void CTransView::OnDraw(CDC* pDC){CTransDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//绘出以以(540,220)、(670,130)、(560,120)为顶点的三角形。
pDC->MoveTo(Pt[0]);pDC->LineTo(Pt[1]);三、运行结果变换前:对称变换:缩放变换:旋转变换:五、教师评语成绩签名:日期:年月日。
二维图形变换是平面几何中不可避免的一个环节。
它是指将一个平面上的图形,按照一定的规则进行平移、旋转、翻转等操作,从而新生成一个以原图形为基础的图形,这一系列操作就叫做二维图形变换。
在图形学、计算机视觉、计算机图形学、技术、动画等领域都有广泛的应用。
本文将介绍视觉图形的平移、旋转、翻转等变换方式及其位置作用。
一、平移变换平移变换是指将图形沿着某个方向移动一定的距离。
在平移变换中,原始图形的形状和大小保持不变,只是位置发生变化。
[pic1.png]上图中的矩形为原始图形,向右移动5个单位长度后得到的新图形为平移后的图形。
可以看出,平移后的图形与原始图形形状相同,只是位置发生了变化。
二、旋转变换旋转变换是指将图形绕着某个点旋转一定的角度。
在旋转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。
[pic2.png]上图中的矩形为原始图形,绕点A逆时针旋转45°后得到的新图形为旋转后的图形。
可以看出,旋转后的图形与原始图形大小和形状相同,只是方向偏转了45°。
三、翻转变换翻转变换是指将图形绕着某个轴对称翻转。
在翻转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。
[pic3.png]上图中的矩形为原始图形,绕着红色虚线所示的轴对称翻转后得到的新图形为翻转后的图形。
可以看出,翻转后的图形与原始图形大小和形状相同,只是方向发生了变化。
四、位置作用在二维图形变换中,原始图形和变换后的图形在位置上是有一定关系的。
例如,在平移变换中,原始图形向右平移5个单位长度,所得到的新图形的位置就比原始图形向右偏移了5个单位长度。
但是,若考虑到坐标系的影响,则需对图形的顶点进行坐标变换。
以平移变换为例,设原图形的四个点坐标为(x1, y1)、(x2, y2)、(x3, y3)、(x4, y4),平移距离为(dx, dy),则其变换后的新点坐标为(x1+dx, y1+dy)、(x2+dx, y2+dy)、(x3+dx, y3+dy)、(x4+dx, y4+dy)。
幼儿园是孩子人生中非常重要的阶段,这个时期的学习经验可能对他们未来的职业生涯产生深远的影响。
二维空间定位与转换是幼儿园的一个重要学科,因为它会帮助孩子们了解和理解它们周围的世界。
在这篇文章中,我们将介绍一个全面的二维空间定位与转换的教案,帮助孩子们更好地掌握这个知识点。
一、教材和教学目标我们选择的教材是《幼儿园数学》第一册,内容覆盖了二维空间的定位、转换,基本图形的认识和分类等。
教学目标如下:1.学生能够简单的描述图形的位置和方向。
2.学生能够用图形的视觉表现来表示二维空间,并能够在视觉上理解图形的坐标系。
3.学生能够识别和分类平面图形。
4.学生能够对图形进行简单的对称和滑动变换。
5.学生能够使用简单的语言描述二维图形的位置和方向。
二、教学流程第一课时:二维空间的认知在这一课时中,我们将向孩子们介绍二维空间的概念,帮助他们感知平面图形和视觉空间。
我们建议使用社会化课堂的方法来进行教学:让孩子们在教师的引导下进行探索和讨论。
教学内容包括以下几个方面:1.什么是平面图形?孩子们需要了解不同的形状有不同的名称,如三角形、正方形、矩形等。
我们可以通过观察和比较不同的平面图形来让孩子们识别和分类这些形状。
2.什么是二维空间?孩子们需要学会在视觉上感知二维空间,即平面图形的长度和宽度。
我们可以使用不同的颜色或形状的纸片来帮助孩子们理解二维空间的概念。
3.如何识别二维图形的位置和方向?孩子们需要学会描述平面图形的位置和方向,如左上角、右下角、中心等。
我们可以使用不同的游戏和练习来帮助孩子们掌握这个知识点。
第二课时:二维坐标系的认知二维坐标系是二维空间定位的基础。
在这个课时中,我们将向孩子们介绍坐标系的概念,帮助他们理解坐标系的作用。
我们同样建议使用社会化课堂的方法来进行教学。
教学内容包括以下几个方面:1.什么是二维坐标系?孩子们需要学会在视觉上描述二维坐标系,即x轴和y轴的概念。
2.什么是坐标?孩子们需要了解x轴和y轴的表示方式,即用不同的数字表示不同的位置。
实验一二维图形的基本变换一.实验目的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有了进一步的了解,在本次实验中我也遇到了一些错误,但是经过后来我和同学的讨论也得到了改正,本次试验让我进一步熟悉了二维图形几何变换的过程及变换矩阵。
二维空间定位是幼儿的数学学习中十分重要的一部分,也是幼儿园大班数学学习计划中的一环。
幼儿在学习二维定位时,需要了解平面图形的组成、位置关系和转换等知识,这将对他们日后的学习奠定基础。
因此,制定一份针对大班幼儿的二维空间定位与转换教案,帮助幼儿轻松掌握该技能是非常必要的。
一、教学目标通过本次教学,目标让幼儿能够:1.认识平面图形中的点、线、面的基本概念。
2.掌握平面图形中点和线的基本属性和位置关系,并能通过观察、描述确定它们的位置。
3.认识平面图形的基本类型(正方形、长方形、圆形、三角形等)并能简单地进行分类和区分。
4.掌握空间图形的基本组成和分类,并能通过观察、描述确定它们的位置。
5.掌握平面图形的基本变换和操作(翻转、旋转、平移等),并能够进行简单的变换操作。
二、教学内容教学内容包括以下几个方面:1.平面图形中的点、线和面。
2.平面图形中点和线的基本属性和位置关系。
3.平面图形的基本类型(正方形、长方形、圆形、三角形等)。
4.空间图形的基本组成和分类。
5.平面图形的基本变换和操作。
三、教学方法1.游戏性教学法:通过数学游戏与活动带动幼儿的学习兴趣。
2.启发式教学法:通过引导幼儿思考和探究实现学习的自主化。
3.沟通式教学法:通过与幼儿的交流互动,促进师生之间的良好互动和有效沟通。
四、教学活动第一节:活动目标:“谁最聪明,谁能找到最多的图形”1.将一些平面图形分别放在教室内,为保证游戏公平,每个组都分别有相同数量的图形。
2.老师给学生解释游戏规则:每组分别到外面的小黑板上选择一个图形,当选中以后,不能再选相同的图形。
3.如果有选不出图形的小组,老师将给予提示。
4.比赛的目的:选完图形后要说出图形的名称并用尺子测出图形的长与宽。
5.谁的分数最高,谁就是赢家,得到老师特别准备的小礼物。
第二节:活动目标:“这是啥形状?”1.老师找出一些常见的几何图形,并拿出它们的图案图片进行展示。
在抽中每一张图片时,要求幼儿对图片中的几何形状进行认知。
贵州大学实验报告学院:计算机科学与信息学院专业:计算机科学与技术班级:101姓名学号实验组 6 实验时间2013.5.9 指导教师吴云成绩实验项目名称二维图形的几何变换实验目的掌握二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。
实验要求1、在VS2010环境下利用C#编程实现画二维图形的几何变换。
2、给出代码。
3、附上结果截图。
实验原理标准齐次坐标(x,y,1) 二维变换的矩阵表示平移变换旋转变换放缩变换平移变换只改变图形的位置,不改变图形的大小。
旋转变换不改变图形的形状放缩变换引起图形形状的变化。
复合变换结果与变换的顺序有关(矩阵乘法不可交换)例:对一矩形先缩放S(2,0.5),再旋转R(p/6)。
对称变换关于x轴的对称变换:关于y轴的对称变换:实验环境VS2010(C#)实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;下面缩放变化的算法实现:private void TriangleChange()//缩?小?{Pen pen = new Pen(Color.Gray, 2);int x, y;x = point.X + 50;y = point.Y - 100;Point[] points ={new Point(x,y),new Point((x+point.X+10)/2,(y+point.Y-20)/2),new Point((x+point.X+80)/2,(y+point.Y-50)/2) };graphics.DrawPolygon(pen, points);}下面是旋转变化的算法实现:实验内容1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。
2.将一四边形以原点为中心,以15°为间隔旋转。
课程设计几何变换一、教学目标本节课的教学目标是让学生掌握几何变换的基本概念和性质,包括平移、旋转、对称等,能够运用几何变换解决实际问题。
通过本节课的学习,学生应能够:1.知识目标:理解几何变换的定义和特点,掌握平移、旋转、对称等基本变换的性质和应用。
2.技能目标:能够运用几何变换解决实际问题,如计算图形在变换后的位置、大小和形状等。
3.情感态度价值观目标:培养学生的空间想象能力和逻辑思维能力,激发学生对几何变换的兴趣和好奇心。
二、教学内容本节课的教学内容主要包括以下几个部分:1.几何变换的定义和分类:平移、旋转、对称等。
2.几何变换的性质和特点:变换前后图形的位置、大小和形状等。
3.几何变换的应用:解决实际问题,如计算图形在变换后的位置、大小和形状等。
4.几何变换的练习:通过练习题,巩固所学知识,提高学生的应用能力。
三、教学方法为了达到本节课的教学目标,我将采用以下几种教学方法:1.讲授法:讲解几何变换的基本概念和性质,引导学生理解和掌握。
2.案例分析法:通过具体的例子,让学生了解几何变换的应用,培养学生的实际操作能力。
3.讨论法:学生进行小组讨论,分享学习心得和解决问题的方法,提高学生的合作能力。
4.实验法:让学生亲自动手进行几何变换实验,增强学生的实践能力和观察力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我将准备以下教学资源:1.教材:为学生提供基本的学习材料,包括几何变换的基本概念、性质和应用等。
2.参考书:为学生提供更多的学习资料,以便他们深入研究几何变换的相关知识。
3.多媒体资料:通过课件、视频等形式,生动形象地展示几何变换的性质和应用,激发学生的学习兴趣。
4.实验设备:为学生提供几何变换实验所需的器材,如尺子、剪刀、彩纸等,让他们亲自动手进行实验,增强实践能力。
五、教学评估为了全面、客观地评估学生在几何变换章节的学习成果,我将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估他们的学习态度和理解程度。
二维几何变化
一:实验目的
(1)掌握二维平移、比例、旋转几何变换矩阵
(2)掌握矩阵乘法的编程实现
(3)掌握相对于任一参考点的比例变换和旋转变换
二:二维几何变化基本理论
1. 二维平移变换
一般情况:
2. 二维比例变换
关于原点的比例变换:
如果想关于某点进行比例变换,可以先平移到这个点,进行比例变换,再平移回来。
3. 二维旋转变换
关于原点的旋转:
如果想关于某点进行旋转变换,可以先平移到这个点,进行旋转变换,再平移回来。
二:实验要求
(1)设计包含齐次坐标的二维点类CP2
(2)设计二维几何变换类
(3)设计双缓冲技术,先在MemDC中绘制,然后用BitBlt将图形复制到PDC,同时禁止背景刷新
(4)生成多边形顶点
(5)绘制几何变换图形
(6)使用定时器动态更新图形
三:实验步骤
(1)设计包含齐次坐标的二维点类CP2
(2)设计二维几何变换类
a:二维变换矩阵
b:复合变换矩阵
c:定义二维变换类CtransForm
(3)设计双缓冲
(4)读入图形顶点
(5)绘制图形
(6)定时器函数
(7)禁止背景刷新函数
四:程序代码
CTestView::CTestView()
{
// TODO: add construction code here
directionX=1; directionY=1; directionS=1;
R = 30;
translateX=1; translateY=1;
rotate = 1; scale = 1;
}
CTestView::~CTestView()
{
}
void CTestView::DoubleBuffer()
{
int flag=0;
CDC * pDC = GetDC();
CRect rect;
if(scale>2)
directionS=-1;
if(scale<-2)
directionS=1;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(rect.Width(),rect.Height());
pDC->SetViewportExt(rect.Width(),-rect.Height());
pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
CDC MemDC;
CBitmap NewBitmap,*pOldBitmap;
MemDC.CreateCompatibleDC(pDC);
NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height() );
pOldBitmap=MemDC.SelectObject(&NewBitmap);
MemDC.SetMapMode(MM_ANISOTROPIC);
MemDC.SetWindowExt(rect.Width(), rect.Height());
MemDC.SetViewportExt(rect.Width(),-rect.Height());
MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);
ReadPoint();
tran.Translate(translateX,translateY);
tran.Rotate(rotate,CP2(translateX,translateY));
tran.Scale(scale,scale,CP2(translateX,translateY));
DrawObject(&MemDC);
BorderCheck();
pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height (),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
NewBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
if(P!=NULL)
{
delete []P;
P=NULL;
}
}
void CTestView::ReadPoint()
{
double Dtheta=2*PI/degree;
P=new CP2[degree+1];
//static int x = 0;
// static int y = 0;
for(int i=0;i<degree;i++)
{
P[i].x=R*cos(i*Dtheta) ;
P[i].y=R*sin(i*Dtheta) ;
}
P[degree].x = 0;
P[degree].y = 0;
tran.SetMat(P,degree+1);
}
void CTestView::DrawObject(CDC * pDC) {
// CLine *line=new CLine;
CPen pen(PS_SOLID,1,RGB(255,0,0));
pDC->SelectObject(&pen);
for(int i=0;i<degree;i++)
{
pDC->MoveTo( ROUND(P[degree].x),ROUND(P[degree].y));
pDC->LineTo( ROUND(P[i].x),ROUND(P[i].y));
pDC->LineTo(ROUND(P[(i+1)%degree].x),ROUND(P[(i+1)%degre e].y));
}
pen.DeleteObject();
// delete line;
}
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
SetTimer(1,100,NULL);
}
BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTestView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default degree = 8;
translateX += 1*directionX;
translateY += 2*directionY;
rotate += 2;
scale+=0.5*directionS;
DoubleBuffer();
CView::OnTimer(nIDEvent); }
void CTestView::BorderCheck() {
if(P[degree].x>50)
{ d irectionX=-1;
directionY=-1;
}
if(P[degree].x<-50)
{ directionX=1;
directionY=1;
}
}
五:运行结果
六:实验总结
(1)因为首先进行的是平移变换,所以对于比例变换和旋转变换,需要进行相当于右窗格屏幕中的二维几何变换。
(2)本实验的“动画”菜单项的播放按钮的消息映射是在CMainFrame类中完成的。