- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五讲区填满
决不要把你们的学习看成是任务,而要把它当作一个令人羡慕的机会,为了你们自己的快乐和今后你们所从事行业的利益,去学习,去了解精神领域上的美,它具有能让人自由解放的力量。
—爱因斯坦;教学基本要求:
1.1 直线的生成算法;
1.2 圆的生成算法;
1.3 区域填充算法;
1.4 裁剪算法。
;本章讨论的是如何在光栅扫描显示器上构造直线、圆、填充区域等基本二维几何图形(图元)
在光栅扫描显示器上构造二维图形就是要找出最靠近所描述几何图形的那些像素的坐标,将其置为规定的颜色并放入帧缓存。
在光栅显示平面上,每个像素具有一定的尺寸,是显示平面上可被访问的最小单位,它的坐标x和y只能是整数。
直线的两种常用生成算法:DDA算法和Bresenham算法;圆的常用生成算法:中点画圆算法
;教学基本要求:
1.1 直线的生成算法;
1.2 圆的生成算法;
1.3 区域填充算法;
1.4 裁剪算法。
;之前介绍的直线和圆都属于线划图(线图元)
区域填充属于面着色(填充图元),二维的面着色体现逼真的视觉效果,是三维多边形面着色的基础。
表示一个区域的要素为:
边界(闭合区域)+ 填充色(灰度或色彩)
区域填充即给出一个闭合区域的边界,要求对边界范围内的所有像素单元赋予指定的颜色代码。
因此,区域填充算法的一般步骤如下:
确定那些像素位于填充图元的内部;
确定以什么颜色填充这些像素;
;检验夹角之和
射线法检验交点数;若夹角和为0,则点p在多边形外;大小:利用余弦定理
方向:令;;多边形填充
边界由闭合的线段(多边形)组成,一般由多边形的顶点序列来表示多边形。
种子填充
边界由边界色给出。
;填充条件
多边形的顶点序列(Pi,i=0,1,…,n)、填充色。
多边形内点的判别准则
对多边形进行填充,关键是找出多边形内的像素。即首要问题是判断一个像素是在多边形内还是多边形外。;;多边形P的顶点可分为两类:极值奇点和非极值奇点。如果(yi-1 - yi)(yi+1 - yi)≥0,则称顶点Pi为极值点;否则称Pi为非极值点。
规定:奇点是极值点时,该点按两个交点计算,否则按??个交点计算。
奇点的预处理:;;void FillPolygonPbyP(Polygon *P,int polygonColor)
{ int x,y;
for(y = ymin;y = ymax;y++)
for(x = xmin;x = xmax;x++)
if(IsInside(P,x,y))
PutPixel(x,y,polygonColor);
else
PutPixel(x,y,backgroundColor);
}/*end of FillPolygonPbyP() */;边的相关性
相邻扫描线上的交点是与多边形的边线相关的。对同一条边,前一条扫描线yi与该边的交点为xi,而后一条扫描线yi+1=yi+1与该边的交点则为xi+1=xi+1/m,利用这种相关性可以省去大量的求交运算。;边表(ET:Edge Table)
用来对边(除水平边外)进行登记,建立边的记录。边的记录定义为:
第一项:某边的最大y值(ymax)。
注意要进行奇异点处理:对于非极值点应该ymax=ymax-1。 第二项:某边的最小的y对应的x值。 第三项:某边斜率的倒数:1/m。 第四项:指针。用来指向同一条扫描线相交的其它边。
如果其它边不存在,则该项置空。
;活动边表(AET:Active Edge Table)
ET表建立以后,就可以开始扫描转换了。对不同的扫描线,与之相交的边线也是不同的,当对某一条扫描线进行扫描转换时,我们只需要考虑与它相交的那些边线,为此需要建立一个只与当前扫描线相交的边记录链表,称之为活动边表。
;对下图的多边形利用有序边表填充算法进行处理:
建立ET表(注意:在做奇异点处理时,当该边最大y值对应的顶点为非极值点时,边记录的第一项:ymax=ymax-1。例如:P3P4边、P3P2边、P4P5边)
建立AET表(AET表的建立过程就是进行填充的过程)
(1)合并ET表(2)x递增排序;(3)实施填充;(4)删除ymax=yj的边;
(5)修改边记录xi=xi+1/m;(6)yj+1进入下一轮循环。
;有序边表填充算法演示.swf; 1、根据给定的多边形顶点坐标,建立ET 表。
2、AET表初始化,每个桶置空。
3、for(y=ymin;y= ymax;y++)
{ 合并当前扫描线y的ET表;
将y桶中每个记录按x项升序排
文档评论(0)