用于填充平行四边形的方法和系统的制作方法

文档序号:6482762阅读:315来源:国知局
专利名称:用于填充平行四边形的方法和系统的制作方法
技术领域
本发明涉及填充平行四边形的方法。本发明也涉及实现这样一个方法的系统。最后,本发明涉及实现这样一个方法的计算机程序。
本发明特别适用于图像合成、二维或三维视频游戏以及按照MPEG-4标准的视频对象处理等领域。
背景技术
在视频游戏领域以及更一般地在图像合成领域,提出了一个问题,即在一个图形屏面上显示所关心的具有或多或少地复杂的形状的对象,该图形屏面包含点地离散网格—这些点在二维空间中通常被称作像素,在三维空间中被称作三维像素。为此,将所关心的对象分解成基本的形式(一般是三角形),根据对它们的顶点的坐标的了解,在屏面上的离散网格上描绘和填充它们,向它们分配一个纹理值。因此,一个问题是使离散网格上的一个点对应于具有非整数实坐标的基本形状上的一个点。已经开发了用于管理这个问题的技术,大多数都是根据所谓的“中点”算法或Bresenham算法的原理。这个算法最初是由Jack E.Bresenham的文件“Algorithm for Computer Control of aDigital Plotter”(数字绘图仪的计算机控制算法)公开的,1965公布于IBM System Journal,卷4(1),25-30页上。该算法尤其使得有可能快速有效地描绘倾斜线段。这样一个算法被广泛用于图像合成领域。所属技术领域的人员也熟知的其他技术,后来从这个算法中衍生出来,用于填充三角形甚至多边形。
这些技术的共同特点是,提出通过水平或垂直扫描来填充三角形、甚至多边形。一类很适合于这样一个扫描的三角形是包含直线段的三角形,就是说,水平的或垂直的。

图1表示一个三角形IJK,它的线段JK是水平的。在这个情况中,这样一个三角形的填充包含以下步骤
—按照Bresenham算法描绘线段IJ的步骤。这个步骤旨在计算一个坐标系(Jx,Jy)中的线段IJ的点Ji的坐标。知道这些坐标,就有可能描绘这些点并向它们分配纹理值;
—按照Bresenham算法描绘线段IK的步骤。这个步骤旨在计算一个坐标系(Jx,Jy)中的线段IK的点Ki的坐标;
—水平扫描三角形IJK的步骤,旨在行进通过包含该三角形的有关区域RI;
—利用线段IJ和IK的点的坐标以检测所述区域RI上的某点是否属于三角形IJK的检测步骤。例如,位于线段JiKi上的点P,如果它的横坐标XP满足XJi<XP<XKj,则该点属于三角形IJK。
这个方法的一个优点是速度快、复杂度低。这是因为,Bresenham算法只用整数和加法就能实现,因此很适合于硬件实现,这在视频游戏领域中是特别有益的。这是因为,在这个领域中,所关心的对象经受越来越复杂的处理,为了实时地被执行,处理是由为提高诸如描绘两个已知点之间的倾斜线段的常见计算而专门设计的处理器执行的。
这样的方法也有益地用于视频压缩领域,特别是通过MPEG-4标准(动画专家组)进行视频压缩的领域。这是因为,这个标准具有独立于视频序列的背景之外来考虑视频序列中所关心的对象的特性。这样一个对象包含被单独编码的形状和纹理。这个形状是通过一般是矩形的围框(bounding box)而编码的。围框内的这个形状的填充也用Bresenham算法进行。
然而,很清楚,尽管视频游戏场景中所关心的对象总是能被分解成以三角形相拼的图案,但视频场景中常常含有大量的平行四边形。这是因为,在二维中非常普遍的矩形形状,将在三维中的透视视图中变成为平行四边形。
在MPEG-4标准中使用的围框受相同类型的变形,在透视视图中变成平行四边形。
尽管具有一个直线段的二个三角形足以描述一个矩形,对于平行四边形来说则至少必须有四个三角形。因此,平行四边形由四个三角形的描述和这些三角形的连接来表示。当在图形屏面上描绘和填充这个平行四边形时,这样一个表示是复杂的,对存储空间而言是昂贵的,并且不是非常实用。

