第一篇:二维几何变换课程设计
二维几何变化
一:实验目的
(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)if(scale<-2)
directionS=-1;);
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);pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.HeightMemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();MemDC.DeleteDC();ReleaseDC(pDC);
BorderCheck();(),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);
} if(P!=NULL){
} delete []P;P=NULL;void CTestView::ReadPoint(){
}
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 } P[degree].x = 0;P[degree].y = 0;tran.SetMat(P,degree+1);P[i].x=R*cos(i*Dtheta);P[i].y=R*sin(i*Dtheta);// static int y = 0; } { 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} pen.DeleteObject();// delete line;e].y)); void CTestView::OnDraw(CDC* pDC){ } BOOL CTestView::OnPreparePrinting(CPrintInfo* 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;// default preparation return DoPreparePrinting(pInfo);CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here SetTimer(1,100,NULL); } rotate += 2;DoubleBuffer();CView::OnTimer(nIDEvent); scale+=0.5*directionS;void CTestView::BorderCheck(){ if(P[degree].x>50) } 五:运行结果 { directionX=-1; } { directionX=1; directionY=1;} directionY=-1; if(P[degree].x<-50) 六:实验总结 (1)因为首先进行的是平移变换,所以对于比例变换和旋转变换,需要进行相当于右窗格屏幕中的二维几何变换。 (2)本实验的“动画”菜单项的播放按钮的消息映射是在CMainFrame类中完成的。 二维动画课程设计: “公益动画短片” 要求: 1.给Flash动画配上声音、音效、音乐,片长时间为1分30秒左右。2.具体剧本内容可自己拟定。(备注:延续动画概论课程的第二次“画分镜头剧本”的作业,把静态分镜头画面完善成动态的动画短片)。3.充分运用课程知识,体现运动规律的合理性,动画的夸张性; 4.运用分镜头画面的知识来设计镜头,使用Flash软件完成动态画面。 5.完成课程设计相关说明,内容包括:操作步骤、制作过程中的图片、制作体会,参考文献等等,并说明使用的软件版本。 课程设计说明的格式要求: 第一章 公益动画短片的设计方案 (参考传统二维动画制作流程,完成前期设计阶段的描述,要求附上文字剧本、分镜头画面剧本,分镜头格式按照之前要求规范化书写)第二章 制作步骤 2.1 角色造型与场景造型的设定 2.2 按分镜头画面完成镜头的运动与组接,以及场景的转换 2.3 每一个镜头中的动画部分 2.4 声音、音效、音乐的加入 第三章 总结(心得体会) 6.应交文件:一个光盘【动画源文件(.fla)、发布文件(.swf)、课程设计说明文档电子版】; 一份打印稿纸质的文档; 备注:要自己独立完成;文件要齐全,装入课程设计袋中。 第17周星期五(12月28日)交 课 程 设 计(说 明) 题 目 姓 名 学 号 所在学院 专业班级 指导教师 日 期 年 月 日 计算机图形学 实验报告 课程名称 : 计算机图形学 实验名称 : 图形绘制与变换 学 院 : 电子信息工程学院 专 业 : 计算机科学与技术 班 级 : 11计科本 01班 学 号 : 111102020103 姓 名 : 张慧 指导教师 : 王征风 二零一四年 目录 一、引言----------------3 二、设计需求---------3 2.1 设计目标--3 2.2 设计环境--3 2.2.1 VC++6.0------------------------3 2.2.2 MFC------------------------------4 2.3 设计题目及要求----------------------4 2.4 总体流程图----------------------------4 三、课程设计原理---5 3.1 实现的算法------------------------------5 3.1.2 Bresenham算法画直线------5 3.1.3 中心点算法画圆和椭圆------5 3.2 图形变换的基本原理------------------7 3.2.1平移变换------------------------7 3.2.2 旋转变换----------------------8 3.2.3 比例变换----------------------8 四、总体设计与功能实现-------------------------8 4.1 主要界面设计---------------------------8 4.2 设置颜色界面---------------------------8 4.2.1 界面设置代码------------------8 4.2.2 运行结果------------------------9 4.3 二维线画图元实现---------------------9 4.4 画多边形功能的实现--------------13 4.5 画Bezier曲线功能的实现-------14 4.6 二维图形变换的实现--------------16 4.7 三维图形的变换--------------------17 五、实验心得体会 一、引言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。 计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,这些步骤从而实现一个完整的OpenGL程序效果。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。 通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。 二、设计需求 2.1 设计目标 以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。 2.2 设计环境 2.2.1 VC++6.0 VC++6.0是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架,而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++提供的 高度可视化的应用程序开发工具和 MFC 类库,可使应用程序开发变 得简单。2.2.2 MFC MFC(Microsoft Foundation Classes),是 一 个 微 软 公 司 提 供 的 类 库(class libraries)以 C++类的形式封装了 Windows 的 API,它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组 件的封装类。MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所 有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。 2.3 设计题目及要求 (1)题目:实现多边形和曲线的绘制和变换 (2)要求:学会使用VC++编写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变换,及三维立体图形的相应变换.2.4 总体流程图 三、课程设计原理 3.1 实现的算法 3.1.1 DDA算法画直线 DDA是数字微分分析式(Digital Differential Analyzer)的缩写。 已知直线两端点(x1,y1)、(x2,y2)则斜率m为:m =(y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式: xi+1=xi+Dx yi+1=yi+Dy。 递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体算法是: 该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)=-9;Integer(8.5)=8;Sign(i),根据i的正负,分别得到-1,0,+1; 相应代码: //DDA DrawLine {if(abs(x2-x1)> abs(y2-y1)) length = abs(x2-x1); else length = abs(y2-y1); Dx =(x2-x1)/length; Dy =(y2-y1)/length; x = x1+0.5*Sign(Dx); y = x2 + 0.5*Sign(Dy); i = 1; while(i <= lenght) { setpixel(Integer(x),Integer(y),color); x= x + Dx; y= y + Dy; i+=1;} } 3.1.2 Bresenham算法画直线 思路如下: // 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).// 根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1),否则,下个点为B(x1+1,y1),3.画点(U或者B).4.跳回第2步.5.结束.3.1.3中心点算法画圆和椭圆 (1)中心点算法画圆 在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。生成圆弧的中点算 法和上面讲到的生成直线段的中点算法类似。 考虑第一象限内x[0,R/2]的八分之一圆弧段。经过计算,得出判别式的递推公式为: di1di2xi3di2(xiyi)5d0d0 (xi, M SE yi,r)E 这两个递推公式的初值条件为: (x0,y0,r)(0,R)d05/4R 编写成员函数如下: void CMy2_9View::MidPointEllipse(CDC *pDC, double a, double b, int color){ double x,y,d,xP,yP,squarea,squareb; squarea=a*a; squareb=b*b; xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb))); yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb))); x=0; y=b; d=4*(squareb-squarea*b)+squarea; pDC->SetPixel(x,y,color); while(x<=xP) {if(d<=0)d+=4*squareb*(2*x+3); else {d+=4*squareb*(2*x+3)-8*squarea*(y-1); y--;} x++; pDC->SetPixel(x,y,color);} x=a; y=0; d=4*(squarea-a*squareb)+squareb; pDC->SetPixel(x,y,color); while(y { if(d<=0)d+=4*squarea*(2*y+3); else {d+=4*squarea*(2*y+3)-8*squareb*(x-1); x--;} y++; pDC->SetPixel(x,y,color);}} 编写OnDraw函数如下: void CMy2_9View::OnDraw(CDC* pDC){CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心点算法画椭圆 我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有X轴对称、Y轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x,-y)、(-x, y)和(-x,-y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。 相应代码: void MP_Ellipse(int xc , int yc , int a, int b){ double sqa = a * a;double sqb = b * b;double d = sqb + sqa *(-b + 0.25);int x = 0;int y = b;EllipsePlot(xc, yc, x, y);while(sqb *(x + 1)< sqa *(y1))* 2-(a * b)* 2;while(y > 0){if(d < 0){ d += sqb *(2 * x + 2)+ sqa *(-2 * y + 3);x++;} else {d += sqa *(-2 * y + 3);} y--;EllipsePlot(xc, yc, x, y);}} 3.2 图形变换的基本原理 3.2.1平移变换 平移变换函数如下: void glTranslate{fd}(TYPE x, TYPE y, TYPE z); 三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。 3.2.2 旋转变换 旋转变换函数如下: Void glRota{fd}TYPE angle, TYPE x, TYPE y, TYPE z); 函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。3.2.3 比例变换 比例变换函数如下: Void glScale{fd}(TYPE x, TYPE y, TYPE z); 单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若x小于1.0,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。 四、总体设计与功能实现 4.1 主要界面设计 4.2 设置颜色界面 4.2.1 界面设置代码: void CGraphicsView::OnClock(){ WHAT_TO_DO=ID_CLOCK; clean();int xx = 450, yy = 300, r = 150,d = 5;int i, white = RGB(255,255,255);mile(xx, yy, r, COLOR);Matrix m(xx, 240), s(xx, 200);Matrix t1(xx, yy, true), t2(-xx,-yy, true), mr(PI/1800), sr(PI/30);mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(), d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR); for(i=0;i<120;i++){ ::Sleep(80); mile(m.getx(), m.gety(), d+1, white);mile(s.getx(), s.gety(), d, white);dne(m.getx(), m.gety(), xx, yy, white);dne(s.getx(), s.gety(), xx, yy, white);m = t1*mr*t2*m;s = t1*sr*t2*s;mile(m.getx(), m.gety(), d+1, COLOR);mile(s.getx(), s.gety(),d, COLOR);dne(m.getx(), m.gety(), xx, yy, COLOR);dne(s.getx(), s.gety(), xx, yy, COLOR);}} 4.2.2 点击“设置--颜色”后,运行结果如下: 4.3 二维线画图元实现 4.3.1 实现代码: void CGraphicsView::MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int r,x,y,deltax,deltay,d;r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0));x=0;y=r;deltax=3;deltay=2-r-r;d=1-r;while(x<=y){ ::Sleep(time); pdc->SetPixel(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,-x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,-x+y0,color); if(d<0) { d+=deltax; deltax+=2; x++;} else { d+=deltax+deltay; deltax+=2; deltay+=2; x++; y--;}}} void CGraphicsView::midellispse(int xx, int yy, int r1, int r2, int color){ } void CGraphicsView::Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color){ xx0=(x2+x1)/2;yy0=(y2+y1)/2;rra=abs(x2-x1)/2;rrb=abs(y2-y1)/2;if(rra==0 && rrb==0)return;Ellipse0(pdc,xx0,yy0,rra,rrb,color);} void CGraphicsView::Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color){ int i,yy;int x,y,deltax,deltay;int aa,aa2,aa3,bb,bb2,bb3;double d1,d2;aa=a*a;aa2=aa*2;aa3=aa*3;bb=b*b;bb2=bb*2;bb3=bb*3;x=0;y=b;d1=bb+aa*(-b+0.25);deltax=bb3;deltay=-aa2*b+aa2;pdc->SetPixelV(x+x0,y+y0,color);pdc->SetPixelV(x+x0,-y+y0,color);while(bb*(x+1) yy=y; if(d1<0) { d1+=deltax; deltax+=bb2; x++;} else { d1+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--;} ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;deltax-=bb;deltay+=aa;while(y>0){ if(d2<0) { d2+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--;} else { d2+=deltay; deltay+=aa2; y--;} ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color);}} void CGraphicsView::DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color){ int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx>=0) s1=1;else s1=-1;dy=y1-y0;if(dy>=0) s2=1;else s2=-1;dx=abs(dx);dy=abs(dy);if(dx>=dy){ s=0; di=(int)dx; k=dy/dx*s2;} else { s=1; di=(int)dy; k=dx/dy*s1;} x=x0;y=y0;for(int i=0;i<=di;i++){if(s==0) { xx=(int)x; yy=(int)(y+0.5); ::Sleep(time); pdc->SetPixel(xx,yy,color); x+=s1; y+=k;} else{ xx=(int)(x+0.5); yy=(int)y; ::Sleep(time); pdc->SetPixel(xx,yy,color); y+=s2; x+=k;}}} 4.3.2 点击二维线画图元,课相应画出直线、圆和椭圆,结果如下: 4.4 画多边形功能的实现 4.4.1 部分实现代码: void CGraphicsView::OnDrawDuoBX(){ Vertex_Count dlg;if(dlg.DoModal()==IDOK){ if(dlg.m_vertex_count>MAX) { MessageBox(“输入顶点数过大”); return;} VertexTotal=dlg.m_vertex_count; CDC *pDC=GetDC(); CPen pen(PS_SOLID,2,RGB(255,255,255)); CPen *pOldpen=pDC->SelectObject(&pen); pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); int i; for(i=1;i pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5)); pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); pDC->SelectObject(pOldpen); ReleaseDC(pDC); inLength=0; outLength=0; WHAT_TO_DO=ID_DrawDuoBX;}} 4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下: 4.5 画Bezier曲线功能的实现 4.5.1 部分实现代码: void CGraphicsView::OnBezier(){ // TODO: Add your command handler code here WHAT_TO_DO=ID_BEZIER;CDC *p=GetDC(); p->TextOut(10, 20, “PS:鼠标左键添加曲线,鼠标右键修改曲线.”); ReleaseDC(p);} void CGraphicsView::OnBezierClear(){ n =-1;RedrawWindow();} void CGraphicsView::DrawBezier(DPOINT *p){ if(n <= 0)return;if((p[n].x < p[0].x+1)&&(p[n].x > p[0].x-1)&&(p[n].y < p[0].y+1)&&(p[n].y > p[0].y-1)){ pDC->SetPixel(p[0].x, p[0].y, COLOR); return;} DPOINT *p1;p1 = new DPOINT[n+1];int i, j;p1[0] = p[0];for(i=1;i<=n;i++){ for(j=0;j<=n-i;j++) { p[j].x =(p[j].x + p[j+1].x)/2; p[j].y =(p[j].y + p[j+1].y)/2;} p1[i] = p[0];} DrawBezier(p);DrawBezier(p1);delete p1;} void CGraphicsView::OnBezierAdd(){ AddorMove = 1;} void CGraphicsView::OnBezierMove(){ AddorMove =-1;} void CGraphicsView::OnMouseMove(UINT nFlags, CPoint point){ switch(WHAT_TO_DO){ case ID_BEZIER: { if(current >= 0){ points[current].x = point.x; points[current].y = point.y; RedrawWindow();} if(current2 >= 0) { points[current2].x = point.x; points[current2].y = point.y; RedrawWindow();} break;} default:break;} CView::OnMouseMove(nFlags, point);} 4.5.2 点击曲线--Beizer曲线,可实现Beizer曲线的绘制功能,绘制结果如下图: 图 1 图 2 4.5.3 点击曲线--Beizer曲线,可实现Beizer曲线的移动,鼠标点击其中的任一点,可实现曲线的移动,绘制结果如下图: 上图1移动后的曲线 上图2移动后的曲线 4.6 二维图形变换的实现 可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下: void CGraphicsView::OnXuanzhuan(){ WHAT_TO_DO=ID_XUANZHUAN; time=0; OnClear(); CClientDC dc(this);CDC* pDC=&dc; int i, white=RGB(255,255,255), point [2][2]={{300,200},{300,250}}; Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]); int midx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2; Matrix t1(midx, midy,true), t2(-midx,-midy,true); Matrix r(PI/50); Matrix temp(midx, midy,true); temp = t1*r*t2; for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b; MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);} for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC,a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b; MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);} time=5;} void CGraphicsView::OnUpdateXuanzhuan(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);} void CGraphicsView::OnScale(){ WHAT_TO_DO=ID_SCALE; OnClear();CClientDC dc(this);CDC* pDC=&dc; time=0;int i,white=RGB(255,255,255), point[4][2]={{300,250},{400,250},{300,300},{400,300}};float sx=0.9,sy=0.85;int midx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2;Matrix s1(sx,sy),s2(1/sx,1/sy);Matrix t1(midx, midy,true), t2(-midx,-midy,true); Matrix a(point[0][0],point[0][1]), b(point[1][0],point[1][1]);Matrix c(point[2][0],point[2][1]), d(point[3][0],point[3][1]);Matrix temp(midx, midy,true);temp = t1*s1*t2;DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR);DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp = t1*s2*t2;for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} time=5;} void CGraphicsView::OnUpdateScale(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);} 4.7 三维图形的变换 主要实现三维图形的上下左右平移,分别绕X轴Y轴Z轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变 4.7.1 部分代码如下: void CGraphicsView::OnAoduomianti(){ WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlg1;dlg1.DoModal();} void CGraphicsView::OnUpdateAoduomianti(CCmdUI* pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);} void CDrawDLG::OnPaint() { CPaintDC dc(this);// device context for painting CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();// CDC *PDC=pWnd->GetDC();Draw();} void CDrawDLG::Draw(){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect);D v[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8]; POINT p0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8];int z[8]; for(int i=0;i<8;i++){ d[i].x=v[i].x; d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU)); d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU)); v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU)); v[i].y=d[i].y; v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU)); d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU)); d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU)); d[i].z=v[i].z; w[i].x=d[i].x+cx; w[i].y=d[i].y+cy; z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3];p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7]; p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4];p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5];p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4];switch(Maxnum(z,7)){ case 0:fill(p0,p2,p5,0,2,5);break; case 1:fill(p0,p2,p3,0,2,3);break; case 2:fill(p0,p3,p4,0,3,4);break; case 3:fill(p0,p4,p5,0,4,5);break; case 4:fill(p1,p2,p5,1,2,5);break; case 5:fill(p1,p2,p3,1,2,3);break; case 6:fill(p1,p3,p4,1,3,4);break; case 7:fill(p1,p4,p5,1,4,5);break;}} BOOL CDrawDLG::OnInitDialog(){ CDialog::OnInitDialog();m_scroll1.SetScrollRange(-180,180);m_scroll1.SetScrollPos(0);m_scroll2.SetScrollRange(-180,180);m_scroll2.SetScrollPos(0);m_scroll3.SetScrollRange(-180,180);m_scroll3.SetScrollPos(0);m_scroll4.SetScrollRange(0,350);m_scroll4.SetScrollPos(200);m_scroll5.SetScrollRange(0,300);m_scroll5.SetScrollPos(115);m_scroll6.SetScrollRange(0.00,300.00);m_scroll6.SetScrollPos(50.00);a=b=c=0;fs=50.00;SetTimer(1,100,NULL);Ctrl=0;cx=200;cy=115;COLOR1=RGB(123,234,43);COLOR2=RGB(123,123,0);COLOR3=RGB(123,24,235);COLOR4=RGB(0,123,95);COLOR5=RGB(23,234,34);COLOR6=RGB(234,124,0);COLOR7=RGB(0,43,98);return TRUE;// return TRUE unless you set the focus to a control} void CDrawDLG::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){ int nID=pScrollBar->GetDlgCtrlID();switch(nID){ case IDC_SCROLLBAR1: a=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: a--;break; case SB_LINERIGHT: a++;break; case SB_PAGELEFT: a-=10;break; case SB_PAGERIGHT: a+=10;break; case SB_THUMBTRACK: a=nPos;break;} if(a<-180)a=180; if(a>180)a=-180; pScrollBar->SetScrollPos(a); break;case IDC_SCROLLBAR2: b=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: b--;break; case SB_LINERIGHT: b++;break; case SB_PAGELEFT: b-=10;break; case SB_PAGERIGHT: b+=10;break; case SB_THUMBTRACK: b=nPos;break;} if(b<-180)b=180; if(b>180)b=-180; pScrollBar->SetScrollPos(b); break;case IDC_SCROLLBAR3: c=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: c--;break; case SB_LINERIGHT: c++;break; case SB_PAGELEFT: c-=10;break; case SB_PAGERIGHT: c+=10;break; case SB_THUMBTRACK: c=nPos;break;} if(c<-180)c=180; if(c>180)c=-180; pScrollBar->SetScrollPos(c); break;case IDC_SCROLLBAR4: cx=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: cx--;break; case SB_LINERIGHT: cx++;break; case SB_PAGELEFT: cx-=10;break; case SB_PAGERIGHT: cx+=10;break; case SB_THUMBTRACK: cx=nPos;break;} if(cx<0)cx=200; if(cx>350)cx=200; pScrollBar->SetScrollPos(cx); break;case IDC_SCROLLBAR5: cy=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: cy--;break; case SB_LINERIGHT: cy++;break; case SB_PAGELEFT: cy-=10;break; case SB_PAGERIGHT: cy+=10;break; case SB_THUMBTRACK: cy=nPos;break;} if(cy<0)cy=300; if(cy>300)cy=0; pScrollBar->SetScrollPos(cy); break; case IDC_SCROLLBAR6: fs=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_LINELEFT: fs--;break; case SB_LINERIGHT: fs++;break; case SB_PAGELEFT: fs-=0.55;break; case SB_PAGERIGHT: fs+=0.55;break; case SB_THUMBTRACK: fs=nPos;break;} if(fs<0)fs=50; if(fs>300)fs=50; pScrollBar->SetScrollPos(fs); break;// UpdateData(FALSE);} // Invalidate();Draw();CDialog::OnHScroll(nSBCode, nPos, pScrollBar);} void CDrawDLG::OnOK(){ KillTimer(1); CDialog::OnOK();} int CDrawDLG::Maxnum(int *p, int n){ int max=p[0];int x;for(int i=0;i<=n;i++){ if(max<=p[i]) { max=p[i];x=i;} } return x;} void CDrawDLG::fill(POINT *x, POINT *y, POINT *z, int i,int j,int q){ CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CRect rect;pWnd->GetClientRect(rect); CDC dcmem;dcmem.CreateCompatibleDC(pDC);CBitmap bmp,*oldbmp;bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());oldbmp=dcmem.SelectObject(&bmp);CBrush brush[6];brush[0].CreateSolidBrush(COLOR1);brush[1].CreateSolidBrush(COLOR2);brush[2].CreateSolidBrush(COLOR3);brush[3].CreateSolidBrush(COLOR4);brush[4].CreateSolidBrush(COLOR5);brush[5].CreateSolidBrush(COLOR6);CBrush *oldbrush=dcmem.SelectObject(&brush[i]);dcmem.FillSolidRect(rect,COLOR7);dcmem.Polygon(x,4);dcmem.SelectObject(&brush[j]);dcmem.Polygon(y,4);dcmem.SelectObject(&brush[q]);dcmem.Polygon(z,4);dcmem.SelectObject(oldbrush);for(int b=0;b<6;b++)brush[b].DeleteObject();pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcmem,0,0,SRCCOPY);dcmem.SelectObject(oldbmp);bmp.DeleteObject();dcmem.DeleteDC();} 4.7.2 运行结果如下: (1)实现多面体的上下左右平移(2)实现多面体的绕轴旋转: (3)实现多面体的放大缩小: (4)实现多面体及背景的颜色设置: (5)三维图形变换整体图形 五、实验心得体会 在本次课程设计过程中,基本掌握了计算机图形学关于图形绘制变换的基础知识,DDA法画直线和中心点法画圆及椭圆的方法,还对图形的变换及需要用到的一系列的函数有了相应的理解,也了解的很多有关于图形学中三维图形的变换的知识。不过都只是皮毛而已,从中锻炼了自己的动手做实验的能力,但同时也让自己看清了自己的水平,以便在以后的生活里多加强有关这方面的学习,从而提升自己在图形学方面的知识水平。 在本次课程设计中,设计方案存在着很多的死板化的实现方法,也是很不人性化的一点,只提供了画一种曲线的方法,且画出的曲线只能移动,此为本次设计方案的不足之一;然后就是能实现曲面和多边形的绘制,却没有对应的实现绘制好图形后直接对其进行平移、选择等变换,此为设计方案不足之二。再者就是三维图形只能实现变换不能实现绘制,此为设计方案不足之三。鉴于个人能力真的有限,所以只能设计出此种级别的效果了。因为实验重要的只是思想过程,效果的不美观只能是因为学习的知识还远远不够,所以不能设计出完美的全面的图形绘制变换程序。 经过此次设计,使我学到了很多东西,在没有开始做程序之前,没有任何思路,不知道该从哪里入手,可能是因为自己平时不认真听课的缘故。后来经过上网查询资料,翻阅参考书,在别人做的程序的启发下,才有了做此程序设计的眉目。在设计过程中遇到了很多的问题,在这里需要感谢王征风老师的帮助和指导,以及同学的帮助,最后一个个问题都被解决了,写出了完整的程序设计。最后也发现,其实只要努力,写出一个设计不是很困难,重要的是自己在写程序的过程中,要会学习,会查阅资料。这次的课程设计让我学习到了很多,以后我会努力提高自己在图形学方面的知识水平。 平移变换在几何中的应用 平移变换是几何中的一种重要变换,运用平移变换可以将分散的线段、角或图形集中到一起,便于问题的研究和解决。这是平移变换中的常用方法,下面仅举几例,以作说明。 一、平移变换在几何证明中的应用 例1.如图,△ABC中,BD=CE,求证: 【解析】 本题涉及到证明的几条线段虽然都交于一点,但对于证明这样一个几何不等式不是很方便。再有BD=CE,运用平移变换,将△AEC平移到△A’BD的位置,问题迎刃而解。 【答案】 证明:如图2,分别过点D、B作CA、EA的平行线,G F D E 两线相交于F点,DF于AB交于G点。 所以,在△AEC和△FBD中,又CE=BD,可证 △AEC≌△FBD,所以AC=FD,AE=FB,在△AGD中,AG+DG>AD,在△BFG中,BG+FG>FB,所以AG+DG-AD>0,BG+FG-FB>0,所以AG+DG+BG+FG-AD-FB>0,即AB+FD>AD+FB,所以 AB+AC>AD+AE .【思考】 本题还有没有平移其他图形的方法? 例2.如图,梯形ABCD中,∠B+∠C=90°,点E、F分别为上下底边的中点,求证: 【解析】 题目需要证明的几条线段是分散的,通过平移变换可以将AB、EF、DC集中到一起。此时,其他条件也很能好好地得到应用。 【答案】 证明:分别过点E、F作EG//AB,EH//CD交BC于点G、H 所以四边形ABGE,DEHC是平行四边形.AE=BG,DE=CH,因为FB=FC,所以FG=FH= 所以∠EGC=∠B,∠EHB=∠C,又∠B+∠C=90°,所以∠EGC+∠EHB=90°,∠GEH=90° 所以△GEH是直角三角形.所以,EF= 二、平移变换在几何作图中的应用 例3.如图,河流的河岸AB与CD平行,点A、B表示两个村庄,现要在河上架桥,满足两个条件:(1)桥与河岸垂直;(2)A、B两个村庄之间的线路最短,请问桥应架在何处? 【解析】 不管桥设计在何处,A、B两个村庄之间的路程中总有一段是河岸间的距离,所以运用平移变换,将河“平移”,使村庄A或B恰好在河岸上。 【答案】 过点A作AA’垂直河岸,且使AA’长度等于河的宽度,连结交河岸于点C,过点C作CD垂直于河岸交河岸于点D,连结AD,则CD为桥的位置。 【思考】 如果A、B两个村庄之间有两条互相平行的小河,其他条件不变,桥的位置又该如何确定? 图3 例4.如图3,△ABC的三条中线分别为AD、BE、CF.在图3中利用图形变换画出并指明以AD、BE、CF的长度为三边长的一个三角形(保留画图痕迹); 【解析】 以三条中线为边长的三角形,显然要对这三条线段进行“重新组合”,手段就是平移变换。 【答案】 三、平移变换在几何计算中的应用 例5.如图,六边形ABCDEF中,对角线 已知FD = cm,BD = cm.问六边形 ABCDEF的面积是多少平方厘米? 【解析】 题目中给出了很多平行且相等的线段,这就很容易联想到平移变换。通过平移变换,将图形“整形”,从而求出六边形的面积。 【答案】 如图,将△DEF平移到△BAG的位置,将△BCD平移到△GAF的位置,则原六边形分解组合成长方形BDFG.此长方形的边恰是已知长度的BD与 FD.易知长方形BDFG的面积为 24×28 = 432 cm2.所以,六边形ABCDEF的面积是432 cm2.例6.已知抛物线与x轴的两个交点记为A,B,点M在直线上,点P在抛物线上,求当以O、A、P、M为顶点的四边形为平行四边形时的P点坐标。 【解析】 本题运用平移变换在平面直角坐标系中的应用,这样求平行四边形的顶点坐标将会简便。因为平行四边形可以理解为一条线段沿平面内某一方向平移所扫过的图形。 【答案】 ① 若OA为边,则PM∥OA.设M(m,2m),∵OA=5,∴P(m+5,2m)或P(m-5,2m).当P(m+5,2m)时,∵P点在抛物线上,∴,解得.∴P(12,14).当P(m-5,2m)时,∵P点在抛物线上,∴,解得.∴P(-3,4)或P(20,50).②若OA为对角线,则PM为另一条对角线.[来源:Z&xx&k] ∵OA中点为(,0),设M(m,2m),∴P(5-m,-2m).∵P点在抛物线上,∴,解得.∴P(12,14).综上,符合条件的P点共有3个,它们分别是P1(12,14)、P2(-3,4)、P3(20,50).【练习】 1.已知,如图,△ABC中,AB=AC,D是AB上一点,E是AC延长线上一点,若BD=CE,求证:DE>BC.2. 在△HBC中,∠B=∠C,在边HC上取点D,在边BH上取点A,使HD=BA,连结AD.求证:AD≥ 3.在△ABC中,点P为BC的中点. (1)如图1,求证:AP<(AB+BC); (2)延长AB到D,使得BD=AC,延长AC到E,使得CE=AB,连结DE. ①如图2,连结BE,若∠BAC=60°,请你探究线段BE与线段AP之间的数量关系.写出你的结论,并加以证明; ②请在图3中证明:BC≥DE. 六、语言表达(题型注释) 1.把下面长句变成三个短句,不改变原意。(4分) 为期三天的从议题设置到活动安排处处体现“立足亚洲、放眼全球”特色以及充分展现作为东道主的中国在与各国分享发展机遇、促进亚洲共同发展、求解世界发展难题等方面的担当的博鳌亚洲论坛2013年年会4月6日拉开帷幕。 2.提取下列材料的要点,整合成一个单句,为“黑洞”下定义。(5分)①黑洞是一种暗天体。 ②它的前身是质量比太阳大40倍以上的恒星。 ③这种恒星在超新星爆炸中留下了一个致密的恒星核。④黑洞就是这个致密星核在自身重力下坍缩而成的。 3.将下面的长句改写为四个短句,可以调整语序、增删个别词语,但不能改变原意。(5分)日前某一科学家和他的团队历时多年在青海湖的裸鲤身上找到迄今为止世界上唯一的一种灵敏度高、成本低廉、培养速度快、保存简单、使用方便并已经在上海苏州河治理、汶川水质安全快速检测中得到验证的水质检测好材料——非致病的淡水型发光细菌。答: 4.请根据下列语句,给“博客”下定义。要求:必须为单句,语序合理,不得丢掉语句中的信息。(可增删词语)(4分) ①博客是一种简便的网站内容管理系统。 ②博客的内容按时间顺序排列,并且在不断更新。③博客能通过评论等形式实现作者与读者的交流。④博客能提供符合通用标准的内容提要。 5.把下面的长句改写成几个短句,可以改变语序或适当增删词语,不得改变原意。(5分) 史诗是民间叙事体长诗中一部用诗的语言记叙各民族在特定时期的有关天地形成、人类起源的传说,以及关于民族迁徙、民族战争和民族英雄光辉业绩等重大事件且规模宏大的形象化的历史。 6.把下列三个句子,组合成一个单句。(不得改变原意,可以调换语序,增删一些词语)(6分)①叙永县教育系统在教育局主会场召开主题教育动员大会。 ②此次教育活动的主题为“实现伟大中国梦、建设美丽繁荣和谐四川”。③教育局全体机关职工、城区中小学校校长和党务工作者参加了此次会议。 7.将下面一个长句变成四个短句,可增删词语,但不得改变原意。(4分) 由推进舱、返回舱、轨道舱和附加段组成的中国 参考答案 1.为期三天的博鳌亚洲论坛2013年年会6日拉开帷幕。本届年会从议题设置到活动安排,处处体现了立足亚洲、放眼全球的特色。这充分展现出作为东道主的中国在与各国分享发展机遇、促进亚洲共同发展、求解世界发展难题等方面的担当。(注:一句1分,符合逻辑顺序1分。)【解析】 试题分析:这类试题解题的关键在于首先找出句子的主干,然后确定各主干成分的修饰语,调整语序组成小分句,最后根据逻辑顺序确定分句顺序。本句主语是“博鳌亚洲论坛”,谓语是“拉开帷幕”。本句特点是主语有多项定语修饰,理顺主语修饰语即可整理出答案。考点:语言表达简明、连贯、得体、准确、鲜明、生动。能力层级为表达运用E 2.黑洞是质量比太阳大40倍以上的恒星在超新星爆炸中留下的致密恒星核在自身重力下坍缩而成的暗天体。【解析】 试题分析:本题是一个传统题型——短句变长句。为“黑洞”下定义,实际是把几个短句组合为一个长句。可以先选择其中一个句子(①句)作为主干句,然后把其他几个句子按照语意逻辑顺序去排列,使其共同作为“暗天体”这一宾语的修饰定语即可。考点:选用、仿用、变换句式。能力层级为表达运用E。 3.答案示例:日前某一科学家和他的团队历时多年在青海湖的裸鲤身上首次发现一种非致病的的淡水型发光细菌。这种细菌是一种水质检测好材料。它灵敏度高、成本低廉、培养速度快、保存简单、使用方便。已经在上海苏州河治理、汶川水质安全快速检测中得到验证。【解析】 试题分析:本题是将长句变换成短句,解答这种题首先要找出句子的主语、谓语、宾语、定语、状语。再将句子的主干组成一个短句,将句子的定语或状语组成若干个短句。 考点:选用、仿用、变换句式。能力层级为表达运用E。 4.博客是一种内容按照时间顺序排列,并且不断更新,可通过评论等形式实现作者与读者的交流的,能提供符合通用标准的内容提要的网站内容管理系统。【解析】 试题分析:此题考查句式的变换,把几个句子组合在一起变成单句。这就要注意单句的结构:„„是„„。可增删个别词语,但不能改变句意。本题包含四个信息:网站内容管理系统;按照时间顺序排列,并且不断更新;通过评论等形式实现作者与读者的交流;能提供符合通用标准的内容提要。四个信息缺一不可,并且语句要符合逻辑。考点:选用、仿用、变换句式。能力层级为表达运用E 5.①史诗是民间叙事诗中一部规模宏大的历史。②它用诗的语言记叙各民族有关天地形成、人类起源的传说,以及关于民族迁徙、民族战争和民族英雄光辉业绩等重大事件。③它是各民族在特定时期的一部形象化的历史。(①③合并为一句,答案共两句的,给4分。没提出主干句的,不给分。句子结构混乱的,不给分。)【解析】 试题分析:解答长句变短句的题目,应先将长句的主干分析出来,之后可将主干列为一句,枝叶列为其他几句。本题中,材料所给的句子的主语是“史诗”,谓语部分是个比较复杂的、有较长定语的偏正短语,其中心词是“历史”,于是,第一个短句即可得出:“史诗是历史。”以后再对那个较长定于进行分解,化成若干短句。(当然还可有别的划分法)考点:选用、仿用、变换句式。能力层级为表达运用E。 6.叙永县教育系统在教育局主会场召开了由教育局全体机关职工、城区中小学校校长和党务工作者参加的“实现伟大中国梦、建设美丽繁荣和谐四川”主题教育动员大会。 答案第1页,总5页 【解析】 试题分析:这是一道复句变单句题目,此类题目一般先确立句子的主干句,即第①句“紧急避险是一种行为”,然后再把其它几句,即②③两句,作为状语或定语,合理删减排序后放在宾语之前即可。 考点:选用、仿用、变换句式。能力层级为表达运用E。 7.神舟十号是中国第五艘搭载太空人的飞船,由推进舱、返回舱、轨道舱和附加段组成,它由 长征二号F改进型运载火箭“神箭”发射升空,将在轨飞行15天。(正确拆分出四个单句2分,语序组织合理2分。)【解析】 试题分析:本题是一个传统题型——长句变短句。学生可以采用主干分析法:先抽出句子主干“神舟十号飞船将在轨飞行15天”独立成句,再将附加成分“由推进舱、返回舱、轨道舱和附加段组成”和“中国第五艘搭载太空人”以及“由长征二号F改进型运载火箭“神静”发射升空”抽出来单独成句。这样整个句子就变换为由四个单句构成的句群。考点:考查变换句式。能力层级为表达运用E。 8.①一代代中国人为着伟大的“中国梦”艰苦奋斗、埋头苦干。②中国目前已经成为世界第二大经济体。③中国经济成就举世瞩目,综合国力今非昔比。④中国人民生活水平大幅改善,国际影响力迅速攀升。【解析】 试题分析:找准原句主干,先将最核心的意思提取出来,其他成分再依次抽丝剥茧,尤其要注意句中的名词和动词的相互搭配。 考点:扩展语句,压缩语段。能力层级为表达运用E。 9.英国国家档案馆继去年公开近6000页不明飞行物(UFO)的档案后于3月3日再次解密了35份记录2005年以前军方和民众提供的目击UFO事件的档案资料。(句子主干1分,状语1分,定语1分,句意通顺1分)【解析】 试题分析:解答把短句变为长句的题目,可先根据几个短句的内容确定变换后句子的主干,再将各短句内容装入主干中。本题中前两个句子讲的是“英国国家档案馆”的两次接连动作,因此可考虑用“继„„之后„„再次„„”的句式,第③句的内容则可作为定语嵌入句中。 考点:选用、仿用、变换句式。能力层级为表达运用E。10.《游褒禅山记》是王安石在宋仁宗至和元年34岁时,与两位朋友和弟弟同游褒禅山后写的一篇记游并抒发自己的感想的重要游记 【解析】 试题分析:此类题目要在快速阅读整段文字,初步感知大体内容的基础上,结合具体语境,根据上下文的句子结构、逻辑顺序等来分析作答。此题可以用“《游褒禅山记》是„的一篇重要游记。”中间可按照人物、时间、地点或者事件的顺序来组织。 考点:语言表达简明、连贯、得体、准确、鲜明、生动。能力层级为表达运用E 11.①我是通过一把劣质折扇初识九华山的。 ②这把折扇是由一位到过池州的老前辈带到乡间来的。 ③折扇上印着的一幅题为“凤凰迎客”浏览图与现今常见的游览图不同。 【解析】 试题分析:长句变短的方法很多,最基本的一种就是对长附加成分进行处理,比如本句对两个长定语“一位老前辈带到乡间来的”“上面印着一幅与现今常见的游览图不同的题目叫 答案第2页,总5页 做“凤凰迎客”浏览图”进行处理,把它分离出来,独立成句;也可以利用复指的办法,使句子主干突出,条理清楚;还可以重新组句,重新排序。 考点:语言表达简明、连贯、得体、准确、鲜明、生动。能力层级为表达运用E。 12.①美国总统奥巴马于近日签署一项行政令。②决定解除对使用美国联邦政府资金支持胚胎干细胞研究的限制。③这对科学发展而言是个好消息。【解析】 试题分析:本题考查考生变换句式的能力。变换句式的基本要求是不改变原意。本题是长句变短句,这种变换的基本方法是将原句主干作为一个分句,再将原句包含主谓关系的修饰语变成分句,根据题干要求,将这几个分句连缀起来就ok啦。本题是一个复杂单句,主干是“奥巴马签署行政令是好消息”,主语是主谓短语“奥巴马签署行政令”,行政令的内容是“决定解除限制”。把这三个主干基本保持原意地组织起来就是答案了。考点:选用、仿用、变换句式。能力层级为表达运用E。13.①开普勒采用充分利用数学对观测结果进行理论分析的方法、建立数学模型的方法进行研究。②开普勒的研究对近代物理学发展产生了积极影响。③通过查阅大量资料,研究人员对这一事实有了更全面的认识。【解析】 试题分析:长句变短句方法:①抽出长句的附加成分,变成复句里的分句或单独成句。②借助复指,把长句的附加成分变为并列分句,然后用一个代词去取代它。③拆开并列的修饰成分,让其分别同中心词搭配,形成叠用的句式,变为复句里的几个分句。考点:考查变换句式。能力层级为表达运用E。 14.联合国大会于16日通过了关于叙利亚局势的决议,该决议与先前在安理会被否决的关于叙利亚问题的决议草案一样,决议的目的是推动叙利亚内部政权更替和全力支持阿拉伯联盟的行动方案。【解析】 试题分析:本题是将长句变换成短句,解答这种题首先要找出句子的主语、谓语、宾语、定语、状语。再将句子的主干组成一个短句,将句子的定语或状语组成若干个短句。 考点:选用、仿用、变换句式。能力层级为表达运用E。15.组合类新材料作文是指近几年高考中出现的,由两个或两个以上彼此相关的材料复合组成的,表达共同主题的,综合性较强的材料作文。(每点1分,共5分)【解析】 试题分析:答题时,要以“组合类新材料作文是指„„的材料作文”这种句子形式来进行增删,把内容重复的删去,适当增加句子的衔接词语,按照“组合类+新材料+作文”的顺序进行组织。 考点:语言表达简明、连贯、得体、准确、鲜明、生动。能力层级为表达运用E 16.世界博览会是由一个国家的政府主办的、有多个国家或国际组织参加的,以展现人类在社会、经济、文化和科技领域取得成就的举办时间长、展出规模大、参展国家多、影响深远的国际性大型展示会。或:世界博览会是以展现人类在社会、经济、文化和科技领域取得成就为目的,由一个国家的政府主办的、有多个国家或国际组织参加的举办时间长、展出规模大、参展国家多、影响深远的国际性大型展示会。【解析】 试题分析:这是一道考查压缩语段能力的题目。答题时一要合乎书写“定义”的要求(即用“什么是什么”的形式以一个单句表述,本题可为“世界博览会是„„展示会”的形式),二要符合题干“为‘世界博览会’下定义”的要求,三要筛选出能体现“世界博览会”的“必要的”信息,一个也不能少,也不能多。 答案第3页,总5页 考点:扩展语句,压缩语段。能力层级为表达运用E。17.(道德风险指)从事经济活动的人在最大限度地增进自身效用的同时做出的不利于他人的行动。或:(道德风险指)签 约的一方不完全承担风险后果时所采取的追求自身效用最大化的自私行为。(单句1分,“道德风险”特征2分,语序恰当1分)【解析】 试题分析:概念的定义必须是一个单句,要通过分析这几个句子的结构及内容来确定这个单句的主干,用简明扼要的语言进行概括。 考点:语言表达简明、连贯、得体、准确、鲜明、生动。能力层级为表达运用E。18.(6分)(1)尼采曾把母鸡下蛋的啼叫和诗人的歌唱相提并论,说都是“痛苦使然”;(2)中国传统里有一个痛苦比快乐更能产生诗歌的意见;(3)尼采这个家常而生动的比拟恰恰符合这个意见。【解析】 试题分析:这是一道长句变短句的题目,首先要提出句子主干,然后让定语和状语单独成句即可,断句要注意先后顺序。本句句子主干是“尼采的这个家常而生动的比拟恰恰符合中的意见”定语有“曾把母鸡下蛋的啼叫和诗人的歌唱相提并论说都是‘痛苦使然’”“中国传统里一个痛苦比快乐更能产生诗歌”,考点:选用、仿用、变换句式。能力层级为表达运用E。19.①科学发展观是坚持以人为本和经济社会全面协调发展的一种方法论。②它的总体要求是实行统筹兼顾。③它的前提是适合中国国情和顺应时代潮流。【解析】 试题分析:这是一道长句变短句的题目,首先要提出句子主干,然后让定语和状语单独成句即可,断句要注意先后顺序。本句句子主干是“科学发展观是一种方法论”定语有“适合中国国情和顺应时代潮流的前提”“按照统筹兼顾的总体要求”“坚持以人为本和经济社会全面协调发展”,把三个定语中离中心词最近的一个和句子主干合并。考点:选用、仿用、变换句式。能力层级为表达运用E。 20.(漫画是)一种常以简练的线条,通过变形夸张、比拟、象征等手法褒贬现实,具有幽默感和讽刺效果的绘画。(单句 2分,其他分句转换成定语(意义对即可)并且位置正确各1分,共6分)【解析】 试题分析:此题要从整体上对这些句子进行感知理解漫画的大意,然后分别从这些分句中,选取有概括性代表性的词句,按照一定的逻辑顺序进行组合排列即可。如可以按照“漫画是一种„的绘画”为句子的形式结构,中间添加定语,注意位置符合逻辑即可。考点:扩展语句,压缩语段。能力层级为表达运用E 21.示例: (1)收录在鲁迅短篇小说集《呐喊》中的中国第一部现代白话文小说《狂人日记》开创了中国新文学的革命现实主义传统。(或:开创了中国新文学的革命现实主义传统的中国第一部现代白话文小说《狂人日记》收录在鲁迅的短篇小说集《呐喊》中。) (2)鲁迅是开创了中国新文学的革命现实主义传统的、收录在他的短篇小说集《呐喊》中的作品《狂人日记》的作者。(或:鲁迅是收录了开创中国新文学的革命现实主义传统的中国第一部现代白话文小说《狂人日记》的短篇小说集《呐喊》的作者。【解析】 试题分析:先选定一个基本句子,再将其他句子的内容作为修饰成分插进这个基本句中。注意改写完后要检查是否有语病,同时还要注意区分“以××为主语”和“用××作为开头”的句子的区别。每个句子3分。信息完整,组织合理即可。该句不是长单句不得分,句意不 答案第4页,总5页 畅酌情扣分。 考点:变换句式。能力层级为表达运用E。22.(1)全国政协会议代表们呼吁继续提高个税起征点。(2)3月6日,国家税务总局某官员表示不可能。(3)个税起征点提高到3000元已让纳税人的人数减少三分之二。(一句1分,不考虑三句的先后顺序)【解析】 试题分析:此题考查长句变为短句的能力,答题时,应先明白全句包括所包括的内容,再分别组成单句。题中句子包括的内容有:国税总局某官的表示、全国政协代表的呼吁和个税起征点的提高所造成的结果三个方面,将此三方面内容组成单句即可。考点:选用、仿用、变换句式。能力层级为表达运用E。 23.①2013年3月10日在巴渝文化会馆展出的一组作品《巴渝十二景》备受好评。②这组作品取材于巴渝山水的十二处美景。 ③这十二处美景是乾隆年间巴县知县王尔鉴以一个外地人的视角总结出来的。 ④这组作品是由重庆著名书法家魏功钦和画家郭俊根合作并用诗画结合的方式创作的。【解析】 试题分析:答题时,要先浏览一遍长句,然后找出一些代表性的关键词,进行分类。如展出、取材、视角、创作方式四个方面,根据这四个方面,从长句中删减词语组句即可。考点:扩展语句,压缩语段。能力层级为表达运用E 答案第5页,总5页第二篇:二维 动画课课程设计题目
第三篇:计算机图形学课程设计 图形绘制变换分解
第四篇:平移变换几何证明与计算中的应用
第五篇:长短句变换