图形学(4)多边形的扫描转换(上)

来源:互联网 发布:大张一刀流 知乎 编辑:程序博客网 时间:2024/06/05 06:59

本模块内容绝大部分是在慕课上看中国农业大学网客时的笔记,因此算作转载,在此鸣谢赵明、李振波两位老师,感谢他们录制该门课程供大家学习!

 

由于计算机屏幕的光栅显示,需要发展一套相应的光栅图形学算法配合它。前面介绍了直线段如何才能显示在计算机屏幕上,接下来要介绍一下多边形如何在计算机屏幕上显示,内部颜色又如何填充。

 

多边形的扫描转换

 

多边形的扫描转换和区域填充的实质是思考如何在离散的像素集上表示连续的二维图形,目前主要用两种方法表示一个多边形:定点表示和点阵表示

定点表示和点阵表示

定点表示:

用多边形的定点序列来表示多边形,这种方法直观,几何意义强,占内存少,且易于进行几何转换。但是由于其并未说明具体哪些像素点在多边形内部,故着色时仍需特定算法

点阵表示:

用多边形内的像素表示多边形,这种方法丢掉了很多多边形的几何属性,不易于几何转换,但却是光栅显示中所需要的表示形式。


定点表示与点阵表示之间的相互转换成了光栅显示中需要研究的重要问题。其中,定点表示转换为点阵表示称为多边形的扫描转换,而点阵表示转换为定点表示不属于计算机图形学的研究范畴,需要图像识别的知识去实现它。


多边形的扫描转换

多边形也有分类:凸多边形(任意两顶点连线均在多边形内),凹多边形(不符合凸多边形的定义),含内环多边形(多边形内包含多边形)

现在,要讨论的问题就转化为了已知边界,找到多边形内部的点并填色问题。

X-扫描线算法

X-扫描线算法核心思想是按一定顺序,用扫描线去与多边形相交,计算其相交区间并对相交区间填色。区间的端点通过扫描线与多边形边界线交点获得

 

如图,按y正方向递增的扫描线算法可以按如下步骤求得:

  1. 确定多边形所需扫描线的最大、最小y值,也即多边形定点的最值。
  2. y值递增循环,每次循环时循环体中要进行的工作有:
    1. a) 扫描线与多边形各边求交
    2. b) 所有交点按照递增顺序排序
    3. c) 交点配对,确定多边形在该条扫描线处的内、外
    4. d) “内”区间进行颜色填充

但是,这看似没毛病的算法其实是有隐患的,其一就是交点的配对问题。比如,万一我的扫描线撞上多边形定点,然后多边形与扫描线交点是奇数个怎么办?(也就是上图中过点P3时的情况)

 

X-扫描线算法潜在问题1:交点配对

对于交点个数问题,我们只要制定一套严谨的交点个数计数方案,规定好什么时候计算交点,什么时候不计算就行了。网课里讲的解决方案思路如下:

1.若共享定点的两条边分别落在扫描线两遍,则交点计1个

2.若共享定点的两条边在扫描线的同一侧,则交点计2或0个

转换成算法去实现时,可以检查共享顶点的两条边的另外两个端点y值,按这两个y值中大于交点y值的个数来决定交点数(反正我觉着挺巧妙的)

 

X-扫描线算法潜在问题2:效率过低

相比之下,效率问题就没有那么好解决了。该算法扫描计算与各边交点时,最简单的方法就是把所有边都放入一个表中,处理扫描线时,按顺序取出各边,分别与扫描线求交。但其实,这个算法效率低得出奇。

可能会奇怪,算法步骤挺简练的啊,究竟效率问题出在哪里了呢?答案就在“求交”二字,求交的计算量在计算机处理时是非常大的。但是,业界大佬们经过思考,也弄出了一套相应的,精妙的解决方案,大致是用一套特殊的数据结构去避免求交运算,因篇幅较长,再开一篇介绍它

 

 

 

 

 

 

 

 

阅读全文
0 0
原创粉丝点击