发明内容
本发明的目的是提出一种以更简单快捷的方式、只用这四个顶点的坐标来描绘和填充平行四边形的解决方案。
这个目的是通过对一个包含第一顶点、第二顶点、第三顶点和第四顶点的平行四边形进行填充的方法实现的,该方法包含
—计算第一顶点与第二顶点之间的第一线段的坐标的步骤;
—计算第一顶点与第三顶点之间的第二线段的坐标的步骤;
—计算第二顶点与第四顶点之间的第三线段的坐标的步骤;
—计算平行于第一线段并且被包含在平行四边形内的线段的坐标的循环步骤。
按照本发明的方法使得有可能根据一个平行四边形的四个顶点的坐标计算位于平行四边形内各点的坐标,并因此描绘和填充平行四边形而无需将其分解成若干个三角形。所述方法包含描绘平行四边形的第一线段,然后描绘互相平行并且位于第一线段的各侧的第二和第三线段,最后描绘包含在第二和第三线段之间的、第一线段的所有可能的平行线。
在第一实施例中,计算与第一线段平行的线段的坐标的循环步骤,包含选择第二线段上的一个点和第三线段上的一个点,使得这两点分别位于在优选的水平或垂直方向上离第一和第二顶点相等距离的位置,并计算位于这两点之间的线段各点的坐标。
计算线段上各点的坐标的各个步骤,有利地使用Bresenham算法—也称中点算法,因为它使得有可能简单快捷地描绘两点之间的倾斜线段。
按照本发明的方法通过只要根据对平行四边形的四个顶点的了解而提供平行四边形中包含的点的坐标,避免了将平行四边形分解成三角形,并使得有可能节省存储空间。这是因为,只有四个顶点的坐标,而不是所有三角形的顶点以及平行四边形内的这些三角形的连接的表示,必须被存储在存储器中。
在第二实施例中,计算与第一线段平行的线段的坐标的循环步骤,包含在平行四边形内以一定的增量在一个优选方向上平移第一线段。知道了这个增量,就能容易地从第一线段的点的坐标推导出所获得的平移线段上的点的坐标。继续这个操作,以便覆盖平行四边形的整个表面。
第二实施例的一个主要优点是提供平行四边形的彻底填充,就是说没有任何漏洞(hole)。平移一个线段不导致任何误差积累。相反,处于并排位置的平移线段完美结合,因为它们是同样的。
附图简介
现在将参照附图中的实施例的例子进一步本发明,然而本发明并不受限于这些附图。
图1a表示按照现有技术的对具有一条直边的三角形的填充;
图1b表示按照本发明的对平行四边形的填充;
图2a表示按照本发明的对平行四边形的填充的方法的功能示意图2b表示按照本发明第一实施例填充平行四边形的例子;
图3a和3b表示用于描绘离散网格上的倾斜线段Bresenham算法的原理;
图4表示本发明第一实施例的功能示意图5表示在按照本发明第一实施例的对平行四边形填充期间漏洞的形成;
图6表示本发明第二实施例的功能示意图7a和7b表示按照本发明第二实施例填充平行四边形的例子;
图8表示按照本发明第二实施例计算点E的坐标的方法的原理。
具体实施例方式
按照本发明的方法涉及对图形屏面上的离散网格上的平行四边形进行填充。所述方法同样好地既适合于二维表示也适合于三维表示。以下仅就二维的情形作说明。然而,对于所属领域的熟练人员来说,要将此情形扩展到三维,并无任何特别的困难。
图1b表示按照本发明的一个仅仅根据对平行四边形ABCD的第一顶点A、第二顶点B、第三顶点C和第四顶点D的了解而填充该平行四边形该的例子。填充是通过以平行于第一线段AB的方式对平行四边形ABCD进行连续扫描而实现的。
图2a中以功能性方式表示了按照本发明的方法的一个例子。该方法包含计算第一线段AB的点的坐标的步骤10。为了文字的简化,以下把术语AB给予在一个以第一顶点A为原点的坐标系(Ax,Ay)中的线段AB各点的所有坐标{(XA,YA)(X1,Y1),(X2,Y2),...,(XB,YB)}。由第一线段AB上各点构成的集合因此被表达为AB={(0,0)(X1,Y1),(X2,Y2),...,(XB,YB)}。
按照本发明的方法也包含计算第二线段AC上的点的坐标的步骤11和计算第三线段BD上的点的坐标的步骤12。
有益地,这个对坐标的计算是按照被称为Bresenham算法或中点算法的算法进行的。这样一个算法尤其使得描绘图形屏面的离散网格中的倾斜线段成为可能。动词“描绘”(trace)这里的意思是确定构成该倾斜线段的离散近似值的离散网格上的各点。
Bresenham算法的原理在图3a和3b中表示。在图3a中,表示了一个离散网格1,它由坐标系(Ox,Oy)标注并由倾斜线段2切割。算法过程如图3b所示
—优选方向的选择。这个选择与线段2的倾斜度的度量α有关。如果这个倾斜度小于45度,则选择轴Ox,否则就是轴Oy。在图2b的例子中,是轴Ox。
—从该线段的一端S1开始,沿优选方向Ox的轴递增坐标xs1。考察属于线段2的使得xs=xs1+1的点S。这是一个确定网格1上哪个点最接近S的事情。两个点是候选点位于S1的东北、使得xc1=xs1+1且Yc1=Ys1+1的点C1,以及位于S1的东边、使得xc2=xs1+1且Yc2=Ys1的点E。
—考察线段C1C2的中点M,评估差Δ1=Yc1-yM和Δ2=yM-yc2。如果Δ1<Δ2,选择C1作为点S的近似,否则,选择C2作为点S的近似。
—对倾斜线段2上的所有的点重复该操作。获得一个不连续的线3,这是在8种相关性(即考虑到一个点有8个相邻点的关系)的意义上的一连串的相关点。
以下用C语言表示一个使用Bresenham算法来描绘一个线段的“划线”(line)函数的实现的例子
  static  void line(int xi,int yi,int xf,int yf){   int dx,dy,i,xinc,yinc,cumul,x,y;   x=xi;   y=yi;   dx=xf-xi;   dy=yf-yi;<!-- SIPO <DP n="5"> --><dp n="d5"/>  xinc=(dx>0)?1:-1;  yinc=(dy>0)?1:-1;  dx=abs(dx);  dy=abs(dy);  printf(″%d,%d\n″,x,y);  if(dx>dy){   cumul=dx/2;  for(i=l;i<=dx;i++){   x+=xinc;   cumul+=dy;   if(cumul>=dx){   cumul-=dx;   y+=yinc;   }   printf(″%d,%d\n″,x,y);   }  }   else{   cumul=dy/2;   for(i=1;i<=dy;i++){   y+=yinc;   cumul+=dx;   if(cumul>=dy){   cumul-=dy;   x+=xinc;   }   printf(″%d,%d\n″,x,y);   }   }  }
