计算机图形学基本图元生成系统的设计与实现设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流计算机图形学基本图元生成系统的设计与实现设计.精品文档.题 目 计算机图形学基本图元生成系统的设计与实现 学生姓名 刘晓东 学号 1118014007 所在学院 数学与计算机科学学院 专业班级 计本1101班 指导教师 高虎 _ 完成地点 陕西理工学院 2015 年 6 月 3 日计算机图形学基本图元生成系统的设计与实现刘晓东(陕西理工学院数学与计算机科学学院计算机科学与技术专业1101班,陕西 汉中 723001)指导教师:高虎摘要:本设计旨在提高计算机图形学课程效果,直观地显示部分图形学算法,将抽象知识可视化,方便学生理解。该系统以VC+6.0作为开发环境,实现了基本图元的生成,设置线条属性、曲线和曲面的生成等,这一系统的开发和应用会对图形学课程的教学提供较大的帮助。关键词:计算机图形学;VC+6.0;可视化Computer Graphics Primitives to Generate Basic System Design and ImplementationLiu Xiaodong(Grade 11,Class 01, Major Computer Sinence and Technology ,School of Mathematics and Computer Science,Shaanxi University of Technology,Hanzhong 723001, Shaanxi)Tutor:Gao HuAbstract: This design aims to improve the effect of computer graphics course,display some visual graphics algorithms,make the abstract knowledge visualization,being convenient for studengs to understand.With VC+6.0 as development environment,the system realizes the basic figure generated, seting line properties,curve and cured surface formation.Development and application of this system will provide great help for graphics teaching. Key words: vc+6.0; computer graphics; visualization目 录引言11 课题描述21.1选题来源与背景21.2研究的目的与意义21.3设计思路21.4系统特点31.5系统开发环境32 系统的功能分析与总体设计42.1系统的功能需求分析42.1.1系统开发的内容42.1.2系统需要实现的功能42.2 总体设计43 二维图形的基本生成53.1 概述53.2二维图形的生成原理分析53.2.1直线53.2.2椭圆53.2.3曲线63.3 系统的界面设计93.4程序运行实例104 三维图形的生成124.1概述124.2三维图形的生成算法原理分析124.2.1曲面124.3三维图形的可视化原理分析124.3.1三维变换124.3.2曲面144.4程序运行实例145 系统与编码实现205.1系统的类205.2类的实现205.2.1 CPainterView类205.2.2 CMainFrame类205.3程序控制与操作256 结论26致谢27参考文献28科技外文文献29引言计算机图形学是利用计算机研究图形的生成表示、处理和显示的学科,其主要研究内容是图形在计算机中的表示方法,以及利用计算机对图形的计算、处理和显示的相关原理和算法。计算机图形学的研究成果已被广泛应用于航天、航空、建筑工程、地理信息等许多工程领域。这就决定了此课程必须要理论于实际相结合的原则。不仅要使学生系统地掌握计算机图形学生成与处理技术的基础知识、原理和方法,而且要培养学生图形软件的设计技能。遗憾的是,国内计算机图形学主要取决于经典的教学书,重点是讲述上世纪的图形学技术,教学过程中一般围绕着数学公式的推导进行,学生不易理解,而且繁冗的数学公式会令学生对课程的兴趣下降,教学效果不能令人满意。为了提高教学质量,本文基于VC+6.0在MFC单文档的窗体下,开发了计算机图形学基本图元生成的教学演示系统。该系统能够让学生直观的看到图元的生成和显示过程,使得数学公式不再枯燥无趣,学生易于接受,也乐于接受,可以大大提高教学效果。1 课题描述1.1选题来源与背景计算机图形学是研究怎样用计算机生成、处理、显示和输出图形的学科。而图形学教学的关键在于如何将图形的各种变换生动直观地展示给学习者,使学习者更深入的理解计算机图形学的理论和算法原理。传统的计算机图形学算法的实现和开发主要是基于以Turbo C为代表的DOS开发环境,这种方法可视化效果很差,并且缺乏交互控制和动态演示。因而往往会给学习者的理解和深入探讨带来很大的问题。后来,随着多媒体技术的发展,计算机图形学的教学开始运用静态的图片教学幻灯片的形式来讲授,这些教学幻灯片虽然弥补了传统的黑板板书的不足,较大地提高了教学质量,但是这种教学模式在可视化和交互式方面仍然存在着较大的不足。往往让学习者感到很抽象,难以理解。近几年,编程语言的较快发展使计算机图形学教学系统有了很大的进步。使教学系统实现了计算机图形学理论的实践化,能使学习者通过交互式的操作,更深入了解计算机理论的用法,但是这种教学系统无法学习者看见图形生成的源程序,在帮助学习者对理论的深入理解上仍存在着些许不足,使他们无法真正体会图形生成的算法原理。目前,还有一种教学模式是采用flash动画演示并配加一定文字说明的方式,这种方式可以在很大程度上揭示图形生成的算法原理,遗憾的是不能很全面的演示教学内容,缺乏交互性,不能让学习者自己输入相关的参数。为此,本文在ViusalC+6.0的编程环境下,开发了一套专门致力于帮助学习者理解计算机图形学理论而设计了图元生成系统。该系统将可视性,交互性和可扩展性紧紧地结合在一起,能够大大改善传统教学的弊端,使复杂的难以理解的计算机图形学理论通过教师的课堂演示和学习者的不断自我交互式操作试验变得通俗明朗,有效地提高教学的质量和效果。特别是本文在图形学可视化和交互式操作方面进行了深入研究,这些也是本系统最重要的亮点。1.2研究的目的与意义计算机图形学是一门发展迅速的新兴学科,是计算机应用学科的一个重要分支。计算机图形学的研究内容非常广泛,如图形硬件、光栅图形生成算法、图形交互技术、实体造型与显示算法虚拟现实等。随着计算机系统软件、硬件及其外部设备的发展,特别是光栅图形显示器的问世。计算机图形学的应用已经渗透到各个工程技术领域, 成为用户界面、数据可视化、电视广告、动画和其他应用中的公共成分,而计算机图形学中的基本图形生成算法,在该学科中扮演着至关重要的角色。计算机图形学基本图元生成系统的目标是设计一个辅助教师教学的基本图元生成的系统。教师可以较为简单的实现图形的绘制,例如圆、椭圆、直线和弧面等,同时可以实现图形的保存和修改以及改变图形的线宽和颜色,便于下次使用。计算机图形学主要是利用计算机产生令人赏心悦目的具有真实感图形。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成,本研究中将对直线、圆、椭圆生成算法、多边形填充进行全面的介绍、学习探讨以及归纳总结,力求将基本的图元展示给大家。该系统设计的目的是实现各种基本的图元生成和展示,提高教学的效率。无论在学习上,还是实际应用上,本研究都具有促进作用和深远的意义。1.3设计思路本文理论与实践相结合,在认真分析了图形学算法原理的基础上,提出了一种将图形生成过程与图形的变换过程同步可视化演示的新思路,实现了计算机图形学中大部分图形的可视化演示。论文研究的主要内容及结构安排如下:(1)描述了计算机图形学基本图元生成系统的研究背景,研究目的和研究意义及开发环境。(2)主要介绍了系统的功能需求分析以及系统的总体结构设计。(3)主要讲述了计算机图形学中二维图形的生成,其中包括直线,三角形,矩形,椭圆的生成方法,各种二维变换的可视化,和各种曲线的可视化实现原理。(4)主要讲述了计算机图形学中三维图形中Bezier曲面的生成方法。(5)重点讲述了系统实现的各主要的类之间的层次关系,同时将其中的主要的类作了详细介绍,说明了类中的函数的调用关系,最后还简单说明了程序的操作和控制方法。(6)对系统做出了三方面的总结。1.4系统特点本文在VC+ 6.0的环境下,开发了一套全新的集可视性,交互性于一体的计算机图形学基本图元生成系统,本系统的主界面如图1.1所示。图1.1 系统的主界面该系统根据计算机图形学的基本理论,运用各种动态演示的方法,将直线的生成、多边形填充、二维图形的基本生成和变换、三维图形的基本几何变换以及Bezier曲线变换的生成过程以及变化过程的显示在学习者面前。本系统的主要特点如下:(l)充分体现了VC+编程语言界面友好的特点,在程序界面中增加了控制工具栏和绘图辅助栏,所有图标都设定了提示和状态栏提示帮助,极大的方便了学习者的使用。(2)摆脱了以往的静态文字说明的教学方式,将图形的实现过程以动态的方式一步步演示出来,给学生一种耳目一新的感觉。文字结合图形生成的效果大大地激发了学生的学习兴趣,让学生对图形生成的算法原理有了更直接和更真实的认识和了解。(3)采用了VC+工程中的单文档界面,增加了对程序演示的操作菜单,学生可以通过选择不同的按钮生成不同的图形或者选择放大图形、缩小图形、平移等菜单来控制程序的运行,实现了学生与程序的交互,极大的提高了教学质量。(4)具有良好的扩展性,可以在短时间内添加新的图形算法函数,使程序更加全面。1.5系统开发环境(1) 硬件系统:笔记本(2) 操作系统:Windows XP或Win7 旗舰版操作系统(3) 开发环境:VC+6.02 系统的功能分析与总体设计2.1系统的功能需求分析2.1.1系统开发的内容计算机图形学基本图元生成系统研究的内容主要有:实现直线的生成、三角形生成、矩形的生成以及椭圆和曲线的生成、Bezier曲线变换的生成过程,还可以改变线型和线宽及颜色。2.1.2系统需要实现的功能基本图形功能:指在屏幕中置点,绘制直线、三角形、椭圆、矩形、曲线以及文本,还有可以改变线型线宽和颜色等。文件功能:能够新建、打开、写入、读出、关闭、删除和退出程序。图形变换功能:拷贝、粘贴、平移、删除。图形的存储与输入和输出:以各种方式加以存储。放大缩小功能:能够通过菜单栏或工具栏实现图形的等比缩放的功能。2.2 总体设计计算机图形学基本图元生成系统流程图如图2.1所示:图2.1 系统总体设计结构图3 二维图形的基本生成3.1 概述本系统在对计算机图形学的算法可视化的时候,分别对二维图形和三维图形运用了不同的方法来实现,因此本系统将把二维图形和三维图形的生成分开来讨论,本章主要探讨二维图形的生成方法,在下一章将探讨三维图形的生成方法。二维图形包括直线、三角形、椭圆、曲线、矩形、填充等,其中每种图形又包括不同的算法,比如,直线的常见算法有DDA算法、Bresenham算法、中点算法等。在数学中,所有的基本图形都是以点为最小单位按一定的规律组合而成的集合。为了将图形在计算机上显示出来,无意就是找出这种排列的规律,然后在显示器所给定的有限个像素组成的矩阵中确定逼近于该图形的最佳像素组,并且按一定的顺序对这些像素进行写操作。图形学生成算法的可视化就是在解读图形显示原理的基础上,通过创建“虚拟栅格”来模仿计算机的“象素点”,结合图形生成的算法,计算出图形在虚拟栅格中的最佳逼近“象素点”,然后以画圆来代替这些“象素点”的方式显示图形。下面将对基本二维图形的生成原理逐一介绍和分析。3.2二维图形的生成原理分析3.2.1直线直线作为最简单的图形,是生成其它复杂图形的基础。直线是点的集合,在几何学中直线被定义为两个点之间的最短距离。也就是说一条直线是指所有在它上面的点的集合。直线可以向一个方向及其相反的方向无限延长,这不是计算机图形学中所需要的,在图形学中研究的对象是直线段。下面我们来研究直线上只存在于两个端点,和之间的任意点。例如,线段的起点坐标,终点坐标,这两个点就确定了这条线段,并用线段上的任意一点均满足:画一条直线实际上是根据一系列计算出来并与该线靠近的像素绘制的,当我们要在屏幕上显示一条直线时,只能在显示器所给定的有限个像素组成的矩阵中确定最佳逼近于该直线的一组像素,并且按扫描线顺序对这些像素进行写操作。这就是通常所说的用显示器绘制直线,或直线的扫描转换。直线的最常见的扫描转换方式有数值微分法(DDA算法),中点法和Bresenham算法。它们的算法原理在计算机图形学的很多书上都介绍的很清楚。3.2.2椭圆中心在原点、轴对齐的椭圆的非参数化方程为: (3.1)式3.1可用隐式方程表示为:由于椭圆的对称性,仅考虑在第一象限的椭圆弧即可。对隐函数求导可得,由于可知椭圆在第一象限内单调递减,在区间内切线的斜率从0递减到。为了使生成的椭圆具有封闭性,以弧上斜率为-1的点作为分界,把椭圆弧分成上下两部分。上半部分满足即,的变化量大于的变化量,由从点开始递增步长来确定的值,下半部分满足即,的变化量大于的变化量,由从点开始递增步长来确定的值。由于这两部分是相互独立的,可用两个处理器(或线程)并行处理,而不用考虑同步问题,从而能最大化的提高并行效率,见图3.1。图3.1 第一象限的椭圆弧对于上半部分,假设已知点为则下一点在其右方点或右下方点中选择离椭圆弧最近的点,而为右方点到椭圆弧的距离, 为右下方点到椭圆弧的距离,通过做差:可判断出所要选择的点,即:选择右方的点,选择右下方的点.根据所得到的利用上述思想推下一点即可得到与的递推关系式:根据递推关系式和已知点就可得到所有上半部分的点。对于下半部分,假设已知点为,则下一点在其上方点或左上方点中选择离椭圆弧最近的点,而为上方点到椭圆弧的距离, 为左上方点到椭圆弧的距离,通过做差:可判断出所要选择的点,即:选择上方的点,选择左上方的点。根据所得到的利用上述思想推下一点即可得到与的递推关系式:根据递推关系式和已知点(a,0)就可得到所有下半部分的点.通过上下部分拟合得到所有椭圆上的点。椭圆的扫描转换算法主要有DDA算法,中点算法,Bresnham算法以及正负步法和双步法。3.2.3曲线贝赛尔(Bezier)曲线是有多项式调和函数推导出来的,通常n+1个顶点定义一个n次多项式。Bezier曲线的参数方程表示如下: (3.5)在式(3.5)中,表示特征多边形n+1个顶点的位置向量,是伯恩斯坦(Bernstein)多项式,称为基函数,也就是贝赛尔多边形的各顶点位置向量之间的调和函数。该函数的表达式为:Bezier曲线的缺点:(1) 特征多边形顶点个数决定了Bezier曲线阶次,并且当n较大时,特征多边形对曲线的控制将会减弱;(2) Bezier曲线不能作局部修改,即改变某一控制点的位置对整条曲线都有影响。曲线生成代码如下所示:void CTestView:DrawBezier()/绘制Bezier曲线CDC *pDC=GetDC();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255);/曲线颜色为蓝色pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(P0);for(double t=0.0;t<=1.0;t+=0.01)double x=0,y=0;for(int i=0;i<=n;i+)x+=Pi.x*Cni(n,i)*pow(t,i)*pow(1-t,n-i);y+=Pi.y*Cni(n,i)*pow(t,i)*pow(1-t,n-i);/调用CnipDC->LineTo(Round(x),Round(y);pDC->SelectObject(pOldPen);NewPen.DeleteObject();ReleaseDC(pDC);/释放DCdouble CTestView:Cni(const int &n, const int &i)/Bernstein第一项组合return double(Fac(n)/(Fac(i)*Fac(n-i);long CTestView:Fac(int m)/阶乘函数long f;if(m=0|m=1)f=1;elsef=m*Fac(m-1);return f;void CTestView:DrawCtrlPolygon()/绘制控制多边形CDC *pDC=GetDC();CBrush NewBrush,*pOldBrush;pOldBrush=(CBrush*)pDC->SelectStockObject(GRAY_BRUSH);/灰色实心圆绘制控制点for(int i=0;i<=n;i+)if(i=0)pDC->MoveTo(Pi);pDC->Ellipse(Pi.x-2,Pi.y-2,Pi.x+2,Pi.y+2);elsepDC->LineTo(Pi);pDC->Ellipse(Pi.x-2,Pi.y-2,Pi.x+2,Pi.y+2);pDC->SelectObject(pOldBrush);ReleaseDC(pDC);void CTestView:OnLButtonDown(UINT nFlags, CPoint point)/获得屏幕控制点坐标 / TODO: Add your message handler code here and/or call defaultif(bFlag)PCtrlPointNum.x=point.x;PCtrlPointNum.y=point.y;if(CtrlPointNum<N_MAX_POINT-1)/N_MAX_POINT为控制点个数的最大值CtrlPointNum+;elsebFlag=FALSE;n=CtrlPointNum-1;DrawCtrlPolygon(); /调用绘制多边形/CView:OnLButtonDown(nFlags, point);void CTestView:OnRButtonDown(UINT nFlags, CPoint point)/调用曲线绘制函数 / TODO: Add your message handler code here and/or call defaultbFlag=FALSE;if(0!=CtrlPointNum)DrawBezier(); /调用绘制曲线/CView:OnRButtonDown(nFlags, point);void CTestView:OnDrawpic() / TODO: Add your command handler code hereMessageBox("左键绘制控制多边形,右键绘制曲线","提示",MB_OK);RedrawWindow();bFlag=TRUE;CtrlPointNum=0;3.3 系统的界面设计本系统的界面较为简单,共有三个部分:第一部分是系统菜单栏,这部分是通过简单的菜单命令来实现图形的生成与变化,它主要通过Resource View工程编辑器中Menu控件来实现,通过单击菜单命令的方式使图形演示一步一步的执行。第二部分是系统工具栏,这部分是通过简单直观的动态按钮来实现图形的生成与变化,其目的是让学习者更简单更方便的来实现图形是生成与变换。该部分是通过Resource View工程编辑器中Toolbar控件来实现。第三部分是图形生成过程的动态演示,该部分主要是分步显示各种图形的动态生成过程,目的是让学习者明白各种图形的每一步是怎样生成的,帮助学习者理解算法本质,这一部分用一个视图窗口类CPainterView来实现。系统如图3.2:图3.2 系统整体窗口3.4程序运行实例图3.3至图3.7是本文中部分二维图形的可视化的实例。它们分别是椭圆的生成、直线、矩形的可视化、三角形的生成以及Bezier曲线的动态生成与变换过程的可视化。 图3.3椭圆的生成图3.4直线的生成图3.5 三角形的生成 图3.6 矩形的生成图3.7 Bezier曲线的生成在这些图中,直线,三角形,矩形和椭圆的可视化原理都一样,对于平移变换、比例变换,本文分别用三角形和矩形作为样例演示了其变化过程;对于多边形填充,本文根据上文提出的原理,采用相似的界面和演示窗口,分别演示了矩形和三角形,椭圆的填充,并且运用了多重填充方式。4 三维图形的生成4.1概述我们在上面提到,本系统在对计算机图形学的基本生成时候,分别对二维图形和三维图形运用了不同的方法来实现,所以本文将把二维图形和三维图形的可视化分开来讨论,前面探讨了二维图形的可视化的方法,在本节将主要探讨三维图形的生成以及可视化方法。三维图形的可视化与二维图形的可视化有所不同,二维的空间已经无法满足图形变换的需求,而只能通过建立了三维的坐标系来实现一系列变化,下面我们将对这些三维图形的可视化原理逐一分析。4.2三维图形的生成算法原理分析4.2.1曲面曲面包括贝塞尔(Bezier)曲面、抛物面以及B样条曲面等,本文主要讨论贝塞尔(Bezier)曲面的生成与动态演示。由Bezier曲线可以容易地得到张量积Bezier曲面,在空间给定个点,称下列张量积形式的参数曲面为次的Bezier曲面。 (4.1)在式4.1中,是Bezier曲面的基函数。依次用线段连接点列中相邻两点所形成的空间网格,称之为Bezier曲面的特征网格。Bezier曲面的矩阵表示为:在实际应用中m和n的取值小于4,本文在可视化过程中。4.3三维图形的可视化原理分析4.3.1三维变换1. 坐标系的建立及转换任何一个图形都必须存在于一个参考坐标系中,本文为三维图形采用的是正等轴测坐标系。该坐标系如图4-5所示在该坐标系中,将Y正方向设定为水平向左,Z轴正方向为竖直向上,X轴的正方向为与水平方向成45度角。我们知道,正等轴测坐标系的三个轴向变形系数相等。即:其中,分别为轴,轴,轴的轴向变形系数。于是,根据斜轴测投影变换的矩阵,可得出下列方程式:解得:取 最后可以得到正等轴测的投影变换矩阵为:于是我们可以得到任意的一个三维点(x,y,z)经过变换后在平面上的坐标值(XX,YY,ZZ),它门之间的转换计算公式如下:通过计算后,所有的YY值都等于0,这是因为在平面上只能显示二维坐标。最后我们还要将这个坐标转换为计算机的设备坐标系中的坐标。假设设备坐标中的坐标是(xx,yy),它们之间的转换关系公式如下:其中,分别表示曲面坐标系的坐标原点在设备坐标系中的相对坐标。2.算法可视化的动态演示算法可视化的任务就是,动态演示图形变化的全过程,并将控制命令的改变而引起的影响以改变图形的形式直观地呈现在读者者面前,深入体会每个控件在图形变换中的功能及作用,从而达到透彻理解算法本身的目的。以三维变换中的平移变换为例,在三维变换矩阵中,控制命令分别代表三维图形向左、向右、向上、向下、与X正半轴成45°向上、与X负半轴成45°向下这六个移动方向,动态演示时,本文将这六个控件与图形的变化联系起来,做到根据设置的平移方向来决定每次动态演示时的平移方向。本文中实现三维交换的流程图如图4.1所示:图4.1 三维交换的流程图Step 1:判断动态演示的类型,主要有三维平移变换,旋转变换,比例变换,错切变换,反射变换等。Step 2:根据不同的变换类型,通过菜单控件或者工具控件来调用它们的成员函数,并在窗口视图中做出相应的响应。在动态演示视图中,主要是画出变换前的坐标系以及三维图形,为下一步变换做好准备。Step3:动态演示开始。Step4:根据动态演示,在视图窗口中做出相应的变化。在动态演示视图中,通过控件来显示相应的变换过程,每个控件对应着一种变化,这样以来,读者可以直观看见图形变换的过程,能够比较方便的对前后的图形特征进行对比,从中发现变换的实质。Step 5:判断演示是否结束。如果结束,则进入Step 6;否则返回Setp3,循环演示。Step 6:退出动态演示。4.3.2曲面1.曲面的动态演示的实现曲面的动态演示主要是曲面生成过程的动态演示。其中算法的动态演示原理和二维图形的算法文字演示原理一样,都是通过定义一个数组用来存放程序的每条执行语句,循环输出到窗口,从而达到动态演示的目的。下面本文以Bezier曲面为例来说明曲面的生成过程的动态演示。从Bezier曲面的算法原理我们可以知道,Bezier曲面可以看作是参数为u,v的交错的Bezier曲线集,当固定u不变,让v在0和1之间取不同的值,得到一组曲线,称为v线,反之,可以得到一组u线,由这两组曲线组成的网称为参数曲线网。为了实现Bezier曲面的可视化,本文通过选取合适的u和v的变化量,从而得到了Bezier曲面的参数曲面网。 4.4程序运行实例本文实现了三维图形Bezier曲面的基本生成算法效果,程序如下所示:void CDrawBizerCurve:DoubleBuffer()/双缓冲HWND i = this->m_hWnd; CDC* pDC=GetDC();CRect rect;/定义客户区GetClientRect(&rect);/获得客户区的大小pDC->SetMapMode(MM_ANISOTROPIC);/pDC自定义坐标系pDC->SetWindowExt(rect.Width(),rect.Height();/设置窗口范围pDC->SetViewportExt(rect.Width(),-rect.Height();/x轴水平向右,y轴垂直向上pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);/屏幕中心为原点CDC MemDC;/内存DCCBitmap NewBitmap,*pOldBitmap;/内存中承载图像的临时位图MemDC.CreateCompatibleDC(pDC);/建立与屏幕pDC兼容的MemDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height();/创建兼容位图 pOldBitmap=MemDC.SelectObject(&NewBitmap); /将兼容位图选入MemDC MemDC.FillSolidRect(&rect,pDC->GetBkColor();/按原来背景填充客户区,否则是黑色 MemDC.SetMapMode(MM_ANISOTROPIC);/MemDC自定义坐标系MemDC.SetWindowExt(rect.Width(),rect.Height();MemDC.SetViewportExt(rect.Width(),-rect.Height();MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);DrawCtrlPolygon(&MemDC);/绘制控制多边形SignCtrPoint(&MemDC);/标注控制点编号DrawObject(&MemDC);/绘制Bezier曲面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();/删除位图ReleaseDC(pDC);/释放DCvoid CDrawBizerCurve:ReadPoint()/读入控制多边形16个顶点坐标P300.x=20; P300.y=0; P300.z=200;/P00P301.x=0; P301.y=100;P301.z=150;/P01P302.x=-130;P302.y=100;P302.z=50; /P02P303.x=-250;P303.y=50; P303.z=0; /P03P310.x=100; P310.y=100;P310.z=150;/P10P311.x=30; P311.y=100;P311.z=100;/p11P312.x=-40; P312.y=100;P312.z=50; /p12P313.x=-110;P313.y=100;P313.z=0; /p13P320.x=280; P320.y=90; P320.z=140;/P20P321.x=110; P321.y=120;P321.z=80; /P21P322.x=30; P322.y=130;P322.z=30; /P22P323.x=-100;P323.y=150;P323.z=-50;/P23P330.x=350; P330.y=30; P330.z=150;/P30P331.x=200; P331.y=150;P331.z=50; /P31P332.x=50; P332.y=200;P332.z=0; /P32P333.x=0; P333.y=100;P333.z=-70;/P33void CDrawBizerCurve:ObliqueProjection()/斜等测投影for(int i=0;i<4;i+)for(int j=0;j<4;j+)P2ij.x=P3ij.x-P3ij.z/sqrt(2);P2ij.y=P3ij.y-P3ij.z/sqrt(2);void CDrawBizerCurve:DrawCtrlPolygon(CDC *pDC)/绘制控制多边形ReadPoint();ObliqueProjection();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,0);pOldPen=pDC->SelectObject(&NewPen);for(int i=0;i<4;i+)pDC->MoveTo(Round(P2i0.x),Round(P2i0.y);for(int j=1;j<4;j+)pDC->LineTo(Round(P2ij.x),Round(P2ij.y);for(int j=0;j<4;j+)pDC->MoveTo(Round(P20j.x),Round(P20j.y);for(int i=1;i<4;i+)pDC->LineTo(Round(P2ij.x),Round(P2ij.y);pDC->SelectObject(pOldPen);NewPen.DeleteObject();void CDrawBizerCurve:DrawObject(CDC *pDC)/绘制双三次Bezier曲面double x,y,u,v,u1,u2,u3,u4,v1,v2,v3,v4;double M44;M00=-1;M01=3; M02=-3;M03=1;M10=3; M11=-6;M12=3; M13=0;M20=-3;M21=3; M22=0; M23=0;M30=1; M31=0; M32=0; M33=0;LeftMultiMatrix(M,P3);/数字矩阵左乘三维点矩阵TransposeMatrix(M);/计算转置矩阵RightMultiMatrix(P3,MT);/数字矩阵右乘三维点矩阵ObliqueProjection();/轴侧投影for(u=0;u<=1;u+=0.04)for(v=0;v<=1;v+=0.04)u1=u*u*u;u2=u*u;u3=u;u4=1;v1=v*v*