光 栅 图 形 学 算 法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图形学(4)多边形的扫描转换(上)
由于计算机屏幕的光栅显示,需要发展一套相应的光栅图形学算法配合它。

前面介绍了直线段如何才能显示在计算机屏幕上,接下来要介绍一下多边形如何在计算机屏幕上显示,内部颜色又如何填充。

多边形的扫描转换
多边形的扫描转换和区域填充的实质是思考如何在离散的像素集上表示连续的二维图形,目前主要用两种方法表示一个多边形:定点表示和点阵表示
定点表示和点阵表示
定点表示:
用多边形的定点序列来表示多边形,这种方法直观,几何意义强,占内存少,且易于进行几何转换。

但是由于其并未说明具体哪些像素点在多边形内部,故着色时仍需特定算法
点阵表示:
用多边形内的像素表示多边形,这种方法丢掉了很多多边形的几何属性,不易于几何转换,但却是光栅显示中所需要的表示形式。

定点表示与点阵表示之间的相互转换成了光栅显示中需要研究的重要问题。

其中,定点表示转换为点阵表示称为多边形的扫描转换,而点阵表示转换为定点表示不属于计算机图形学的研究范畴,需要图像识别的知识去实现它。

多边形的扫描转换
多边形也有分类:凸多边形(任意两顶点连线均在多边形内),凹多边形(不符合凸多边形的定义),含内环多边形(多边形内包含多边形)
现在,要讨论的问题就转化为了已知边界,找到多边形内部的点并填色问题。

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

区间的端点通过扫描线与多边形边界线交点获得
如图,按y正方向递增的扫描线算法可以按如下步骤求得:
确定多边形所需扫描线的最大、最小y值,也即多边形定点的最值。

按y值递增循环,每次循环时循环体中要进行的工作有:
a)?扫描线与多边形各边求交b)?所有交点按照递增顺序排序c)?交点配对,确定多边形在该条扫描线处的内、外d)?对“内”区间进行颜色填充
但是,这看似没毛病的算法其实是有隐患的,其一就是交点的配对问题。

比如,万一我的扫描线撞上多边形定点,然后多边形与扫描线交点是奇数个怎么办?(也就是上图中过点P3时的情况)X-扫描线算法潜在问题1:交点配对
对于交点个数问题,我们只要制定一套严谨的交点个数计数方案,规定好什么时候计算交点,什么时候不计算就行了。

网课里讲的解决方案思路如下:
1.若共享定点的两条边分别落在扫描线两遍,则交点计1个
2.若共享定点的两条边在扫描线的同一侧,则交点计2或0个
转换成算法去实现时,可以检查共享顶点的两条边的另外两个端点y值,按这两个y值中大于交点y值的个数来决定交点数(反正我觉着挺巧妙的)
X-扫描线算法潜在问题2:效率过低
相比之下,效率问题就没有那么好解决了。

该算法扫描计算与各边交点时,最简单的方法就是把所有边都放入一个表中,处理扫描线时,按顺序取出各边,分别与扫描线求交。

但其实,这个算法效率低得出奇。

可能会奇怪,算法步骤挺简练的啊,究竟效率问题出在哪里了呢?答案就在“求交”二字,求交的计算量在计算机处理时是非常大的。

但是,业界大佬们经过思考,也弄出了一套相应的,精妙的解决方案,大致是用一套特殊的数据结构去避免求交运算,因篇幅较长,再开一篇介绍它
(1)确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax)
sprintf(str,"%lf",totaltime );--转换整型a至str
若点 p1(x1,y1)和p2(x2,y2)均在窗口外,且满足下列四个条件之一:
注意:在执行上面的全整数运算代码之前,必须检查m∈[0,1)是否满足,我们可以用下式来判断:
为了在光栅显示器上用有限的点逼近无限的点构成的直线,需要知道这些像素点的x,y坐标
int y1 = m_start.m_y; -- 起点y
好了,整套笔记到目前位置,我们已经解决大部分光栅化的问题了,接下来就是如何真正的计算每个三角形面上点的颜色了(shading)!该部分内容会在之后的笔记中给出。

应用程序阶段一般是图形渲染管线概念上的第一个阶段,开发者通过程序的方式对图元数据等信息进行配置和调控,最后传输到下个阶段。

采用直线的一般式方程:Ax+By+C=0 ?F(x,y)=0,其中a = y0 - y1,b = x1 - x0,c = x0y1 - x1y0
递归执行,算法很简单,但是效率不高。

区域内每一像素都引进一次递归,进-出栈,费时费内存。

相关文档
最新文档