用于对凸多边形进行栅格化的系统及方法

文档序号:6467888阅读:241来源:国知局
专利名称:用于对凸多边形进行栅格化的系统及方法
技术领域
本发明涉及图像图形处理领域,更具体地涉及一种用于对凸多边形进行栅格化的
系统及方法。
背景技术
栅格化是计算机图形学中将图元扫描变换成显示像素的一种技术,是将矢量图形 格式表示的图像变换成栅格图像以用于显示器或打印机等的输出的过程。对图元进行栅格 化的过程主要包括两个步骤首先,确定显示平面上哪些像素是由图元覆盖的;其次,将图 元的属性(颜色、深度、以及纹理等)赋给每个像素。 计算机图形学领域中存在很多多边形栅格化的方法。其中的一个主要方向是,将 多边形分割成三角形,然后对三角形进行栅格化,该方法在栅格化之前需要很多计算资源 来进行三角化和几何设置。另外的一个主要方向是,使用Jordan曲线定理和多边形边之间 的跨距来进行栅格化,该方法适合凸多边形和凹多边形,但是不适合使用边方程算法来实 现。 综上所述,现有的用于对多边形进行栅格化的方法/系统的栅格化架构非常复 杂,所以实现困难且浪费软件及硬件资源。

发明内容
鉴于以上所述的一个或多个问题,本发明提供了一种新的用于对凸多边形进行栅 格化的系统及方法,以通过较为简单的栅格化架构来实现对凸多边形的栅格化,从而节省 对凸多边形进行栅格化时所使用的软件及硬件资源。 根据本发明实施例的用于对凸多边形进行栅格化的系统,包括设置模块,用于计 算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的栅格化区 域的边界框对所述栅格化区域的区域限定信息,以及根据区域限定信息创建所述边界框, 其中,n为大于3的整数;扫描模块,用于利用区域限定信息找出对所述栅格化区域进行扫 描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对所述栅格 化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断扫描 到的像素需要描画,否则判断扫描到的像素不需要描画;以及描画模块,用于在扫描到的像 素需要描画的情况下,对扫描到的像素进行描画。 根据本发明实施例的用于对凸多边形进行栅格化的方法,包括计算需要进行栅 格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的栅格化区域的边界框对 所述栅格化区域的区域限定信息,以及根据区域限定信息创建所述边界框,其中,n为大于 3的整数;利用区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用凸n边形的 n条边的边方程系数逐个判断从起始位置开始对所述栅格化区域进行扫描的过程中扫描到 的像素是否位于所述栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描 到的像素不需要描画;以及当扫描到的像素需要描画时,对扫描到的像素进行描画。
本发明结合使用了边方程算法和局部边方法来对凸多边形进行栅格化,从而使得 对凸多边形进行栅格化的栅格化架构与现有技术相比结构相对简单,从而可以节省对凸多 边形进行栅格化时所使用的软件及硬件资源,提高对凸多边形进行栅格化的速度。


图1是根据本发明实施例的用于对凸多边形进行栅格化的系统的框图;
图2是根据本发明实施例的设置模块的动作过程的框图; 图3是根据本发明实施例的扫描模块与设置模块和描画模块进行配合作业的动 作过程的框图; 图4是根据本发明实施例的用于对凸多边形进行栅格化的系统的流水线处理过 程的流程图; 图5是根据本发明实施例的边界框完全覆盖凸多边形的示意图;
图6是根据本发明实施例的坐标系和局部边的说明性示意图; 图7是根据本发明实施例的说明利用左上规则判断凸多边形的各边是否需要描 画的情况的说明性示意图; 图8是根据本发明实施例的说明判断当前扫描到的像素是处于凸多边形的局部 边之间还是处于凸多边形的两侧的情况的示意图; 图9是根据本发明实施例的起始单元位于凸多边形的上顶点处的情况的示意图;
图10是根据本发明实施例的起始单元位于边界框范围内的凸多边形部分的左上 顶点处的情况的示意图; 图11是根据本发明实施例的起始单元位于边界框范围内的凸多边形部分的左上 或右上顶点处的情况的示意图; 图12是根据本发明实施例的起始单元位于边界框范围内的凸多边形部分的左上 顶点处的情况的示意图; 图13是根据本发明实施例的起始单元位于边界框范围内的凸多边形部分的右上 顶点处的情况的示意图; 图14是根据本发明实施例的说明判断当前扫描到的像素是处于凸多边形的左侧 还是右侧的情况的示意图; 图15是根据本发明实施例的依次扫描边界框范围内的凸多边形部分的过程的示 意图;以及 图16是根据本发明实施例的对当前扫描到的像素进行插值的情况的说明性示意 图。
具体实施例方式
在本发明中,使用边方程算法和局部边方法对凸多边形进行栅格化。其中,边方程 定义了两个平面,如果像素在一个半平面的边方程值为正,那么其在另一个半平面的边方 程值为负,这有利于判断当前像素是否在凸多边形内。局部边是与当前扫描线相交的多边 形边,对于凸多边形来说,只存在两条局部边,它们组成三个平面左平面、多边形内平面、 和右平面。使用局部边来判断像素是否画,以及对像素进行参数插值是相对容易的。
7
本发明的一种实施方式中使用的坐标系统具有如下形式原点位于左上方,X轴
向右,y轴向下。 根据本发明实施例的用于对凸多边形进行栅格化的系统可以对按顺时针排序的n 顶点多边形进行栅格化。其中,n顶点多边形的顶点坐标是x[i]和y[i],O < = i <n。
根据本发明实施例的系统包括一个设置模块、一个扫描模块、以及一个描画模块, 如图1所示。其中,设置模块和扫描模块的动作过程的框图分别如图2和图3所示。根据 本发明实施例的系统的流水线处理过程的流程图如图4所示。 如图4所示,根据本发明实施例的系统的工作过程为S402,从节点内存中取出多 边形顶点信息;S404,根据多边形顶点信息计算边方程系数;S406,根据多边形顶点信息寻 找多边形的最顶端顶点,对多边形进行裁剪,以及创建边界框;S408,将边方程系数存储在 内存中,用于后续处理;S410,寻找对裁剪后的多边形进行扫描的起始单元,并寻找局部边; S412,判断扫描到的像素是否需要描画;S414,对扫描到的像素进行插值;S416,将扫描到 的像素的颜色信息存入像素缓存;以及S418,将扫描到的像素描画出来。
下面描述根据本发明实施例的设置模块和扫描模块的具体细节
—、设置模块。设置模块主要进行以下动作
1.计算边方程系数 一个像素(x, y)相对于由顶点(x[O], y[O])和(x[l], y[l])组成的边的边方程
为e(x,y) =_(y[l]-y
) (x-x
) + (x[1]-x
) (y-y[O]) = (y
-y[1])x+(x[1]-x
)
y+x
y[l]-x[l]y
二ax+by+c,这里(x, y) 、 (x
, y
)、以及(x[l],y[l])是设备坐标
系统中的坐标。因此,可以获得(下面的01表示从0标号的点开始,到1标号的点结束) a01 = y[O]-y[l]; b01 = x[l]-x[O]; c01 = x[O]y[l]-x[l]y[O]。 对于n顶点凸多边形,存在n条边。因此,存在三个数组a[n] 、 b[n]和c[n]。在 这里,可以使用存储器来存储这些值 a[O] = a01, a[l] = a12, a[2] = a23, , a[n-1] = a(n-1)0,b[O] =b01,b[l] =bl2,b[2] = b23, , b [n_l] =b(n_l)0, c[O] = c01, c[l] = c12, c[2] = c23, , c[n-l] = c(n-l)O, 这里,ai j 、 bi j和ci j表示这些值是通过i顶点到j顶点的边方程计算出来的。 2.创建边界框 在由 (xmin, ymin)禾口 (xmax, ymax)组成的边界框(例如,图5中的502)仓ll建之 前,需要找到多边形顶点的最小和最大坐标值。顶点(xs, ys)用于记录多边形的最顶端顶 点,同时系统也使用一个变量clipmap记录裁剪信息,它们都用于扫描模块中寻找起始单 元(例如,图9中的902、图10中的1002、图11中的1104、图12中的1202、以及图13中的 1302)。对于裁剪信息,只有以边界窗口 (即,边界框)的上边(例如,图11中的H02)、左 边(例如,图12中的1202)、和右边(例如,图13中的1302)进行裁剪的情况需要记录。
由于在本发明的实施例中,将同一列的两个像素称为像素单元(例如,图5中的 504),因此在每次扫描时扫描转换两条像素线(偶数线和奇数线)。边界框的上边的y坐标 总是为偶数,边界框的底边y坐标总是为奇数。
8
具体地,寻找最顶端顶点、记录裁剪信息、以及创建边界框的过程为首先,将多边 形的第一个顶点初始化为最小坐标点、最大坐标点、以及寻找起始点,同时初始化clipm即 为0。然后,从多边形的第一个顶点开始,依次在多边形的n条边中寻找,看是否有更大以 及更小的坐标值,如果有,就替换掉原来的最大以及最小坐标,同时记录最小的y坐标所在 的顶点为最顶端顶点,并将浮点型数值的最大、最小坐标值进行整数化从而获得未裁减的 边界框。最后,依次按照顶边、左边和右边的顺序分别比较新的边界框和当前边界框的坐 标,以获得新的边界框坐标,并记录裁剪信息。如果新的边界框的顶边与多边形相交,则 clipm即的最低位置为1 ;如果新的边界框的左边与多边形相交,则clipm即的最低第2位 置为1 ;如果新的边界框的右边与多边形相交,则clipm即的最低第3位置为1。对于该过 程,可以通过以下程序段实现
fxmin = fxmax = xs = x[O];
fymin = fymax = ys = y[O];
clipmap = 0 ;
for (i = 1 ;i < n ;i++) {
if (fxmin > x[i])fxmin = x[i]; if (fymin > y[i]) { fymin = y[i];
//Keep the coordinates of the topmost vertex xs = x[i] s ys = y[i];




















if (fxmax < x [i]) fxmax = x [i] if (fymax < y [i]) fymax = y [i]
xmin = (int) (fxmin) + (fxmin >= 0. Of O:-l); xmax = (int) (fxmax)+l ; ymin = (int) (fymin) &( 1); ymax = (int)(fymax+1) |1 ; //Keep the clipping information.
//Clip window consists of(clip_xmin,clip_ymin)and(clip_xmax,clip_ymax) if (ymin < clip_ymin) {ymin = clip_ymin ;clipmap & = lb ;} if (xmin < clip_xmin) {xmin = clip_xmin ;clipmap & = 10b ;} if (xmax > clip_xmax) {xmax = clip_xmax ;clipmap & = 100b ;} if(ymax > clip_ymax)ymax = clip_ymax ;
需要设置模块传递到扫描模块的数据包括x[n+l] 、y[n+1] 、a[n] 、b[n] 、c[n] 、xs、 ys、xmin、ymin、xmax、ymax、clipmap、以及p[n+l]。这里,p[n+l]是存储多边形顶点上参数 (颜色、纹理和深度等)的数组。特别地,在数组x[n+l]、y[n+l]和p[n+l]中,数组元素有 如下关系:x[n] == x
,y[n] == y
,p[n] == p[O]。
二、扫描模块。扫描模块主要进行以下动作
在扫描模块进行具体动作之前,我们预先定义如何判断像素是否需要描画(通过 JudgeDrawing ()函数实现)。 首先,需要找到对应当前扫描线y二yc(例如,图6中的602)的局部边(例如,图 6中的604)。局部边是与当前扫描线相交的多边形边。对于一个由顶点V[i](x[i],y[i]) 和V[i+l] (x[i+l],y[i+l])构成的多边形边来说,当满足条件y[i] <yc<=y[i+l]或者 y[i+l] <yc<=y[i]时,它就是一条局部边。对于凸多边形来说,只有两条局部边。
寻找局部边的过程为依次将多边形中的每一条边的两个端点的y坐标y[i]、 y[i+l]与当前扫描线的y坐标yc进行比较,如果满足条件y[i] <yc<=y[i+l]或者 y[i+l] 〈yc〈二y[i],则将多边形的该条边的计数i记录下来。对于该过程,可以通过以 下程序段实现 FindlxicalEdges (yi) { j = 0 ; for(i = 0 ;i < n ;i++) { if (y[i] < yi <= y[i+l] | |y[i+l] < yi <= y[i]) localEdgeN咖[j] = i ; j++ ; } } if (j > 1) return error ; } 在特殊情况下,当满足条件y[i] ==yc==y[i+l]时,当前扫描线与当前多边 形边重合,此扫描线上的像素位于此多边形边上,此时只需要应用左上规则来判断当前像 素是否需要描画。另外,如果当前像素在局部边上,则其相对于局部边的边方程值为0,此时 也只需要应用左上规则来判断当前像素是否需要描画。 此时,利用多边形的边法线(a[i],b[i])来确立左上规则,如图7所示。如果a[i]
<0,则此边为右侧边(例如,图7中的702);如果a[i] 二二O并且b[i] <0,此边为底侧
边(例如,图7中的704)。如果当前像素位于右侧或者底侧边上,当前像素不需要描画。如
果当前像素位于上侧边或者左侧边(例如,图7中的706),则其需要描画。 如果当前像素不在局部边上,那么它就在配对的局部边之间或者一侧,分别称为
中间性和一侧性,如图8所示。如果当前像素相对于配对的局部边的边方程值都为正,则当
前像素具有中间性(即,位于配对的局部边之间,例如,图8中的802);如果当前像素相对
于配对的局部边的边方程值一个为正一个为负,则当前像素具有一侧性(即,位于配对的
局部边的一侧,例如,图8中的804)。如果当前像素在配对的局部边之间,则判定为需要描
画;如果配对的局部边的一侧,则判定为不需要描画。 其中,JudgeDrawing()函数的定义如下JudgeDrawing(xi, yi) { between = aside = 0 ; 皿mO = localEdgeN咖[O]; 皿ml = localEdgeN咖[l];










if (e[誦0] (xi, yi) = = 0) {
if (a[誦0] < 0| I (a[誦O] == 0&&b[num0] < O))
return flagd = 0 5 else return flagd = 1 j }else if (e[皿ml] (xi, yi) = = 0) {
if (a[誦l] < 0| I (a[誦l] == 0&&b[numl] < O))
return flagd = 0 5 else return flagd = 1 j }else if (e[誦0] (xi, yi) > 0&&e[numl] (xi, yi) > 0)
return flagd = 1 5 else return flagd = 0 j } 接下来,具体说明扫描单元实施的动作
1.寻找起始单元 预先确定一个规则,即起始单元应该位于边界框中多边形最顶端区域所在的像素 单元之内。其中,多边形被边界框底边裁剪的情况不用考虑。确定起始单元的过程如图9 到图13所示。 如图9所示,如果最顶端顶点位于边界窗口内,那么起始单元就是包含此顶点的 像素单元902。 如图IO所示,如果最左上像素单元判定为需要描画,那么起始单元就是此单元 1002。 在其他情况下,需要使用裁剪信息。我们首先考虑由边界窗口的顶边(1102)裁剪 的情况,如图ll所示。此时,有两个可能的起始单元1104,任何一个都可行。然后,考虑由 边界窗口的左边和右边进行裁剪的情况,如图12和图13所示。如果是左边进行裁剪,则找 出左边最上端需要描画的像素单元;如果是右边进行裁剪,则找出右边最上端需要描画的 像素单元。 在需要使用裁剪信息的所有情况中,使用以下方法来确定起始单元的坐标 如果最左上单元的边方程值为e0和eO+b,那么最顶端单元线的边方程值为eO+a*X和 eO+b+a朽,最左侧单元线的边方程值为eO+b*y和eO+b* (y+l),最右侧单元线的边方程值为 eO+a*width+b*y和eO+a*width+b* (y+l)。如果边界窗口边与多边形边相交,则对应的边方 程值在交点将为O,可以使用这个信息来获得起始单元的x和y坐标值。
比如,当使用边界框的顶边进行裁剪时,设eO+a*x = 0和eO+b+a*X = O,将得到 x = -eO/a,以及x = _(60+13)/£1,分别为顶边像素单元中上像素和下像素的x坐标,而它们 的y坐标分别为ymin和ymin+l。同理,当使用裁剪框左边进行裁剪时,设eO+b*y = 0和 eO+b*(y+l) = O,得到y = -eO/b和y = -eO/b_l,分别为左边像素单元中上像素和下像素的 y坐标,而它们的x坐标为xmin。同样,当使用裁剪框右边进行裁剪时,设eO+a*width+b*y =0禾口 eO+a*width+b*(y+l) = O,f寻至ljy = _ (eO+a*width)/b禾口 y = _(eO+a*width)/b_l, 分别为右边像素单元中上像素和下像素的y坐标,而它们的x坐标为xmax。
寻找起始单元可以通过以下程序段实现
if (xmin <= xs <= xmax&&ymin <= ys <= ymax) {xstart = xs ^ystart = ys ^}else {flagd0 = JudgeDrawing (xmin, ymin);flagdl = JudgeDrawing(xmin, ymin+1);if (flagdO flagdl){xstart = xmin ;ystart = ymin ;}else {if ((clipmap&lb) == 1) {yi = ymin ;for(i = 0 ;i < n ;i++) {if(a[i] ! = 0) {xi = _e[i] (xmin, ymin)/a[i];xi = (xi == (int)xi) (int)xi: (int) (xi+1);
flagdO = JudgeDrawing(xi, yi);flagdl = JudgeDrawing(xi, yi+l);if (flagdO flagdl){xstart = xi ^ystart=yi ;
break Jxi = (int) (xi_l);flagdO = JudgeDrawing(xi, yi);flagdl = JudgeDrawing(xi, yi+l);if (flagdO flagdl){xstart = xi ^ystart=yi ;
break J}else if ((clipmap&10b) == 1) {xi = xmin ;ystart = ymax—l ;for(i = 0 ;i < n ;i++) {if(b[i] ! = 0) {yi = _e[i] (xmin, ymin)/b[i];yi = (yi == (int)yi) (int)yi: (int) (yi+l);flagdO = JudgeDrawing(xi, yi);if (flagdO&&ystart 〉 yi){xstart = xi ;ystart =((int)
yi)&( 1)}else if ((clipmap&100b) == 1) {xi = xmax ;
12
ystart = ymax-l ; for(i = 0 ;i < n ;i++) {
if (b[i] ! = 0) { yi = -(e[i] (xmin, ymin)+a[i]承xmax)/b[i]; yi = (yi == (int)yi) (int) yi : (int) (yi+1); flagd0 = JudgeDrawing(xi, yi); if (flagdO&&ystart > yi) {xstart = xi ;ystart = ((int)
yi)&( 1) ;} } } }else{flagd = 0 ;}//The whole polygon is clipped outside. } 2.扫描多边形 在扫描方法确定之前,预先给出判断当前像素是在多边形的左边还是右边的定 义,如图14所示。 如果当前像素相对于两条局部边中的任何一条边的边方程值为负,并且对应的x 系数a[i]为正,那么此像素在多边形的左侧(例如,图14中的1402)。如果当前像素相对 于两条局部边中的任何一条边的边方程值为负,并且对应的x系数a[i]小于或等于O,那么 此像素在多边形的右侧(例如,图14中的1404)。注意,当a[i] ==0时,所有的像素判定 为处于多边形的右侧。 用于判断当前像素位于多边形的左侧的函数JudgeLeft ()、以及用于判断当前像 素位于多边形的右侧的函数JudgeRight()如下
:0165] JudgeLeft (xi , yi) {
:0166] flagleft = 0 ;
:0167] 皿m0 = localEdgeN咖[O];
:0168] 皿ml = localEdgeNum[l];
:0169] if ((e[誦O] (xi, yi) < 0&&a[numO] > 0) |
:0170] (e[誦l] (xi, yi) < 0&&a[numl] > O)) return flagleft = 1 ;
:0171] return flagleft ;
:0172] }
:0173] JudgeRight(xi, yi) {
:0174] flagright = 0 ;
:0175] 皿mO = localEdgeN咖[O];
:0176] 皿ml = localEdgeNum[l];
:0177] if ((e[誦O] (xi, yi) < 0&&a[numO] <= 0) |
:0178] (e[皿ml] (xi, yi) < 0&&a[numl] <= O)) return flagright = 1 ;
:0179] return flagright 5
:0180] } 从起始单元开始,多边形首先往左扫描,然后往右扫描,如图15所示。当JudgeLeft()为真时,左扫描结束;同样,当JudgeRight()为真时,右扫描结束。将紧挨 最左端的判定为需要描画的像素单元下面的单元作为下一扫描线的起始单元。如果函数 JudgeLeft()和JudgeRight()都为真,则扫描过程停止。 如果当前像素使用JudgeDrawing()函数判定为需要描画,那么其参数通过调用 InterpolatePara()函数进行插值。 具体地,扫描过程如下首先检查多边形是否完全在裁剪框之外,如果是,则不需 要扫描过程;如果不是,则进行以下过程。扫描过程包含两层循环,内层为x方向,首先往 左,然后往右,外层为y方向,只是从上到下。在往左扫描过程中,判断当前像素是否位于配 对局部边的左边,如果不是,则判断当前像素是否需要描画,如果是,则调用插值函数进行 参数插值。在判断为位于局部边的左边后,记录下一次扫描的起始位置。同样,以相同的方 式往右进行扫描。当判断当前像素即在左边又在右边时,扫描结束。此过程可以用如下代
码描述if(flagd== 1) { //The polygon is not clipped out of screen.xi = xstart ;yi = ystart ;while ((yi+l) <= ymax) {FindLocalEdges(yi);while (xi >= xmin) {//Traverse to leftflagl0 = JudgeLeft(xi, yi);flagll = JudgeLeft(xi, yi+1);if (flag10 ==腦flagll == l)flagl = 1 ;if (flagl == 1) break ;else if (flagl = = 0) {flagd0 = JudgeDrawing(xi, yi);flagdl = JudgeDrawing(xi, yi+1);if(flagd0== 1) InterpolatePara(xi, yi);if(flagdl == 1) InterpolatePara(xi, yi+1);xstartnext = xi+1 jystartnext = yi+2 5xi = xstart+1 jyi = ystart ;while (xi <= xmax) { //Traverse to rightflagr0 = JudgeRight(xi, yi);flagrl = JudgeRight(xi, yi+1);if (flagr0 ==腦flagrl == l)flagr = 1 ;if (flagr == 1) break 5
else if (flagr = = 0) { flagd0 = JudgeDrawing(xi, yi); flagdl = JudgeDrawing(xi,yi+1); if (flagdO == 1) InterpolateP,(xi, yi); if(flagd 1 == 1) InterpolateP,(xi, yi+1); } xi++; } if (flagl == l&&flagr == 1) break ; xi = xstart = xstartnext ; yi = ystart = ystartnext ;
}
} 3.参数插值 对于凸多边形来说,局部边的数目是2,当前像素处于由局部边构成的四边形中, 如图16所示。对应于像素p的局部边为V1V2以及V3V4的情况,像素p处于四边形V1V2V3V4 中。对于参数插值来说,首先要做的是判断像素在哪个三角形里面。 这存在两种情况。如果局部边相连,则配对的局部边的四个顶点縮减为三个。这 三个顶点构成一个三角形,当前需要描画的像素就在这个三角形中进行插值(例如,图16 中的1602)。 如果局部边不相连,那么配对的局部边的四个顶点构成两个三角形,需要判断需 要描画的像素处于哪个三角形中。首先,计算当前像素相对于连接第三个和第一个顶点V3 和VI的边方程值,如果此值为正,则当前像素就处于由第一、第二和第三个顶点VI、 V2和 V3构成的三角形中(例如,图16中的1604);如果此值为负,则当前像素处于由第三、第四 和第一个顶点V3、 V4和VI构成的三角形中(例如,图16中的1606)。需要描画的像素的 参数通过相应的三角形进行插值。 参数插值在三角形内完成,如果对应三角形顶点VO的参数为pO,对应顶点VI的参 数为pl,对应顶点V2的参数为p2,那么三角形内任何一点的参数为P0*e0+pl*el+p2*e2,这 里e0、 el和e2分别为当前像素对应三角形三条边的边方程值。
具体地,对多边形进行插值的过程可以由以下程序段实现InterpolatePara(xi, yi) { 誦0 = localEdgeN咖[O]; 皿ml = localEdgeN咖[l]; if(x[皿m0] = = x[numl+l]&&y[皿m0] = = y[皿ml+l]) {//one triangle a0 = y[誦0+l]-y[誦l]; b0 = x[誦l]-x[誦0+l]; c0 = x[numO+l]*y[numl]_x[numl]*y[numO+l]; e0 = aO氺xi+bO氺yi+c0 ; p(xi,yi) = p [numO]承eO+p [numO+l]承e [numl]+p [numl]承e [numO];
}else if(x[皿m0+l] = = x[numl]&&y[皿mO+l] ==y[numl]){ //one
triangleaO = y [皿ml+l] _y [皿mO];bO = x [皿mO] _x [皿ml+l];cO = x[numl+l]承y[numO]—x[numO]承y[numl+1];eO = aO氺xi+bO氺yi+c0 ;p(xi, yi) = p[numO+1]氺eO+p[numO]氺e[numl]+p[numl+1]氺e[num
0];}el,se {//two trianglesaO = y [皿ml] _y [皿mO];bO = x [皿mO] _x [皿ml];cO = x[numl]承y[numO]_x[numO]承y[numl] 5eO = aO氺xi+bO氺yi+c0 ;if (eO >= 0) { //in the triangle consisting of 1st, 2nd, and
3rd verticesal = y [皿mO+l] _y [皿ml];bl = x[皿ml]_x[皿mO+l];cl = x[皿mO+l]*y[皿ml]_x[皿ml]*y[皿mO+l];el = al承xi+bl承yi+cl ;p(xi,yi) = p[numO+l]承eO+p[numO]承el+p[ruiml]承e[ruimO];}el,se{//in the triangle consisting of 3rd,4th,and 5th verticeseO = -eO ;al = y [皿ml+l] _y [皿mO];bl = x[皿mO]_x[皿ml+l];cl = x[皿ml+l]*y[皿mO]_x[皿mO]*y[皿ml+l];el = al承xi+bl承yi+cl ;p(xi,yi) = p[皿ml+l]*eO+p[皿ml]*el+p[皿mO]*e[皿ml];//end if two triangles } 综上所述,根据本发明实施例的用于对凸多边形进行栅格化的系统包括设置模 块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的 栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据区域限定信息创建边界 框,其中,n为大于3的整数;扫描模块,用于利用区域限定信息找出对所述栅格化区域进行 扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对所述栅 格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断扫 描到的像素需要描画,否则判断扫描到的像素不需要描画;描画模块,用于在扫描到的像素 需要描画的情况下,对扫描到的像素进行描画。 其中,扫描模块包括起始位置获取单元,用于利用区域限定信息判断凸n边形的
16最顶端顶点是否位于栅格化区域内,如果是,则判断最顶端顶点所在的像素单元为起始位置,否则判断栅格化区域内的最高或最低点所在的像素单元为起始位置,其中,像素单元由
在y方向相邻的两个像素组成;区域扫描执行单元,用于扫描格栅化区域,并在扫描格栅化区域的过程中利用凸n边形的n条边的边方程系数逐个判断扫描到的像素是否位于栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画。
另外,根据本发明实施例的用于对凸多边形进行栅格化的系统还可以包括插值模块,用于在相对于当前像素所在的扫描线的两条局部边相连的情况下,使用两条局部边的公共端点以及两条局部边的其他端点组成的三角形对扫描到的像素进行插值,在该两条局部边不相连的情况下,使用两条局部边的四个端点中的任意三个端点组成的三角形对扫描到的像素进行插值。 根据本发明实施例的用于对凸多边形进行栅格化的方法包括计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据区域限定信息创建边界框,其中,n为大于3的整数;利用区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对所述栅格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画;当扫描到的像素需要描画的情况下,对扫描到的像素进行描画。
其中,利用区域限定信息找出对所述栅格化区域进行扫描的起始位置的过程包括利用区域限定信息判断凸n边形的最顶端顶点是否位于栅格化区域内;如果是,则判断最顶端顶点所在的像素单元为起始位置,否则判断栅格化区域内的最高或最低点所在的像素单元为起始位置,其中,像素单元由在y方向相邻的两个像素组成。 另外,根据本发明实施例的用于对凸多边形进行栅格化的方法,在对扫描到的像素进行描画之前,还可以包括在相对于当前像素所在的扫描线的两条局部边相连的情况下,使用两条局部边的公共端点以及两条局部边的其他端点组成的三角形对扫描到的像素进行插值,在该两条局部边不相连的情况下,使用两条局部边的四个端点中的任意三个端点组成的三角形对扫描到的像素进行插值。 本领域技术人员将理解,还存在可用于实现本发明实施例的更多可选实施方式和改进方式,并且上述实施方式和示例仅是一个或多个实施例的说明。因此,本发明的范围仅由所附权利要求书限制。
权利要求
一种用于对凸多边形进行栅格化的系统,其特征在于,包括设置模块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定所述凸n边形的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据所述区域限定信息创建所述边界框,其中,n为大于3的整数;扫描模块,用于利用所述区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用所述凸n边形的n条边的边方程系数逐个判断从所述起始位置开始对所述栅格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断所述扫描到的像素需要描画,否则判断所述扫描到的像素不需要描画;以及描画模块,用于在所述扫描到的像素需要描画的情况下,对所述扫描到的像素进行描画。
2. 根据权利要求l的用于对凸多边形进行栅格化的系统,其特征在于,所述扫描模块包括起始位置获取单元,用于利用所述区域限定信息判断所述凸n边形的最顶端顶点是否 位于所述栅格化区域内,如果是,则判断所述最顶端顶点所在的像素单元为所述起始位置, 否则判断所述栅格化区域内的最高点所在的像素单元为所述起始位置,其中,所述像素单 元由在y方向相邻的两个像素组成;区域扫描执行单元,用于扫描所述格栅化区域,并在扫描所述格栅化区域的过程中利 用所述凸n边形的n条边的边方程系数逐个判断所述扫描到的像素是否位于所述栅格化 区域内,如果是,则判断所述扫描到的像素需要描画,否则判断所述扫描到的像素不需要描 画。
3. 根据权利要求2的用于对凸多边形进行栅格化的系统,其特征在于,所述区域扫描执行单元通过以下过程来判断所述扫描到的像素是否位于所述栅格化区域内根据所述凸n边形的n条边的边方程系数构造所述凸n边形的n条边的边方程;计算所述扫描到的像素相对于所述凸n边形中的两条局部边的边方程值,其中,所述 局部边是所述凸n边形中的与所述扫描到的像素所在的扫描线相交的边,并且所述扫描线 的位置高于所述局部边的下端点且低于或通过所述局部边的上端点;如果所述扫描到的像素相对于所述两条局部边之一的边方程值为零,则判断所述扫描 到的像素位于所述两条局部边之一上,并且进一步根据所述扫描到的像素所在的局部边的 边方程系数判断所述扫描到的像素所在的局部边是否为所述凸n边形的右侧边或底侧边, 如果是,则判断所述扫描到的像素不需要描画,否则判断所述扫描到的像素需要描画;如果所述扫描到的像素相对于所述两条局部边的边方程值都不为零,则进一步判断所 述扫描到的像素相对于所述两条局部边的边方程值是否一个为正一个为负,如果是,则判 断所述扫描到的像素位于所述两条局部边的两侧从而判断所述扫描到的像素不需要描画, 否则判断所述扫描到的像素位于所述两条局部边之间从而判断所述扫描到的像素需要描 画。
4. 根据权利要求3的用于对凸多边形进行栅格化的系统,其特征在于,所述区域扫描 执行单元按照从右向左或从左向右的顺序扫描所述栅格化区域,并在判断所述扫描到的像 素位于所述两条局部边的两侧时,进一步根据距离所述扫描到的像素较近的局部边的边方 程系数判断所述扫描到的像素位于所述凸n边形的左侧还是右侧。
5. 根据权利要求4的用于对凸多边形进行栅格化的系统,其特征在于,如果根据距离 所述扫描到的像素较近的局部边的边方程系数判断所述扫描到的像素既位于所述凸n边 形的左侧又位于所述凸n边形的右侧,则终止扫描所述栅格化区域。
6. 根据权利要求1至5中任一项的用于对凸多边形进行栅格化的系统,其特征在于,还 包括插值模块,用于在所述两条局部边相连的情况下,使用所述两条局部边的公共端点以 及所述两条局部边的其他端点组成的三角形对所述扫描到的像素进行插值,在所述两条局 部边不相连的情况下,使用所述两条局部边的四个端点中的任意三个端点组成的三角形对 所述扫描到的像素进行插值。
7. 根据权利要求6的用于对凸多边形进行栅格化的系统,其特征在于,在所述两条局 部边不相连的情况下,所述插值模块从处于右侧的局部边的上端点开始按顺时针对所述两 条局部边的四个端点进行计数,并根据所述扫描到的像素相对于连接所述两条局部边的四 个端点中的的第一和第三端点的线段的边方程值判断是使用由所述两条局部边的四个端 点中的第一、第二、及第三端点组成的三角形对所述扫描到的像素进行插值还是使用由所 述两条局部边的四个端点中的第三、第四、及第一端点组成的三角形对所述扫描到的像素 进行插值。
8. 根据权利要求7的用于对凸多边形进行栅格化的系统,其特征在于,在所述扫描到 的像素位于所述两条局部边之一上的情况下,所述区域扫描执行单元在所述扫描到的像素 所在的局部边的边方程系数中的x分量小于零的情况下,判断所述扫描到的像素所在的局 部边为所述凸n边形的右侧边,在所述扫描到的像素所在的局部边的边方程系数中的x分 量等于零且y分量小于零的情况下,判断所述扫描到的像素所在的局部边为所述凸n边形 的底侧边。
9. 根据权利要求8的用于对凸多边形进行栅格化的系统,其特征在于,所述区域扫描 执行单元在判断所述扫描到的像素位于所述两条局部边的两侧时,在距离所述扫描到的像 素较近的局部边的边方程系数的x分量为正的情况下,判断所述扫描到的像素位于所述凸 n边形的左侧,在距离所述扫描到的像素较近的局部边的边方程系数的x分量为负的情况 下,判断所述扫描到的像素位于所述凸n边形的右侧。
10. 根据权利要求9的用于对凸多边形进行栅格化的系统,其特征在于,所述插值模块 在所述扫描到的像素相对于连接所述两条局部边的四个端点中的的第一和第三端点的线 段的边方程值为正的情况下,使用由所述两条局部边的四个端点中的第一、第二、及第三端 点组成的三角形对所述扫描到的像素进行插值,在所述扫描到的像素相对于连接所述两条 局部边的四个端点中的第一和第三端点的线段的边方程值为负的情况下,使用由所述两条 局部边的四个端点中的第三、第四、及第一端点组成的三角形对所述扫描到的像素进行插 值。
11. 一种用于对凸多边形进行栅格化的方法,其特征在于,包括计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定所述凸n边形 的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据所述区域限定信息创 建所述边界框,其中,n为大于3的整数;利用所述区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用所述凸n边形的n条边的边方程系数逐个判断从所述起始位置开始对所述栅格化区域进行扫描的过 程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断所述扫描到的像素需要描 画,否则判断所述扫描到的像素不需要描画;以及当所述扫描到的像素需要描画时,对所述扫描到的像素进行描画。
12. 根据权利要求11的用于对凸多边形进行栅格化的方法,其特征在于,利用所述区 域限定信息找出对所述栅格化区域进行扫描的所述起始位置的过程包括利用所述区域限定信息判断所述凸n边形的最顶端顶点是否位于所述栅格化区域内; 如果是,则判断所述最顶端顶点所在的像素单元为所述起始位置,否则判断所述栅格化区域内的最高点所在的像素单元为所述起始位置,其中,所述像素单元由在y方向相邻 的两个像素组成。
13. 根据权利要求12的用于对凸多边形进行栅格化的方法,其特征在于,判断所述扫 描到的像素是否位于所述栅格化区域内的过程包括根据所述凸n边形的n条边的边方程系数构造所述凸n边形的n条边的边方程;计算所述扫描到的像素相对于所述凸n边形中的两条局部边的边方程值,其中,所述 局部边是所述凸n边形中的与所述扫描到的像素所在的扫描线相交的边,并且所述扫描线 的位置高于所述局部边的下端点且低于或通过所述局部边的上端点;如果所述扫描到的像素相对于所述两条局部边之一的边方程值为零,则判断所述扫描 到的像素位于所述两条局部边之一上,并且进一步根据所述扫描到的像素所在的局部边的 边方程系数判断所述扫描到的像素所在的局部边是否为所述凸n边形的右侧边或底侧边, 如果是,则判断所述扫描到的像素不需要描画,否则判断所述扫描到的像素需要描画;如果所述扫描到的像素相对于所述两条局部边的边方程值都不为零,则进一步判断所 述扫描到的像素相对于所述两条局部边的边方程值是否一个为正一个为负,如果是,则判 断所述扫描到的像素位于所述两条局部边的两侧从而判断所述扫描到的像素不需要描画, 否则判断所述扫描到的像素位于所述两条局部边之间从而判断所述扫描到的像素需要描 画。
14. 根据权利要求13的用于对凸多边形进行栅格化的方法,其特征在于,按照从右向 左或从左向右的顺序扫描所述栅格化区域,并在判断所述扫描到的像素位于所述两条局部 边的两侧时,进一步根据距离所述扫描到的像素较近的局部边的边方程系数判断所述扫描 到的像素位于所述凸n边形的左侧还是右侧。
15. 根据权利要求14的用于对凸多边形进行栅格化的方法,其特征在于,如果根据距 离所述扫描到的像素较近的局部边的边方程系数判断所述扫描到的像素既位于所述凸n 边形的左侧又位于所述凸n边形的右侧,则终止扫描所述栅格化区域。
16. 根据权利要求11至15中任一项的用于对凸多边形进行栅格化的方法,其特征在 于,在对所述扫描到的像素进行描画之前,还包括在所述两条局部边相连的情况下,使用所述两条局部边的公共端点以及所述两条局部 边的其他端点组成的三角形对所述扫描到的像素进行插值,在所述两条局部边不相连的情 况下,使用所述两条局部边的四个端点中的任意三个端点组成的三角形对所述扫描到的像 素进行插值。
17. 根据权利要求16的用于对凸多边形进行栅格化的方法,其特征在于,在所述两条局部边不相连的情况下,从处于右侧的局部边的上端点开始按顺时针对所述两条局部边的 四个端点进行计数,并根据所述扫描到的像素相对于连接所述两条局部边的四个端点中的 的第一和第三端点的线段的边方程值判断是使用由所述两条局部边的四个端点中的第一、 第二、及第三端点组成的三角形对所述扫描到的像素进行插值还是使用由所述两条局部边 的四个端点中的第三、第四、及第一端点组成的三角形对所述扫描到的像素进行插值。
18. 根据权利要求17的用于对凸多边形进行栅格化的方法,其特征在于,在所述扫描 到的像素位于所述两条局部边之一上的情况下,在所述扫描到的像素所在的局部边的边方 程系数中的x分量小于零的情况下,判断所述扫描到的像素所在的局部边为所述凸n边形 的右侧边,在所述扫描到的像素所在的局部边的边方程系数中的x分量等于零且y分量小 于零的情况下,判断所述扫描到的像素所在的局部边为所述凸n边形的底侧边。
19. 根据权利要求18的用于对凸多边形进行栅格化的方法,其特征在于,在判断所述 扫描到的像素位于所述两条局部边的两侧时,在距离所述扫描到的像素较近的局部边的边 方程系数的x分量为正的情况下,判断所述扫描到的像素位于所述凸n边形的左侧,在距离 所述扫描到的像素较近的局部边的边方程系数的x分量为负的情况下,判断所述扫描到的 像素位于所述凸n边形的右侧。
20. 根据权利要求19的用于对凸多边形进行栅格化的方法,其特征在于,在所述扫描 到的像素相对于连接所述两条局部边的四个端点中的的第一和第三端点的线段的边方程 值为正的情况下,使用由所述两条局部边的四个端点中的第一、第二、及第三端点组成的三 角形对所述扫描到的像素进行插值,在所述扫描到的像素相对于连接所述两条局部边的四 个端点中的第一和第三端点的线段的边方程值为负的情况下,使用由所述两条局部边的四 个端点中的第三、第四、及第一端点组成的三角形对所述扫描到的像素进行插值。
全文摘要
本发明公开了一种用于对凸多边形进行栅格化的系统及方法。其中,该系统包括设置模块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定所述凸n边形的栅格化区域的边界框对该栅格化区域的区域限定信息,以及根据该区域限定信息创建该边界框,其中,n为大于3的整数;扫描模块,用于利用区域限定信息找出对该栅格化区域进行扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对该栅格化区域进行扫描的过程中扫描到的像素是否位于该栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画;以及描画模块,用于在扫描到的像素需要描画的情况下,对扫描到的像素进行描画。
文档编号G06T11/00GK101739696SQ20081017547
公开日2010年6月16日 申请日期2008年11月10日 优先权日2008年11月10日
发明者洲镰康, 白向晖, 谭志明 申请人:富士通株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1