第2章 基本图形生成算法
- 格式:ppt
- 大小:1.01 MB
- 文档页数:95
3基本图形生成算法由于绘图机传动机构的限制,绘图时绘图笔只能作四个基本方向及组合的运动(共8个方向)。
每送一个信号就会驱使绘图笔沿8个方向之一移动一个步距,经过多次移动(形成阶梯状折线),即可给出人们需要的由折线逼近的复杂图形。
在显示器中绘制图形时,由于图形显示器像元的点阵分布,只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近于该图形的一组像素。
绘图机的移动步距及显示器的像素决定着绘图的精度。
3.1直线的生成3.1.1数值微分法直线的斜率:x y k ∆∆=/。
其中,),(),(,,11000101y x y x y y y x x x 和-=∆-=∆分别是直线的端点坐标。
然后,从直线的起点开始,确定最佳逼近于直线的y 坐标。
假定端点坐标均为整数,让x 从起点到终点变化,每步递增1,计算对应的y 坐标,y=kx+B ,并取像素(x ,round(y))。
用这种方法既直观,又可行,然而效率较低。
这因为每步运算都需要一个浮点乘法与一个舍入运算。
注意到 xk y xk B kx Bx x k Bkx y i i i i i ∆+=∆++=+∆+=+=++)(11因此,当1=∆x 时,又k y y i i +=+1,既当x 每递增1时,y 递增k (即直线斜率)。
一开始,直线起点(x 0,y 0注意上述分析和算法仅适用于|k|<=1的情形。
在这种情况下,x 每增加1,y 最多增加1,故在迭代过程的每一步,只要确定一个像素。
而当直线斜率k 的绝对值超过1时,必须把x,y 的地位交换,y 每增加1,x 相应增加1/k 。
数值微分法的本质,是用数值方法解微分方程,通过同时对x,y 各增加一个小增量,计算下一步的x,y 值。
在一个迭代算法中,如果每一步的x,y 值是用前一步的值加上个增量来获得的,那么,这种算法就成为增量算法。
在这个算法中,y 和k 必须用浮点数表示,而且每一步运算都必须对y 进行舍入取整。
2.6图形的剪裁内容提要(1)计算机是如何将几何图形显示到屏幕上的?(2)了解各种坐标系的定义及其作用;(3)熟悉二维观察流程;(4)掌握2维坐标变换的基本方法;(5)掌握常用的二维裁剪算法,并会编程实现。
在计算机图形显示的过程中,往往需要确定图形的哪些部分(包括点、线段、文字、多边形等)落在显示区域(即:视口或视区)之内,哪些部分落在显示区域之外,以便只显示位于显示区域内的那部分图形。
裁剪的实质就是决定图形中哪些部分位于指定的区域内。
这需要进行几何处理,以便去除落在指定区域之外的部分,保留位于指定区域以内的部分。
这个过程称为裁剪。
最直观的裁剪方法是把各种几何图素通过扫描转换等技术离散成为点的集合,再逐点判断其是否位于指定的区域内。
那样虽然简单,但是效率太低,一般不可取。
1、线段的裁剪对于一条给定的线段,其裁剪过程一般包括以下几个部分:首先测试和判断它是否完全落在裁剪区之内?如果不是,再判断它是否完全落在裁剪区之外?然后,对于既不能确定完全落在裁剪区之内又不能确定完全落在裁剪区之外的线段,要计算它与一个或多个裁剪边界的交点。
最后,对线段的端点进行测试,对于两个端点都落在裁剪区域内的线段就存储起来,否则就予以去除,即裁剪之。
一、C o h e n-S u t h e r l a n d裁剪算法这个算法的特点是:通过初始测试来快速判断线段与视区的关系,以便减少线段求交的次数,从而提高裁剪算法的速度。
C o h e n-S u t h e r L a n d裁剪算法的基本思想:对每条线段P1P2:1)判断端点在裁剪区域内、外:P1P2完全在视区内,保存之;P1P2完全在视区外,舍弃之;2)上述两条件均不满足,则计算图形与裁剪边界的交点,将该线段分为分别位于裁剪区域内、外的两段,再重复1)。
在分段时,依据端点的区域码分别计算线段与各条裁剪边界的交点,如图3.10所示,对P1就需要分别计算交点P3和P4;即只要按顺序检测端点区域码的每一位,当某位不为0时,才把线段与对应的裁剪边界进行求交。
基本图形生成算法(基于VC++6.0实现)仲恺农业工程学院实验报告纸计算科学学院(院、系)信计082 班计算机图形学课学号:200811314211 姓名:孙青海实验日期:2011/5/20 教师评定实验一基本图形生成算法一、实验目的与要求:1. 掌握中点Bresenhanm绘制直线的原理2. 设计中点Bresenhanm算法3. 掌握八分法中点Bresenhanm算法绘制圆的原理4. 设计八分法绘制圆的中点Bresenhanm算法5. 掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenhanm算法原理6. 掌握下半部分椭圆偏差判别式的初始值计算方法7.设计顺时针四分法绘制椭圆的中点Bresenhanm算法二、实验描述:1. 使用中点Bresenhanm算法绘制斜率为01≤≤的直线。
k2. 使用中点Bresenhanm算法绘制圆心位于屏幕客户区中心的圆。
3. 使用中点Bresenhanm算法绘制圆心位于屏幕中心的椭圆。
三、实验结果:1.打开VC++6.0程序;2.创建一个MFC工程,命名为exper1;选择单文档和作为静态的DLL,然后完成创建MFC工程;3.在ResourceView工作区窗口插入三个Dialog,第一个对话框作为画直线时用户输入起点坐标和终点坐标使用,第二个对话框作为画圆时用户输入所要画圆的半径使用,第三个对话框作为画椭圆时用户输入所要画椭圆的长半径和短半径使用;4.通过右键点击对话框选择建立类向导,因为本对话框是新建对话框还没有建立类向导,在此要新建一个line类,如下图所示,按照此方法将其他的两个对话框建立类向导分别为画圆建立Round类,画椭圆,建立Ellips类;5.完成类得建立后,对该对话框中的输入框进行添加变量与其关联,具体步骤如下图所示,按照此方法将所有的对话框中的输入框进行变量添加;6.打开Menu菜单中的选项,新建一个画图菜单,在画图菜单中新建直线、圆与椭圆子菜单,新建方法点击空白方框处右键选择属性,添加标明即可;7.点击子菜单,这里以直线为例,点击右键选择“建立类向导”,因为此时的直线的ID为“ID_1”,所以我们选择ID_1,类名选择刚刚建立的line类,按照下图中的方法,点击OK后向导既建立完成,建立完成后的图如下所示;。