2.6 Visual C++中基本绘图函数
实际利用Visual C++中编制图形程序,可以利用图形学算法自己动手编制基本图形程序,作为图形程序的基类,当然还可利用系统中已提供的图形基类。下面简单介绍Visual C++提供的常用绘制图形函数。 1.点
画点是最基本的绘图操作,在绘图中,画点是通过调用CDC::SetPixel()或CDC∷SetPixelV()函数来实现的。 2.画笔 3.画刷
4.绘制直线函数 MoveTo()函数 LineTo()函数 5.椭圆函数
6.函数绘制一段椭圆弧 7.矩形函数 8.连续画线函数 9.多边形绘制函数 10.填充函数 思考题:
1、写出适合任何情况下的逐点比较法算法。 2、写出用Bresenham算法绘制多边形的算法。 3、试分析几种常用画线算法的优缺点。
4、已知直线段起点坐标为(0,0), 终点为(-8,6),试用三种画线算法来描述生成直线描点的过程。 5、如何改造构造好的绘制直线算法为绘制虚线算法?请在VC环境中实现。
第三章 二次曲线
教学学时:8课时 教学目的与要求:
让学生初步掌握绘制圆的几种算法,逐点绘制圆的方法,中点画圆方法,Bresenham画圆的方法,掌握绘制椭圆的二种方法,逐点绘制法和中点绘制法,掌握抛物线的绘制方法逐点绘制法。了解一些其他绘制圆的方法思想,比如多边形逼近法,角度参数直接法等等。掌握这些算法的理论原理,学会从理论上的算法转换到编译程序中的代码实现这个思维过程,能够分析基本算法的优缺点,掌握算法的改良后适合计算机实现的算法,了解计算机计算和理论计算的差异。
教学重点:逐点绘制的算法思想总结及在绘制直线,圆,椭圆,抛物线上的
应用和改进算法的相似性对比。中点法画圆的思想推导出画椭圆的算法。
教学内容:
3.1 圆弧的逐点插补法 3.2 圆弧的Bresenham算法 3.3 绘制圆弧的其它几种方法 3.4 椭圆的生成算法 3.5 其它二次曲线绘制举例
3.1圆弧的逐点插补法
圆弧逐点插补法算法的基本思想是:在绘制圆弧的过程中,每绘制一个点就与圆弧进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近圆弧,逐点比较法的执行过程如下:
设判决函数为:
Fk?x?y?R2k2k2
若画第一象限的圆弧AB,如上图所示,起点为A(xa, ya), 终点为B(xb, yb),圆心为O(0,0),设绘图笔当前位置为K(xk, yk),这里的坐标为局部坐标。
当K在AB上时,Fk=0; K在AB外侧时,Fk>0; K在AB内侧时,Fk<0。
加上圆周的八对称性质,绘制完整的圆其实只要绘制出八分之一圆弧部分就可以了,其它可以通过对称点判断得到。
3.2 圆弧的Bresenham算法
第一象限顺时针画第一象限四分圆,如图所示,下一步选择哪个点?
YB(xb , yb)K(xk , yk)RA(xa , ya)OX下一个候选点有三个,H点,D点,V点,注意区分这个方法同中点画圆方法的不同,中点绘制圆的方法如果是第一象限顺时针绘制,下一个候选点只考虑H点和D点,而不考虑V点,造成的后果就是当圆的半径偏大时候,绘制出来的圆的误差大一些。
教材上提到的是简化的BRESENHAM画圆算法,实际绘制圆的过程中,取V点的次数很少,一般取的都是D点或H点,完整的BRESENHAM绘制算法复杂性是简化算法的二倍以上。所以从运算速度上讲,简化的算法速度更快,判断更少。缺点是可能造成误差更大,实际应用中我们一般取个折衷,对速度性能要求很高,我们牺牲点精度取速度,对精度要求很严格,那就牺牲点速度取精度。如何取与舍看场合,根据实际应用。同学们大脑中要有这种算法分析的概念与思想。 3.3 绘制圆弧的其它几种方法
除了前二节介绍的逐点绘制圆弧的算法,bresenham绘制圆弧算法外,还有很多种算法可以绘制圆,比如直角坐标的方法,参数方程角度DDA法,中点画圆法,圆弧正负法,圆弧的角度法,DDA方法,内(外)接多边形法等方法,下面简要介绍这些绘制圆弧的算法。有兴趣同学可以根据这些算法思想提炼出程序,来锻炼自己思维的能力和编程的能力,这一点对以后工作或者科研非常有帮助。在大学里面同学们主要学到的是思维的能力和学习的能力。 角度DDA法产生圆弧
若已知圆心坐标为(xc, yc),半径为R,则以角度t为参数的圆的参数方程可写为
?x?xc?Rcost??y?yc?Rsint当t从 0 变化到2π时,上述方程所表示的轨迹是一整圆; 当t从起始角ts变化到终止角te时,则产生一段圆弧。由于我们定义角度的正方向是逆时针方向,所以圆弧是由ts到te逆时针画圆得到的。 中点画圆法
假设圆方程 F(X,Y)=X2+Y2-R2=0
见下图,当前点位置,下二个候选点中点坐标为M=(Xp+1,Yp-0.5):
d?F(M)?F(xp?1,yp?0.5)?(xp?1)2?(yp?0.5)2?R2
相关推荐: