CN101739696A - 用于对凸多边形进行栅格化的系统及方法 - Google Patents
用于对凸多边形进行栅格化的系统及方法 Download PDFInfo
- Publication number
- CN101739696A CN101739696A CN200810175474A CN200810175474A CN101739696A CN 101739696 A CN101739696 A CN 101739696A CN 200810175474 A CN200810175474 A CN 200810175474A CN 200810175474 A CN200810175474 A CN 200810175474A CN 101739696 A CN101739696 A CN 101739696A
- Authority
- CN
- China
- Prior art keywords
- scans
- local edge
- limit
- pixel
- rasterizing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Image Generation (AREA)
Abstract
本发明公开了一种用于对凸多边形进行栅格化的系统及方法。其中,该系统包括:设置模块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定所述凸n边形的栅格化区域的边界框对该栅格化区域的区域限定信息,以及根据该区域限定信息创建该边界框,其中,n为大于3的整数;扫描模块,用于利用区域限定信息找出对该栅格化区域进行扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对该栅格化区域进行扫描的过程中扫描到的像素是否位于该栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画;以及描画模块,用于在扫描到的像素需要描画的情况下,对扫描到的像素进行描画。
Description
技术领域
本发明涉及图像图形处理领域,更具体地涉及一种用于对凸多边形进行栅格化的系统及方法。
背景技术
栅格化是计算机图形学中将图元扫描变换成显示像素的一种技术,是将矢量图形格式表示的图像变换成栅格图像以用于显示器或打印机等的输出的过程。对图元进行栅格化的过程主要包括两个步骤:首先,确定显示平面上哪些像素是由图元覆盖的;其次,将图元的属性(颜色、深度、以及纹理等)赋给每个像素。
计算机图形学领域中存在很多多边形栅格化的方法。其中的一个主要方向是,将多边形分割成三角形,然后对三角形进行栅格化,该方法在栅格化之前需要很多计算资源来进行三角化和几何设置。另外的一个主要方向是,使用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是根据本发明实施例的对当前扫描到的像素进行插值的情况的说明性示意图。
具体实施方式
在本发明中,使用边方程算法和局部边方法对凸多边形进行栅格化。其中,边方程定义了两个平面,如果像素在一个半平面的边方程值为正,那么其在另一个半平面的边方程值为负,这有利于判断当前像素是否在凸多边形内。局部边是与当前扫描线相交的多边形边,对于凸多边形来说,只存在两条局部边,它们组成三个平面:左平面、多边形内平面、和右平面。使用局部边来判断像素是否画,以及对像素进行参数插值是相对容易的。
本发明的一种实施方式中使用的坐标系统具有如下形式:原点位于左上方,x轴向右,y轴向下。
根据本发明实施例的用于对凸多边形进行栅格化的系统可以对按顺时针排序的n顶点多边形进行栅格化。其中,n顶点多边形的顶点坐标是x[i]和y[i],0<=i<n。
根据本发明实施例的系统包括一个设置模块、一个扫描模块、以及一个描画模块,如图1所示。其中,设置模块和扫描模块的动作过程的框图分别如图2和图3所示。根据本发明实施例的系统的流水线处理过程的流程图如图4所示。
如图4所示,根据本发明实施例的系统的工作过程为:S402,从节点内存中取出多边形顶点信息;S404,根据多边形顶点信息计算边方程系数;S406,根据多边形顶点信息寻找多边形的最顶端顶点,对多边形进行裁剪,以及创建边界框;S408,将边方程系数存储在内存中,用于后续处理;S410,寻找对裁剪后的多边形进行扫描的起始单元,并寻找局部边;S412,判断扫描到的像素是否需要描画;S414,对扫描到的像素进行插值;S416,将扫描到的像素的颜色信息存入像素缓存;以及S418,将扫描到的像素描画出来。
下面描述根据本发明实施例的设置模块和扫描模块的具体细节:
一、设置模块。设置模块主要进行以下动作:
1.计算边方程系数
一个像素(x,y)相对于由顶点(x[0],y[0])和(x[1],y[1])组成的边的边方程为e(x,y)=-(y[1]-y[0])(x-x[0])+(x[1]-x[0])(y-y[0])=(y[0]-y[1])x+(x[1]-x[0])y+x[0]y[1]-x[1]y[0]=ax+by+c,这里(x,y)、(x[0],y[0])、以及(x[1],y[1])是设备坐标系统中的坐标。因此,可以获得(下面的01表示从0标号的点开始,到1标号的点结束):
a01=y[0]-y[1];
b01=x[1]-x[0];
c01=x[0]y[1]-x[1]y[0]。
对于n顶点凸多边形,存在n条边。因此,存在三个数组a[n]、b[n]和c[n]。在这里,可以使用存储器来存储这些值:
a[0]=a01,a[1]=a12,a[2]=a23,...,a[n-1]=a(n-1)0,
b[0]=b01,b[1]=b12,b[2]=b23,...,b[n-1]=b(n-1)0,
c[0]=c01,c[1]=c12,c[2]=c23,...,c[n-1]=c(n-1)0,
这里,aij、bij和cij表示这些值是通过i顶点到j顶点的边方程计算出来的。
2.创建边界框
在由(xmin,ymin)和(xmax,ymax)组成的边界框(例如,图5中的502)创建之前,需要找到多边形顶点的最小和最大坐标值。顶点(xs,ys)用于记录多边形的最顶端顶点,同时系统也使用一个变量clipmap记录裁剪信息,它们都用于扫描模块中寻找起始单元(例如,图9中的902、图10中的1002、图11中的1104、图12中的1202、以及图13中的1302)。对于裁剪信息,只有以边界窗口(即,边界框)的上边(例如,图11中的1102)、左边(例如,图12中的1202)、和右边(例如,图13中的1302)进行裁剪的情况需要记录。
由于在本发明的实施例中,将同一列的两个像素称为像素单元(例如,图5中的504),因此在每次扫描时扫描转换两条像素线(偶数线和奇数线)。边界框的上边的y坐标总是为偶数,边界框的底边y坐标总是为奇数。
具体地,寻找最顶端顶点、记录裁剪信息、以及创建边界框的过程为:首先,将多边形的第一个顶点初始化为最小坐标点、最大坐标点、以及寻找起始点,同时初始化clipmap为0。然后,从多边形的第一个顶点开始,依次在多边形的n条边中寻找,看是否有更大以及更小的坐标值,如果有,就替换掉原来的最大以及最小坐标,同时记录最小的y坐标所在的顶点为最顶端顶点,并将浮点型数值的最大、最小坐标值进行整数化从而获得未裁减的边界框。最后,依次按照顶边、左边和右边的顺序分别比较新的边界框和当前边界框的坐标,以获得新的边界框坐标,并记录裁剪信息。如果新的边界框的顶边与多边形相交,则clipmap的最低位置为1;如果新的边界框的左边与多边形相交,则clipmap的最低第2位置为1;如果新的边界框的右边与多边形相交,则clipmap的最低第3位置为1。对于该过程,可以通过以下程序段实现:
fxmin=fxmax=xs=x[0];
fymin=fymax=ys=y[0];
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];
ys=y[i];
}
if(fxmax<x[i])fxmax=x[i];
if(fymax<y[i])fymax=y[i];
}
xmin=(int)(fxmin)+(fxmin>=0.0f?0:-1);
xmax=(int)(fxmax)+1;
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 &=1b;}
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+1]、y[n+1]、a[n]、b[n]、c[n]、xs、ys、xmin、ymin、xmax、ymax、clipmap、以及p[n+1]。这里,p[n+1]是存储多边形顶点上参数(颜色、纹理和深度等)的数组。特别地,在数组x[n+1]、y[n+1]和p[n+1]中,数组元素有如下关系:x[n]==x[0],y[n]==y[0],p[n]==p[0]。
二、扫描模块。扫描模块主要进行以下动作:
在扫描模块进行具体动作之前,我们预先定义如何判断像素是否需要描画(通过JudgeDrawing()函数实现)。
首先,需要找到对应当前扫描线y=yc(例如,图6中的602)的局部边(例如,图6中的604)。局部边是与当前扫描线相交的多边形边。对于一个由顶点V[i](x[i],y[i])和V[i+1](x[i+1],y[i+1])构成的多边形边来说,当满足条件y[i]<yc<=y[i+1]或者y[i+1]<yc<=y[i]时,它就是一条局部边。对于凸多边形来说,只有两条局部边。
寻找局部边的过程为:依次将多边形中的每一条边的两个端点的y坐标y[i]、y[i+1]与当前扫描线的y坐标yc进行比较,如果满足条件y[i]<yc<=y[i+1]或者y[i+1]<yc<=y[i],则将多边形的该条边的计数i记录下来。对于该过程,可以通过以下程序段实现:
FindLocalEdges(yi){
j=0;
for(i=0;i<n;i++){
if(y[i]<yi<=y[i+1]||y[i+1]<yi<=y[i]){
localEdgeNum[j]=i;
j++;
}
}
if(j>1)return error;
}
在特殊情况下,当满足条件y[i]==yc==y[i+1]时,当前扫描线与当前多边形边重合,此扫描线上的像素位于此多边形边上,此时只需要应用左上规则来判断当前像素是否需要描画。另外,如果当前像素在局部边上,则其相对于局部边的边方程值为0,此时也只需要应用左上规则来判断当前像素是否需要描画。
此时,利用多边形的边法线(a[i],b[i])来确立左上规则,如图7所示。如果a[i]<0,则此边为右侧边(例如,图7中的702);如果a[i]==0并且b[i]<0,此边为底侧边(例如,图7中的704)。如果当前像素位于右侧或者底侧边上,当前像素不需要描画。如果当前像素位于上侧边或者左侧边(例如,图7中的706),则其需要描画。
如果当前像素不在局部边上,那么它就在配对的局部边之间或者一侧,分别称为中间性和一侧性,如图8所示。如果当前像素相对于配对的局部边的边方程值都为正,则当前像素具有中间性(即,位于配对的局部边之间,例如,图8中的802);如果当前像素相对于配对的局部边的边方程值一个为正一个为负,则当前像素具有一侧性(即,位于配对的局部边的一侧,例如,图8中的804)。如果当前像素在配对的局部边之间,则判定为需要描画;如果配对的局部边的一侧,则判定为不需要描画。
其中,JudgeDrawing()函数的定义如下:
JudgeDrawing(xi,yi){
between=aside=0;
num0=localEdgeNum[0];
num1=localEdgeNum[1];
if(e[num0](xi,yi)==0){
if(a[num0]<0||(a[num0]==0&&b[num0]<0))
return flagd=0;
else return flagd=1;
}else if(e[num1](xi,yi)==0){
if(a[num1]<0||(a[num1]==0&&b[num1]<0))
return flagd=0;
else return flagd=1;
}else if(e[num0](xi,yi)>0&&e[num1](xi,yi)>0)
return flagd=1;
else return flagd=0;
}
接下来,具体说明扫描单元实施的动作:
1.寻找起始单元
预先确定一个规则,即起始单元应该位于边界框中多边形最顶端区域所在的像素单元之内。其中,多边形被边界框底边裁剪的情况不用考虑。确定起始单元的过程如图9到图13所示。
如图9所示,如果最顶端顶点位于边界窗口内,那么起始单元就是包含此顶点的像素单元902。
如图10所示,如果最左上像素单元判定为需要描画,那么起始单元就是此单元1002。
在其他情况下,需要使用裁剪信息。我们首先考虑由边界窗口的顶边(1102)裁剪的情况,如图11所示。此时,有两个可能的起始单元1104,任何一个都可行。然后,考虑由边界窗口的左边和右边进行裁剪的情况,如图12和图13所示。如果是左边进行裁剪,则找出左边最上端需要描画的像素单元;如果是右边进行裁剪,则找出右边最上端需要描画的像素单元。
在需要使用裁剪信息的所有情况中,使用以下方法来确定起始单元的坐标:如果最左上单元的边方程值为e0和e0+b,那么最顶端单元线的边方程值为e0+a*x和e0+b+a*x,最左侧单元线的边方程值为e0+b*y和e0+b*(y+1),最右侧单元线的边方程值为e0+a*width+b*y和e0+a*width+b*(y+1)。如果边界窗口边与多边形边相交,则对应的边方程值在交点将为0,可以使用这个信息来获得起始单元的x和y坐标值。
比如,当使用边界框的顶边进行裁剪时,设e0+a*x=0和e0+b+a*x=0,将得到x=-e0/a,以及x=-(e0+b)/a,分别为顶边像素单元中上像素和下像素的x坐标,而它们的y坐标分别为ymin和ymin+1。同理,当使用裁剪框左边进行裁剪时,设e0+b*y=0和e0+b*(y+1)=0,得到y=-e0/b和y=-e0/b-1,分别为左边像素单元中上像素和下像素的y坐标,而它们的x坐标为xmin。同样,当使用裁剪框右边进行裁剪时,设e0+a*width+b*y=0和e0+a*width+b*(y+1)=0,得到y=-(e0+a*width)/b和y=-(e0+a*width)/b-1,分别为右边像素单元中上像素和下像素的y坐标,而它们的x坐标为xmax。
寻找起始单元可以通过以下程序段实现:
if(xmin<=xs<=xmax&&ymin<=ys<=ymax){
xstart=xs;
ystart=ys;
}else{
flagd0=JudgeDrawing(xmin,ymin);
flagd1=JudgeDrawing(xmin,ymin+1);
if(flagd0||flagd1){xstart=xmin;ystart=ymin;}
else{
if((clipmap&1b)==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);
flagd0=JudgeDrawing(xi,yi);
flagd1=JudgeDrawing(xi,yi+1);
if(flagd0||flagd1){xstart=xi;ystart=yi;break;}
xi=(int)(xi-1);
flagd0=JudgeDrawing(xi,yi);
flagd1=JudgeDrawing(xi,yi+1);
if(flagd0||flagd1){xstart=xi;ystart=yi;break;}
}
}
}else if((clipmap&10b)==1){
xi=xmin;
ystart=ymax-1;
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+1);
flagd0=JudgeDrawing(xi,yi);
if(flagd0&&ystart>yi){xstart=xi;ystart=((int)yi)&(~1);}
}
}
}else if((clipmap&100b)==1){
xi=xmax;
ystart=ymax-1;
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(flagd0&&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]小于或等于0,那么此像素在多边形的右侧(例如,图14中的1404)。注意,当a[i]==0时,所有的像素判定为处于多边形的右侧。
用于判断当前像素位于多边形的左侧的函数JudgeLeft()、以及用于判断当前像素位于多边形的右侧的函数JudgeRight()如下:
JudgeLeft(xi,yi){
flagleft=0;
num0=localEdgeNum[0];
num1=localEdgeNum[1];
if((e[num0](xi,yi)<0&&a[num0]>0)||
(e[num1](xi,yi)<0&&a[num1]>0))return flagleft=1;
return flagleft;
}
JudgeRight(xi,yi){
flagright=0;
num0=localEdgeNum[0];
num1=localEdgeNum[1];
if((e[num0](xi,yi)<0&&a[num0]<=0)||
(e[num1](xi,yi)<0&&a[num1]<=0))return flagright=1;
return flagright;
}
从起始单元开始,多边形首先往左扫描,然后往右扫描,如图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+1)<=ymax){
FindLocalEdges(yi);
while(xi>=xmin){//Traverse to left
flagl0=JudgeLeft(xi,yi);
flagl1=JudgeLeft(xi,yi+1);
if(flagl0==1&&flagl1==1)flagl=1;
if(flagl==1)break;
else if(flagl==0){
flagd0=JudgeDrawing(xi,yi);
flagd1=JudgeDrawing(xi,yi+1);
if(flagd0==1)InterpolatePara(xi,yi);
if(flagd1==1)InterpolatePara(xi,yi+1);
}
xi--;
}
xstartnext=xi+1;
ystartnext=yi+2;
xi=xstart+1;
yi=ystart;
while(xi<=xmax){ //Traverse to right
flagr0=JudgeRight(xi,yi);
flagr1=JudgeRight(xi,yi+1);
if(flagr0==1&&flagr1==1)flagr=1;
if(flagr==1)break;
else if(flagr==0){
flagd0=JudgeDrawing(xi,yi);
flagd1=JudgeDrawing(xi,yi+1);
if(flagd0==1)InterpolatePara(xi,yi);
if(flagd 1==1)InterpolatePara(xi,yi+1);
}
xi++;
}
if(flagl==1&&flagr==1)break;
xi=xstart=xstartnext;
yi=ystart=ystartnext;
}
}
3.参数插值
对于凸多边形来说,局部边的数目是2,当前像素处于由局部边构成的四边形中,如图16所示。对应于像素p的局部边为V1V2以及V3V4的情况,像素p处于四边形V1V2V3V4中。对于参数插值来说,首先要做的是判断像素在哪个三角形里面。
这存在两种情况。如果局部边相连,则配对的局部边的四个顶点缩减为三个。这三个顶点构成一个三角形,当前需要描画的像素就在这个三角形中进行插值(例如,图16中的1602)。
如果局部边不相连,那么配对的局部边的四个顶点构成两个三角形,需要判断需要描画的像素处于哪个三角形中。首先,计算当前像素相对于连接第三个和第一个顶点V3和V1的边方程值,如果此值为正,则当前像素就处于由第一、第二和第三个顶点V1、V2和V3构成的三角形中(例如,图16中的1604);如果此值为负,则当前像素处于由第三、第四和第一个顶点V3、V4和V1构成的三角形中(例如,图16中的1606)。需要描画的像素的参数通过相应的三角形进行插值。
参数插值在三角形内完成,如果对应三角形顶点V0的参数为p0,对应顶点V1的参数为p1,对应顶点V2的参数为p2,那么三角形内任何一点的参数为p0*e0+p1*e1+p2*e2,这里e0、e1和e2分别为当前像素对应三角形三条边的边方程值。
具体地,对多边形进行插值的过程可以由以下程序段实现:
InterpolatePara(xi,yi){
num0=localEdgeNum[0];
num1=localEdgeNum[1];
if(x[num0]==x[num1+1]&&y[num0]==y[num1+1]){//one triangle
a0=y[num0+1]-y[num1];
b0=x[num1]-x[num0+1];
c0=x[num0+1]*y[num1]-x[num1]*y[num0+1];
e0=a0*xi+b0*yi+c0;
p(xi,yi)=p[num0]*e0+p[num0+1]*e[num1]+p[num1]*e[num0];
}else if(x[num0+1]==x[num1]&&y[num0+1]==y[num1]){ //one triangle
a0=y[num1+1]-y[num0];
b0=x[num0]-x[num1+1];
c0=x[num1+1]*y[num0]-x[num0]*y[num1+1];
e0=a0*xi+b0*yi+c0;
p(xi,yi)=p[num0+1]*e0+p[num0]*e[num1]+p[num1+1]*e[num0];
}else{ //two triangles
a0=y[num1]-y[num0];
b0=x[num0]-x[num1];
c0=x[num1]*y[num0]-x[num0]*y[num1];
e0=a0*xi+b0*yi+c0;
if(e0>=0){ //in the triangle consisting of 1st,2nd,and 3rd vertices
a1=y[num0+1]-y[num1];
b1=x[num1]-x[num0+1];
c1=x[num0+1]*y[num1]-x[num1]*y[num0+1];
e1=a1*xi+b1*yi+c1;
p(xi,yi)=p[num0+1]*e0+p[num0]*e1+p[num1]*e[num0];
}else{//in the triangle consisting of 3rd,4th,and 5th vertices
e0=-e0;
a1=y[num1+1]-y[num0];
b1=x[num0]-x[num1+1];
c1=x[num1+1]*y[num0]-x[num0]*y[num1+1];
e1=a1*xi+b1*yi+c1;
p(xi,yi)=p[num1+1]*e0+p[num1]*e1+p[num0]*e[num1];
}
} //end if two triangles
}
综上所述,根据本发明实施例的用于对凸多边形进行栅格化的系统包括:设置模块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据区域限定信息创建边界框,其中,n为大于3的整数;扫描模块,用于利用区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对所述栅格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画;描画模块,用于在扫描到的像素需要描画的情况下,对扫描到的像素进行描画。
其中,扫描模块包括:起始位置获取单元,用于利用区域限定信息判断凸n边形的最顶端顶点是否位于栅格化区域内,如果是,则判断最顶端顶点所在的像素单元为起始位置,否则判断栅格化区域内的最高或最低点所在的像素单元为起始位置,其中,像素单元由在y方向相邻的两个像素组成;区域扫描执行单元,用于扫描格栅化区域,并在扫描格栅化区域的过程中利用凸n边形的n条边的边方程系数逐个判断扫描到的像素是否位于栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画。
另外,根据本发明实施例的用于对凸多边形进行栅格化的系统还可以包括:插值模块,用于在相对于当前像素所在的扫描线的两条局部边相连的情况下,使用两条局部边的公共端点以及两条局部边的其他端点组成的三角形对扫描到的像素进行插值,在该两条局部边不相连的情况下,使用两条局部边的四个端点中的任意三个端点组成的三角形对扫描到的像素进行插值。
根据本发明实施例的用于对凸多边形进行栅格化的方法包括:计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定凸n边形的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据区域限定信息创建边界框,其中,n为大于3的整数;利用区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用凸n边形的n条边的边方程系数逐个判断从起始位置开始对所述栅格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断扫描到的像素需要描画,否则判断扫描到的像素不需要描画;当扫描到的像素需要描画的情况下,对扫描到的像素进行描画。
其中,利用区域限定信息找出对所述栅格化区域进行扫描的起始位置的过程包括:利用区域限定信息判断凸n边形的最顶端顶点是否位于栅格化区域内;如果是,则判断最顶端顶点所在的像素单元为起始位置,否则判断栅格化区域内的最高或最低点所在的像素单元为起始位置,其中,像素单元由在y方向相邻的两个像素组成。
另外,根据本发明实施例的用于对凸多边形进行栅格化的方法,在对扫描到的像素进行描画之前,还可以包括:在相对于当前像素所在的扫描线的两条局部边相连的情况下,使用两条局部边的公共端点以及两条局部边的其他端点组成的三角形对扫描到的像素进行插值,在该两条局部边不相连的情况下,使用两条局部边的四个端点中的任意三个端点组成的三角形对扫描到的像素进行插值。
本领域技术人员将理解,还存在可用于实现本发明实施例的更多可选实施方式和改进方式,并且上述实施方式和示例仅是一个或多个实施例的说明。因此,本发明的范围仅由所附权利要求书限制。
Claims (20)
1.一种用于对凸多边形进行栅格化的系统,其特征在于,包括:
设置模块,用于计算需要进行栅格化的凸n边形的n条边的边方程系数,记录用于限定所述凸n边形的栅格化区域的边界框对所述栅格化区域的区域限定信息,以及根据所述区域限定信息创建所述边界框,其中,n为大于3的整数;
扫描模块,用于利用所述区域限定信息找出对所述栅格化区域进行扫描的起始位置,利用所述凸n边形的n条边的边方程系数逐个判断从所述起始位置开始对所述栅格化区域进行扫描的过程中扫描到的像素是否位于所述栅格化区域内,如果是,则判断所述扫描到的像素需要描画,否则判断所述扫描到的像素不需要描画;以及
描画模块,用于在所述扫描到的像素需要描画的情况下,对所述扫描到的像素进行描画。
2.根据权利要求1的用于对凸多边形进行栅格化的系统,其特征在于,所述扫描模块包括:
起始位置获取单元,用于利用所述区域限定信息判断所述凸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的用于对凸多边形进行栅格化的方法,其特征在于,在所述扫描到的像素相对于连接所述两条局部边的四个端点中的的第一和第三端点的线段的边方程值为正的情况下,使用由所述两条局部边的四个端点中的第一、第二、及第三端点组成的三角形对所述扫描到的像素进行插值,在所述扫描到的像素相对于连接所述两条局部边的四个端点中的第一和第三端点的线段的边方程值为负的情况下,使用由所述两条局部边的四个端点中的第三、第四、及第一端点组成的三角形对所述扫描到的像素进行插值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101754744A CN101739696B (zh) | 2008-11-10 | 2008-11-10 | 用于对凸多边形进行栅格化的系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101754744A CN101739696B (zh) | 2008-11-10 | 2008-11-10 | 用于对凸多边形进行栅格化的系统及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101739696A true CN101739696A (zh) | 2010-06-16 |
CN101739696B CN101739696B (zh) | 2012-07-04 |
Family
ID=42463146
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101754744A Expired - Fee Related CN101739696B (zh) | 2008-11-10 | 2008-11-10 | 用于对凸多边形进行栅格化的系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101739696B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105184837A (zh) * | 2015-08-31 | 2015-12-23 | 武汉云空间地理信息技术有限公司 | 一种矢量多边形栅格化的算法及系统 |
CN106780290A (zh) * | 2016-12-14 | 2017-05-31 | 江苏维普光电科技有限公司 | 一种快速计算从矢量图形提取网栅图形及填充的方法 |
CN110246173A (zh) * | 2018-08-14 | 2019-09-17 | 浙江大华技术股份有限公司 | 一种判断形状区域的方法和装置 |
CN113204607A (zh) * | 2021-05-11 | 2021-08-03 | 南京大学 | 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法 |
-
2008
- 2008-11-10 CN CN2008101754744A patent/CN101739696B/zh not_active Expired - Fee Related
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105184837A (zh) * | 2015-08-31 | 2015-12-23 | 武汉云空间地理信息技术有限公司 | 一种矢量多边形栅格化的算法及系统 |
CN105184837B (zh) * | 2015-08-31 | 2018-02-02 | 武汉云空间地理信息技术有限公司 | 一种矢量多边形栅格化的方法及系统 |
CN106780290A (zh) * | 2016-12-14 | 2017-05-31 | 江苏维普光电科技有限公司 | 一种快速计算从矢量图形提取网栅图形及填充的方法 |
CN110246173A (zh) * | 2018-08-14 | 2019-09-17 | 浙江大华技术股份有限公司 | 一种判断形状区域的方法和装置 |
CN110246173B (zh) * | 2018-08-14 | 2023-11-03 | 浙江大华技术股份有限公司 | 一种判断形状区域的方法和装置 |
CN113204607A (zh) * | 2021-05-11 | 2021-08-03 | 南京大学 | 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法 |
CN113204607B (zh) * | 2021-05-11 | 2023-07-25 | 南京大学 | 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101739696B (zh) | 2012-07-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9280810B2 (en) | Method and system for correcting a distorted input image | |
JP2022527143A (ja) | 3次元オブジェクトモデリング方法、画像処理方法、画像処理装置 | |
JP4327105B2 (ja) | 描画方法、画像生成装置、および電子情報機器 | |
CN111524150B (zh) | 图像处理的方法及装置 | |
JP3466661B2 (ja) | 画像処理装置及びその方法 | |
JPH0681275B2 (ja) | 画像変換装置 | |
US11593913B2 (en) | Method and system for correcting a distorted input image | |
WO2010050911A1 (en) | Method and system for image resizing based on interpolation enhanced seam operations | |
CN101071508A (zh) | 图像处理装置和图像处理方法 | |
US8406551B2 (en) | Rendering method of an edge of a graphics primitive | |
CN101739696B (zh) | 用于对凸多边形进行栅格化的系统及方法 | |
JP5893445B2 (ja) | 画像処理装置、および画像処理装置の動作方法 | |
JPS6380375A (ja) | テクスチヤマツピング装置 | |
CN104796649A (zh) | 一种三维投影的方法及装置 | |
CN113506305B (zh) | 三维点云数据的图像增强方法、语义分割方法及装置 | |
TWI395152B (zh) | 繪圖處理單元及處理邊框顏色資訊之方法 | |
JP2022153857A (ja) | 画像処理装置、画像処理方法、移動装置、及びコンピュータプログラム | |
JP3547250B2 (ja) | 描画方法 | |
US6515660B1 (en) | Apparatus and method for dynamic triangle stripping | |
CN115761166A (zh) | 基于矢量瓦片的地图构建方法及其应用 | |
US10339704B2 (en) | Image data processing method in image processor and computer readable medium storing program therefor for rendering a texture based on a triangulation pattern | |
CN110288548B (zh) | 一种整型像素值图像浮点化方法 | |
CN102543040B (zh) | 用在图形光栅扫描中的凸多边形插值方法和系统 | |
JP4766576B2 (ja) | 描画方法、画像生成装置、および電子情報機器 | |
CN115082324B (zh) | 一种视频图像局部旋转处理方法、系统、终端及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120704 Termination date: 20161110 |
|
CF01 | Termination of patent right due to non-payment of annual fee |