这个例子显示这个算法的简单性,该算法只用整数值,没有乘法,被总结为几行代码。Bresenham算法很好地适合于以硬件来实现。
然而,本发明并不限于使用这个算法,而是涉及任何其它的描绘倾斜线段的方法。存在将一个单词与此线段相关联的线段描绘方法,这个单词的计算是根据这个线段上两个连续点之间的连接的Freeman码的。Castle方法在Castle所著的文件“An application of Euclid’salgorithm to drawing straight lines”(应用欧几里得算法绘直线)中描述(该文由Springer-Verlag出版在“Fundamental Algorithms inCoumputer Graphics”(计算机图形的基本算法)中发表,见135-139页)。这些方法的一个缺点是比实现Bresenham算法更复杂。
图2b表示一个平行四边形ABCD的例子,通过Bresenham算法描绘该平行四边形的第一、第二和第三线段AB、AC和BD。在这个例子中,通过以横轴Ax为优选方向描绘第一线段AB,而第二和第三线段AC和BD则是通过以纵轴Ay为优选方向而被描绘的。
在三个步骤11、12和13的结尾,第一、第二和第三线段AB、AC和BD的迹线是已知的。构成这三个线段的离散网格上的所有的点因此完全由它们在坐标系(Ax,Ay)中的坐标所确定。
最后,按照本发明的方法包含一个步骤20,它描绘平行于第一线段AB且包含在平行四边形ABCD内的所有线段。
在由图4中的功能示意图描述并由图2b中的例子例示的本发明第一实施例中,所述步骤20包含子步骤21,该子步骤计算一个被包含在属于第二线段AC的点Ai与属于第三线段BD的点Bi之间的线段的坐标,Ai和Bi位于分别与A和B的距离相等的位置。重复子步骤21,以便描绘位于平行四边形ABCD内的并且分别在水平或垂直优选方向上与A和B距离相等的所有线段AiBi。在图2b的例子中,线段AC和BD的优选方向是纵轴Ay。从xA开始,第二线段AC的点A1和第三线段BD的相应点B1是这样考虑的,以便使YA1=YA+1和使YB1=YB+1。第二和第三线段AC和BD是平行的,点A1和B1沿轴Ay分别与A和B距离相等。
有利地,子步骤21用Bresenham算法计算线段A1B1上的点的坐标。对YAi≤yC的所有线段AiBi重复这个操作,就是说,一直到所有的平行四边形被遍历。
下面表示一个旨在用前面描述“划线”(line)函数来填充一个平行四边形的“平行四边形”函数的实现的例子
  static void parallelogram(int xa,int ya,int xb,int yb,int xc,int yc,int xd,intyd){  int x_ab,y_ab,x_cd,y_cd,i,xinc,yinc,dx,dy,cumul;<!-- SIPO <DP n="7"> --><dp n="d7"/>  x_ab=xa;  y_ab=ya;  x_cd=xc;  y_cd=yc;  dx=xb-xa;  dy=yb-ya;  xinc=(dx>0)?1:-1;  yinc=(dy>0)?1:-1;  dx=abs(dx);  dy=abs(dy);  line(x_ab,y_ab,x_cd,y_cd);  printf(″\n″);  if(dx>dy){   cumul=dx/2;   for(i=1;i<=dx;i++){   x_ab+=xinc;   x_cd+=xinc;   cumul+=dy;   if(cumul>=dx){   cumul-=dx;   y_ab+=yinc;   y_cd+=yinc;   }   line(x_ab,y_ab,x_cd,y_cd);   printf(″\n″);   }  }  else{  cumul=dy/2;  for(i=1;i<=dy;i++){   y_ab+=yinc;   y_cd+=yinc;   cumul+=dx;<!-- SIPO <DP n="8"> --><dp n="d8"/>   if(cumul>=dy){   cumul-=dy;   x_ab+=xinc;   x_cd+=xinc;   }   line(x_ab,y_ab,xcd,y_cd);   printf(″\n″);   }   }  }
本发明的这个第一实施例的一个优点是它非常简单。如下文所示的“平行四边形”函数例子所显示的那样,Bresenham算法只使用整数值和限于加法和比较检测的简单运算。这样一个算法因此与实时执行相容并且和适合于硬件实现,而这是例如生成视频游戏所要求的。
本发明的这个第一实施例的一个缺点是不保证在平行四边形中使用的离散网格上的所有各点的穷尽遍历。这是因为Bresenham算法是以近似为基础的,这会引起误差。在图3b中,线段2的点S的纵坐标ys被替换为整数纵坐标yc1所产生的误差等于yc1-ys。在利用Bresenham算法生成几个并排的倾斜点段的过程中,子步骤21累积这种类型的误差,这意味着离散网格上的某些点尽管被包含在平行四边形内,却不在任何线段AiBi的迹线上。这样的误差由图5例示。在点A1和B1之间被描绘的线段与在点A和B之间被描绘的线段之间,有未被平行四边形ABCD的任何线段遍历的点—尽管它们属于平行四边形ABCD。
在图6中功能性地表示的本发明的第二实施例中,步骤20包含子步骤22,它在水平和垂直优选方向上平移第一线段AB,以便提供一个包含在平行四边形ABCD内的平移线段。这个平移子步骤22包含通过在水平和垂直优选方向上平移而计算一个平行于第一线段AB的线段的坐标。图7a表示在平行四边形ABCD内沿轴Ax方向对线段AB进行横向平移的例子。这样的平移非常易于实现。事实上,考察在正x的方向上被横向平移一个单位的线段A’1B’1。这简单地得出XA’1=XA+1且YA’1=YA。这样,所有可能的平移线段A’iB’i例如XA<XA’≤XC都被描绘。形成了平行四边形6。只有属于平行四边形6与平行四边形ABCD共有的表面5的各点必须被考虑。为此,步骤20包含一个旨在检测A’iB’i上的点P是否属于平行四边形ABCD的子步骤23。所述步骤包含确认点P的纵坐标Xp小于线段BD的点Bi的纵坐标YBi,XBi=XB+(XAi-XA’i)。如图7a所示,第一线段AB在优选方向上的这样的平移并不可能填充整个平行四边形ABCD。在图7a中,考察轴Ax与线段CD的相交的点H。由顶点ACH构成的三角形依然有待填充。为此,参看图7b,考察通过把第三个顶点C在优选方向Ax上投影到线段AB的延长线上而获得的点E。步骤20还包含一个计算所述投影点E的坐标的子步骤24。这个计算可以用各种方式进行。第一个解决方案包含考察矢量和矢量

是平行的,满足所属技术领域的熟练人员周知的方程-xB·yE-yB·(-xE)=0。已知YE=YC,由于E是C沿轴Ax的投影,E的横坐标等于XE=(XB.YC)YB。这个解决方案的一个优点是根据非常简单的关系。主要缺点是它使用除法,对于处理器上的计算循环而言这是非常昂贵的。作为替代,可以使用一个更符合算法的包含两个步骤的方法。图8中表示一个例子。第一步骤包含确定E在直线(AB)上的一个非最优的位置ENO。该步骤具体如下
xENO=yENO=0;
do{
xENo+=-|xB-xA|;
yENO+=1|yB-yA|;
}
while(|yENO|≤|yC|);
考察关于点A与点B对称的点E’。如果这个点E’的纵坐标在绝对值上大于C的纵坐标,则取ENO等于点E’,否则考察关于点A与点E’对称的点E”,依此类推,直到满足条件|yENO|≤|yC|。
第二步骤包含通过按照Bresenham算法确定线段ENOA的点的坐标来精选点E在直线(AB)上的位置。从A开始,这只是个遍历远至点E的线段AENO的问题,就是说,远至线段ENOA上的、纵坐标等于yc的点。
这个第二算法的一个优点是不用除法。
步骤20然后包含一个计算由投影E和顶点A构成的线段EA各点的坐标的子步骤25。像前文为描绘倾斜线段而实现的步骤一样,所述步骤25有利地使用Bresenham算法。
一个在优选方向上平移线段EA的子步骤26,旨在提供与线段EA平行的线段EiA’i,所依据的原理类似于前文对平移线段AB的步骤22所描述的原理。与以前对线段AB相同的方式,将子步骤26与检测步骤27结合,以检测从EA平移的线段EiA’i上的点P是否包含在平行四边形ABCD中。
线段AB和EA沿轴Ax以对应于线段AC的一个距离的连续平移,使得有可能遍历平行四边形ABCD上的所有点。这个第二算法的一个优点是它提供对平行四边形ABCD的完全的填充。可以认为用于执行线段的平移以及检测它的点是否包含在平行四边形内的操作,与用于描绘两个已知点之间的倾斜线段Bresenham算法所用的操作具有相同的复杂度。另一方面,计算投影点E的步骤使第二实施例比第一实施例更复杂一些。然而,如下面呈现的实现例子所示,第二实施例的实现依然相当简单。
  void parallelogram(int Ax,int Ay,int Bx,int By,   int Cx,int Cy,int Dx,int Dy){  int AB_dx,AB_dy,AB_max,AB_xinc,AB_yinc,   AB_cumul,AB_i,AB_x,AB_y,AB_mode;<!-- SIPO <DP n="11"> --><dp n="d11"/>  int AC_dx,AC_dy,AC_max,AC_xinc,AC_yinc,  AC_cumul,AC_i,AC_x,AC_y,AC_mode;  int EA_dx,EA_dy,EA_max,EA_xinc,EA_yinc,  EA_cumul,EA_i,EA_x,EA_y,E_ok,Ex,Ey,EA_mode;  int BF_dx,BF_dy,BF_max,BF_xinc,BF_yinc,  BF_cumul,BF_i,BF_x,BF_y,F_ok,Fx,Fy,BF_mode;  int x,y;  int transVertical,transHorizontal;  //确定线段AB的垂直或水平平移  transVertical=0;  transHorizontal=0;  if(abs(Bx-Ax)>abs(By-Ay)){  if(Cy>Ay)transVertical=1;  else transVertical=-1;  }else{  if(Cx>Ax)transHorizontal=1;  else transHorizontal=-1;  }  //  //如有需要确定E或F的位置  //如AB的平移是水平的  //E是C在线段AB上的水平投影,  //F是D在线段AB上的水平投影,  //如AB的平移是垂直的  //E是C在线段AB上的垂直投影  //F是D在线段AB上的垂直投影,  //E和F必定是在线段AB之外  if(((transVertical!=0)&amp;&amp;(Cx<Ax))‖  ((transHorizontal!=0)&amp;&amp;(Cy<Ay))){  E_ok=1;  }  else{<!-- SIPO <DP n="12"> --><dp n="d12"/>  E_ok=0;  }  if(((transVertical!=0)&amp;&amp;(Cx>Ax))‖  ((transHorizontal!=0)&amp;&amp;(Cy>Ay)))  F_ok=1;  else  F_ok=0;  AB_x=Ax;  AB_y=Ay;  init(Ax,Ay,Bx,By,&amp;AB_dx,&amp;AB_dy,&amp;AB_xinc,&amp;AB_yinc,  &amp;AB_cumul,&amp;AB_max,&amp;AB_mode);  for(AB_i=1;AB_i<=AB_max+1;AB i++){  if(transVertical!=0){   if((F_ok==1)&amp;&amp;(AB_x==Cx)){   Fx=Dx;   Fy=By+(AB_y-Ay);  }  if((E_ok==1)&amp;&amp;(AB_x==Dx)){   Ex=Cx;   Ey=Ay-(By-AB_y);  }  }else if((transHorizontal!=0)){   if((F_ok==1)&amp;&amp;(AB_y==Cy)){   Fx=Bx+(AB_x-Ax);   Fy=Dy;   }   if((E_ok==1)&amp;&amp;(AB_y==Dy)){   Ex=Ax-(Bx-AB_x);   Ey=Cy;   }  }  next(AB_mode,AB_xinc,AB_yinc,AB_dx,AB_dy,   &amp;AB_cumul,&amp;AB_x,&amp;AB_y);<!-- SIPO <DP n="13"> --><dp n="d13"/>  }  //  //在线段AC上的Bresenham  AC_x=Ax;  AC_y=Ay;  init(Ax,Ay,Cx,Cy,&amp;AC_dx,&amp;AC_dy,&amp;AC_xinc,&amp;AC_yinc,  &amp;AC_cumul,&amp;AC_max,&amp;AC_mode);  for(AC_i=1;AC_i<=AC_max+1;AC_i++){  printf(″\n%dnd line″,AC_i);  //  //在线段EA上的Bresenham  if(E_ok==1){   EA_x=Ex;   EA_y=Ey;   init(Ex,Ey,Ax,Ay,&amp;EA_dx,&amp;EA_dy,&amp;EA_xinc,&amp;EA_yinc,   &amp;EA_cumul,&amp;EA_max,&amp;EA_mode);   for(EA_i=1;EA_i<=EA_max;EA_i++){   x=EA_x;   y=EA_y;   if((transVertical==-1))   y=EA_y-AC_i-transVertical;   else if(transVertcal==1)   y=EA_y+AC_i-transVertical;   if((transHorizontal==-1))   x=EA_x-AC_i-transHorizontal;   else if(transHorizontal==1)   x=EA_x+AC_i-transHorizontal;   test(transVertical,transHorizontal,   AB_dx,AB_dy,AC_x,AC_y,x,y);   next(EA_mode,EA_xinc,EA_yinc,EA_dx,EA_dy,   &amp;EA_cumul,&amp;EA_x,&amp;EA_y);   }  }  //<!-- SIPO <DP n="14"> --><dp n="d14"/>  //在线段AB上的Bresenham  AB_x=Ax;  AB_y=Ay;  init(Ax,Ay,Bx,By,&amp;AB_dx,&amp;AB_dy,&amp;AB_xinc,&amp;AB_inc,   &amp;AB_cumul,&amp;AB_max,&amp;AB_mode);  for(AB_i=1;AB_i<=AB_max+1;AB_i++){   x=AB_x;   y=AB_y;   if(transVertical==-1)   y=AB_y-AC_i-transVertical;   else if(transVertical==1)   y=AB_y+AC_i-transVertical;   if(transHorizontal==-1)   x=AB_x-AC_i-transHorizontal;   else if(transHorizontal==1)   x=AB_x+AC_i-transHorizontal;  test(transVertical,transHorizontal,   AB_dx,AB_dy,AC_x,AC_y,x,y);  next(AB_mode,AB_xinc,AB_yinc,AB_dx,AB_dy,   &amp;AB_cumul,&amp;AB_x,&amp;AB_y);  }  //  //在线段BF上的Bresenham  if(F_ok==1){   BF_x=Bx;   BF_y=By;   init(Bx,By,Fx,Fy,&amp;BF_dx,&amp;BF_dy,&amp;BF_xinc,&amp;BF_yinc,   &amp;BF_cumul,&amp;BF_max,&amp;BF_mode);   for(BF_i=1;BF_i<=BF_max+1;BF_i++){  next(BF_mode,BF_xinc,BF_yinc,BF_dx,BF_dy,   &amp;BF_cumul,&amp;BF_x,&amp;BF_y);  x=BF_x;  y=BF_y;  if(transVertical==-1)<!-- SIPO <DP n="15"> --><dp n="d15"/>   y=BF_y-AC_i-transVertical;  else if(transVertieal==1)   y=BF_y+AC_i-transVertical;  if((transHorizontal==-1))   x=BF_x-AC_i-transHorizontal;  else if(transHorizontal==1)   x=BF_x+AC_i-transHorizontal;  test(transVertical,transHorizontal,   AB_dx,AB_dy,AC_x,AC_y,x,y);   }  }  printf(″\n″);  next(AC_mode,AC_xinc,AC_yinc,AC_dx,AC_dy,   &amp;AC_cumul,&amp;AC_x,&amp;AC_y);   }  }
有可能通过适当编程的电路实现按照本发明的处理方法。在程序存储器中含有的计算机程序可使该电路执行以上参照图4和6所述的各种操作。也可以通过读取含有所述程序的诸如盘的数据介质,将该计算机程序装入程序存储器。这种读取也可以通过诸如因特网的通信网络而进行。在这种情况下,服务提供商将使计算机程序以可下载信号的形式提供给感兴趣的当事方。
本发明不限于刚刚通过举例所说明的实施例。在本发明的范围内可以对它们作出各种修改和改进。特别地,可以使用其它成像方式,诸如磁共振成像和正电子放射断层摄影术。在本文的语境中,动词“包含”被用来表示不排除对其它元素、装置或步骤的使用。
权利要求
1.一种填充包含第一顶点(A)、第二顶点(B)、第三顶点(C)和第四顶点(D)的平行四边形(ABCD)的方法,所述方法包含
-计算第一顶点(A)与第二顶点(B)之间的第一线段(AB)上的各点的坐标的步骤(10);
-计算第一顶点(A)与第三顶点(C)之间的第二线段(AC)上的各点的坐标的步骤(11);
-计算第二顶点(B)与第四顶点(D)之间的第三线段(BD)上的各点的坐标的步骤(12);
-计算一个平行于第一线段AB并且被包含在平行四边形ABCD内的线段上的各点的坐标的循环步骤(20)。
2.如权利要求1中所要求的填充平行四边形(ABCD)的方法,特征在于,所述计算平行于第一线段AB的线段上的各点的坐标的循环步骤(20)还包含子步骤(21),该子步骤计算一个在属于第二线段(AC)的点(Ai)与属于第三线段(BD)的点(Bi)之间的线段上的各点的坐标,点(Ai)和(Bi)分别位于在水平(Ax)或垂直(Ay)优选方向上与第一顶点(A)和第二顶点(B)的相同距离的位置上。
3.如权利要求1中所要求的填充平行四边形(ABCD)的方法,特征在于,所述计算平行于第一线段AB的线段的坐标的循环步骤(20)包含子步骤(22)和检测子步骤(23),子步骤(22)在水平或垂直优选方向上平移第一线段(AB),旨在提供一个被包含在平行四边形(ABCD)内的平移线段A’iB’i;检测子步骤(23)旨在检测平移线段A’iB’i上的点(P)是否被包含在平行四边形(ABCD)内。
4.如权利要求3中所要求的填充平行四边形(ABCD)的方法,特征在于,所述计算平行于第一线段AB的线段上的各点的坐标的循环步骤(20)还包含
-子步骤(24),计算第三顶点(C)在第一线段(AB)的延长线上并平行于优选方向的一个投影(E)的坐标;
-子步骤(25),计算由投影(E)和第一顶点(A)构成的线段(EA)的点的坐标;
-子步骤(26),在优选方向上平移线段(EA),旨在提供与线段(EA)平行的线段(EiA’i);
-子步骤(27),旨在检测从(EA)平移的线段(EiA’i)上的点(P)是否被包含在平行四边形(ABCD)内。
5.如权利要求1中所要求的填充平行四边形(ABCD)的方法,特征在于,所述计算线段上的各点的坐标的各步骤使用中点算法。
6.一种用于描绘和填充图形屏面的平行四边形(ABCD)、旨在从第一顶点(A)、第二顶点(B)、第三顶点(C)和第四顶点(D)的坐标提供被包含在平行四边形中的各点坐标的系统,所述系统包含
-用于计算第一顶点A与第二顶点B之间的第一线段上的各点的坐标的装置(10);
-用于计算第一顶点A与第三顶点C之间的第二线段上的各点的坐标的装置(11);
-用于计算第二顶点B与第四顶点D之间的第三线段上的各点的坐标的装置(12);
-用于计算平行于第一线段AB并且被包含在平行四边形ABCD内的线段各点的坐标的循环装置(20)。
7.一种计算机程序产品,包含一个指令集,当它们被加载到一个电路中时,使该电路执行如权利要求1中所要求的方法。
全文摘要
本发明涉及一种根据对平行四边形(ABCD)的顶点的了解以描绘和填充在图形屏面的离散网格上的平行四边形(ABCD)的方法,该平行四边形包含第一顶点(A)、第二顶点(B)、第三顶点(C)和第四顶点(D)。按照本发明的方法包含计算第一顶点(A)与第二顶点(B)之间的第一线段(AB)上的各点的坐标的步骤(10);计算第一顶点(A)与第三顶点(C)之间的第二线段(AC)上的各点的坐标的步骤(11);计算第二顶点(B)与第四顶点(D)之间的第三线段(BD)上的各点的坐标的步骤(12);计算平行于第一线段AB并且被包含在平行四边形ABCD内的线段上的各点的坐标的循环步骤(20)。有利地,所述计算线段上的各点的坐标的各步骤使用所谓的中点算法或Bresenham算法。
文档编号G06T11/40GK1777917SQ20048001095
公开日2006年5月24日 申请日期2004年4月15日 优先权日2003年4月24日
发明者Q·赵, L·帕斯奎尔, M·杜兰顿 申请人:皇家飞利浦电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1