專利名稱:用于填充平行四邊形的方法和系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及填充平行四邊形的方法。本發(fā)明也涉及實現(xiàn)這樣一個方法的系統(tǒng)。最后,本發(fā)明涉及實現(xiàn)這樣一個方法的計算機程序。
本發(fā)明特別適用于圖像合成、二維或三維視頻游戲以及按照MPEG-4標準的視頻對象處理等領域。
背景技術:
在視頻游戲領域以及更一般地在圖像合成領域,提出了一個問題,即在一個圖形屏面上顯示所關心的具有或多或少地復雜的形狀的對象,該圖形屏面包含點地離散網(wǎng)格—這些點在二維空間中通常被稱作像素,在三維空間中被稱作三維像素。為此,將所關心的對象分解成基本的形式(一般是三角形),根據(jù)對它們的頂點的坐標的了解,在屏面上的離散網(wǎng)格上描繪和填充它們,向它們分配一個紋理值。因此,一個問題是使離散網(wǎng)格上的一個點對應于具有非整數(shù)實坐標的基本形狀上的一個點。已經(jīng)開發(fā)了用于管理這個問題的技術,大多數(shù)都是根據(jù)所謂的“中點”算法或Bresenham算法的原理。這個算法最初是由Jack E.Bresenham的文件“Algorithm for Computer Control of aDigital Plotter”(數(shù)字繪圖儀的計算機控制算法)公開的,1965公布于IBM System Journal,卷4(1),25-30頁上。該算法尤其使得有可能快速有效地描繪傾斜線段。這樣一個算法被廣泛用于圖像合成領域。所屬技術領域的人員也熟知的其他技術,后來從這個算法中衍生出來,用于填充三角形甚至多邊形。
這些技術的共同特點是,提出通過水平或垂直掃描來填充三角形、甚至多邊形。一類很適合于這樣一個掃描的三角形是包含直線段的三角形,就是說,水平的或垂直的。
圖1表示一個三角形IJK,它的線段JK是水平的。在這個情況中,這樣一個三角形的填充包含以下步驟
—按照Bresenham算法描繪線段IJ的步驟。這個步驟旨在計算一個坐標系(Jx,Jy)中的線段IJ的點Ji的坐標。知道這些坐標,就有可能描繪這些點并向它們分配紋理值;
—按照Bresenham算法描繪線段IK的步驟。這個步驟旨在計算一個坐標系(Jx,Jy)中的線段IK的點Ki的坐標;
—水平掃描三角形IJK的步驟,旨在行進通過包含該三角形的有關區(qū)域RI;
—利用線段IJ和IK的點的坐標以檢測所述區(qū)域RI上的某點是否屬于三角形IJK的檢測步驟。例如,位于線段JiKi上的點P,如果它的橫坐標XP滿足XJi<XP<XKj,則該點屬于三角形IJK。
這個方法的一個優(yōu)點是速度快、復雜度低。這是因為,Bresenham算法只用整數(shù)和加法就能實現(xiàn),因此很適合于硬件實現(xiàn),這在視頻游戲領域中是特別有益的。這是因為,在這個領域中,所關心的對象經(jīng)受越來越復雜的處理,為了實時地被執(zhí)行,處理是由為提高諸如描繪兩個已知點之間的傾斜線段的常見計算而專門設計的處理器執(zhí)行的。
這樣的方法也有益地用于視頻壓縮領域,特別是通過MPEG-4標準(動畫專家組)進行視頻壓縮的領域。這是因為,這個標準具有獨立于視頻序列的背景之外來考慮視頻序列中所關心的對象的特性。這樣一個對象包含被單獨編碼的形狀和紋理。這個形狀是通過一般是矩形的圍框(bounding box)而編碼的。圍框內的這個形狀的填充也用Bresenham算法進行。
然而,很清楚,盡管視頻游戲場景中所關心的對象總是能被分解成以三角形相拼的圖案,但視頻場景中常常含有大量的平行四邊形。這是因為,在二維中非常普遍的矩形形狀,將在三維中的透視視圖中變成為平行四邊形。
在MPEG-4標準中使用的圍框受相同類型的變形,在透視視圖中變成平行四邊形。
盡管具有一個直線段的二個三角形足以描述一個矩形,對于平行四邊形來說則至少必須有四個三角形。因此,平行四邊形由四個三角形的描述和這些三角形的連接來表示。當在圖形屏面上描繪和填充這個平行四邊形時,這樣一個表示是復雜的,對存儲空間而言是昂貴的,并且不是非常實用。
發(fā)明內容
本發(fā)明的目的是提出一種以更簡單快捷的方式、只用這四個頂點的坐標來描繪和填充平行四邊形的解決方案。
這個目的是通過對一個包含第一頂點、第二頂點、第三頂點和第四頂點的平行四邊形進行填充的方法實現(xiàn)的,該方法包含
—計算第一頂點與第二頂點之間的第一線段的坐標的步驟;
—計算第一頂點與第三頂點之間的第二線段的坐標的步驟;
—計算第二頂點與第四頂點之間的第三線段的坐標的步驟;
—計算平行于第一線段并且被包含在平行四邊形內的線段的坐標的循環(huán)步驟。
按照本發(fā)明的方法使得有可能根據(jù)一個平行四邊形的四個頂點的坐標計算位于平行四邊形內各點的坐標,并因此描繪和填充平行四邊形而無需將其分解成若干個三角形。所述方法包含描繪平行四邊形的第一線段,然后描繪互相平行并且位于第一線段的各側的第二和第三線段,最后描繪包含在第二和第三線段之間的、第一線段的所有可能的平行線。
在第一實施例中,計算與第一線段平行的線段的坐標的循環(huán)步驟,包含選擇第二線段上的一個點和第三線段上的一個點,使得這兩點分別位于在優(yōu)選的水平或垂直方向上離第一和第二頂點相等距離的位置,并計算位于這兩點之間的線段各點的坐標。
計算線段上各點的坐標的各個步驟,有利地使用Bresenham算法—也稱中點算法,因為它使得有可能簡單快捷地描繪兩點之間的傾斜線段。
按照本發(fā)明的方法通過只要根據(jù)對平行四邊形的四個頂點的了解而提供平行四邊形中包含的點的坐標,避免了將平行四邊形分解成三角形,并使得有可能節(jié)省存儲空間。這是因為,只有四個頂點的坐標,而不是所有三角形的頂點以及平行四邊形內的這些三角形的連接的表示,必須被存儲在存儲器中。
在第二實施例中,計算與第一線段平行的線段的坐標的循環(huán)步驟,包含在平行四邊形內以一定的增量在一個優(yōu)選方向上平移第一線段。知道了這個增量,就能容易地從第一線段的點的坐標推導出所獲得的平移線段上的點的坐標。繼續(xù)這個操作,以便覆蓋平行四邊形的整個表面。
第二實施例的一個主要優(yōu)點是提供平行四邊形的徹底填充,就是說沒有任何漏洞(hole)。平移一個線段不導致任何誤差積累。相反,處于并排位置的平移線段完美結合,因為它們是同樣的。
附圖簡介
現(xiàn)在將參照附圖中的實施例的例子進一步本發(fā)明,然而本發(fā)明并不受限于這些附圖。
圖1a表示按照現(xiàn)有技術的對具有一條直邊的三角形的填充;
圖1b表示按照本發(fā)明的對平行四邊形的填充;
圖2a表示按照本發(fā)明的對平行四邊形的填充的方法的功能示意圖2b表示按照本發(fā)明第一實施例填充平行四邊形的例子;
圖3a和3b表示用于描繪離散網(wǎng)格上的傾斜線段Bresenham算法的原理;
圖4表示本發(fā)明第一實施例的功能示意圖5表示在按照本發(fā)明第一實施例的對平行四邊形填充期間漏洞的形成;
圖6表示本發(fā)明第二實施例的功能示意圖7a和7b表示按照本發(fā)明第二實施例填充平行四邊形的例子;
圖8表示按照本發(fā)明第二實施例計算點E的坐標的方法的原理。
具體實施例方式
按照本發(fā)明的方法涉及對圖形屏面上的離散網(wǎng)格上的平行四邊形進行填充。所述方法同樣好地既適合于二維表示也適合于三維表示。以下僅就二維的情形作說明。然而,對于所屬領域的熟練人員來說,要將此情形擴展到三維,并無任何特別的困難。
圖1b表示按照本發(fā)明的一個僅僅根據(jù)對平行四邊形ABCD的第一頂點A、第二頂點B、第三頂點C和第四頂點D的了解而填充該平行四邊形該的例子。填充是通過以平行于第一線段AB的方式對平行四邊形ABCD進行連續(xù)掃描而實現(xiàn)的。
圖2a中以功能性方式表示了按照本發(fā)明的方法的一個例子。該方法包含計算第一線段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)}。
按照本發(fā)明的方法也包含計算第二線段AC上的點的坐標的步驟11和計算第三線段BD上的點的坐標的步驟12。
有益地,這個對坐標的計算是按照被稱為Bresenham算法或中點算法的算法進行的。這樣一個算法尤其使得描繪圖形屏面的離散網(wǎng)格中的傾斜線段成為可能。動詞“描繪”(trace)這里的意思是確定構成該傾斜線段的離散近似值的離散網(wǎng)格上的各點。
Bresenham算法的原理在圖3a和3b中表示。在圖3a中,表示了一個離散網(wǎng)格1,它由坐標系(Ox,Oy)標注并由傾斜線段2切割。算法過程如圖3b所示
—優(yōu)選方向的選擇。這個選擇與線段2的傾斜度的度量α有關。如果這個傾斜度小于45度,則選擇軸Ox,否則就是軸Oy。在圖2b的例子中,是軸Ox。
—從該線段的一端S1開始,沿優(yōu)選方向Ox的軸遞增坐標xs1。考察屬于線段2的使得xs=xs1+1的點S。這是一個確定網(wǎng)格1上哪個點最接近S的事情。兩個點是候選點位于S1的東北、使得xc1=xs1+1且Yc1=Ys1+1的點C1,以及位于S1的東邊、使得xc2=xs1+1且Yc2=Ys1的點E。
—考察線段C1C2的中點M,評估差Δ1=Yc1-yM和Δ2=y(tǒng)M-yc2。如果Δ1<Δ2,選擇C1作為點S的近似,否則,選擇C2作為點S的近似。
—對傾斜線段2上的所有的點重復該操作。獲得一個不連續(xù)的線3,這是在8種相關性(即考慮到一個點有8個相鄰點的關系)的意義上的一連串的相關點。
以下用C語言表示一個使用Bresenham算法來描繪一個線段的“劃線”(line)函數(shù)的實現(xiàn)的例子
static void line(int xi,int yi,int xf,int yf){ int dx,dy,i,xinc,yinc,cumul,x,y; x=xi; y=y(tǒng)i; dx=xf-xi; dy=y(tǒng)f-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+=y(tǒng)inc; } printf(″%d,%d\n″,x,y); } } else{ cumul=dy/2; for(i=1;i<=dy;i++){ y+=y(tǒng)inc; cumul+=dx; if(cumul>=dy){ cumul-=dy; x+=xinc; } printf(″%d,%d\n″,x,y); } } }
這個例子顯示這個算法的簡單性,該算法只用整數(shù)值,沒有乘法,被總結為幾行代碼。Bresenham算法很好地適合于以硬件來實現(xiàn)。
然而,本發(fā)明并不限于使用這個算法,而是涉及任何其它的描繪傾斜線段的方法。存在將一個單詞與此線段相關聯(lián)的線段描繪方法,這個單詞的計算是根據(jù)這個線段上兩個連續(xù)點之間的連接的Freeman碼的。Castle方法在Castle所著的文件“An application of Euclid’salgorithm to drawing straight lines”(應用歐幾里得算法繪直線)中描述(該文由Springer-Verlag出版在“Fundamental Algorithms inCoumputer Graphics”(計算機圖形的基本算法)中發(fā)表,見135-139頁)。這些方法的一個缺點是比實現(xiàn)Bresenham算法更復雜。
圖2b表示一個平行四邊形ABCD的例子,通過Bresenham算法描繪該平行四邊形的第一、第二和第三線段AB、AC和BD。在這個例子中,通過以橫軸Ax為優(yōu)選方向描繪第一線段AB,而第二和第三線段AC和BD則是通過以縱軸Ay為優(yōu)選方向而被描繪的。
在三個步驟11、12和13的結尾,第一、第二和第三線段AB、AC和BD的跡線是已知的。構成這三個線段的離散網(wǎng)格上的所有的點因此完全由它們在坐標系(Ax,Ay)中的坐標所確定。
最后,按照本發(fā)明的方法包含一個步驟20,它描繪平行于第一線段AB且包含在平行四邊形ABCD內的所有線段。
在由圖4中的功能示意圖描述并由圖2b中的例子例示的本發(fā)明第一實施例中,所述步驟20包含子步驟21,該子步驟計算一個被包含在屬于第二線段AC的點Ai與屬于第三線段BD的點Bi之間的線段的坐標,Ai和Bi位于分別與A和B的距離相等的位置。重復子步驟21,以便描繪位于平行四邊形ABCD內的并且分別在水平或垂直優(yōu)選方向上與A和B距離相等的所有線段AiBi。在圖2b的例子中,線段AC和BD的優(yōu)選方向是縱軸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)函數(shù)來填充一個平行四邊形的“平行四邊形”函數(shù)的實現(xiàn)的例子
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=y(tǒng)a; x_cd=xc; y_cd=y(tǒng)c; dx=xb-xa; dy=y(tǒng)b-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+=y(tǒng)inc; y_cd+=y(tǒng)inc; } line(x_ab,y_ab,x_cd,y_cd); printf(″\n″); } } else{ cumul=dy/2; for(i=1;i<=dy;i++){ y_ab+=y(tǒng)inc; y_cd+=y(tǒng)inc; 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″); } } }
本發(fā)明的這個第一實施例的一個優(yōu)點是它非常簡單。如下文所示的“平行四邊形”函數(shù)例子所顯示的那樣,Bresenham算法只使用整數(shù)值和限于加法和比較檢測的簡單運算。這樣一個算法因此與實時執(zhí)行相容并且和適合于硬件實現(xiàn),而這是例如生成視頻游戲所要求的。
本發(fā)明的這個第一實施例的一個缺點是不保證在平行四邊形中使用的離散網(wǎng)格上的所有各點的窮盡遍歷。這是因為Bresenham算法是以近似為基礎的,這會引起誤差。在圖3b中,線段2的點S的縱坐標ys被替換為整數(shù)縱坐標yc1所產(chǎn)生的誤差等于yc1-ys。在利用Bresenham算法生成幾個并排的傾斜點段的過程中,子步驟21累積這種類型的誤差,這意味著離散網(wǎng)格上的某些點盡管被包含在平行四邊形內,卻不在任何線段AiBi的跡線上。這樣的誤差由圖5例示。在點A1和B1之間被描繪的線段與在點A和B之間被描繪的線段之間,有未被平行四邊形ABCD的任何線段遍歷的點—盡管它們屬于平行四邊形ABCD。
在圖6中功能性地表示的本發(fā)明的第二實施例中,步驟20包含子步驟22,它在水平和垂直優(yōu)選方向上平移第一線段AB,以便提供一個包含在平行四邊形ABCD內的平移線段。這個平移子步驟22包含通過在水平和垂直優(yōu)選方向上平移而計算一個平行于第一線段AB的線段的坐標。圖7a表示在平行四邊形ABCD內沿軸Ax方向對線段AB進行橫向平移的例子。這樣的平移非常易于實現(xiàn)。事實上,考察在正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在優(yōu)選方向上的這樣的平移并不可能填充整個平行四邊形ABCD。在圖7a中,考察軸Ax與線段CD的相交的點H。由頂點ACH構成的三角形依然有待填充。為此,參看圖7b,考察通過把第三個頂點C在優(yōu)選方向Ax上投影到線段AB的延長線上而獲得的點E。步驟20還包含一個計算所述投影點E的坐標的子步驟24。這個計算可以用各種方式進行。第一個解決方案包含考察矢量和矢量
和
是平行的,滿足所屬技術領域的熟練人員周知的方程-xB·yE-yB·(-xE)=0。已知YE=YC,由于E是C沿軸Ax的投影,E的橫坐標等于XE=(XB.YC)YB。這個解決方案的一個優(yōu)點是根據(jù)非常簡單的關系。主要缺點是它使用除法,對于處理器上的計算循環(huán)而言這是非常昂貴的。作為替代,可以使用一個更符合算法的包含兩個步驟的方法。圖8中表示一個例子。第一步驟包含確定E在直線(AB)上的一個非最優(yōu)的位置ENO。該步驟具體如下
xENO=y(tǒng)ENO=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的點。
這個第二算法的一個優(yōu)點是不用除法。
步驟20然后包含一個計算由投影E和頂點A構成的線段EA各點的坐標的子步驟25。像前文為描繪傾斜線段而實現(xiàn)的步驟一樣,所述步驟25有利地使用Bresenham算法。
一個在優(yōu)選方向上平移線段EA的子步驟26,旨在提供與線段EA平行的線段EiA’i,所依據(jù)的原理類似于前文對平移線段AB的步驟22所描述的原理。與以前對線段AB相同的方式,將子步驟26與檢測步驟27結合,以檢測從EA平移的線段EiA’i上的點P是否包含在平行四邊形ABCD中。
線段AB和EA沿軸Ax以對應于線段AC的一個距離的連續(xù)平移,使得有可能遍歷平行四邊形ABCD上的所有點。這個第二算法的一個優(yōu)點是它提供對平行四邊形ABCD的完全的填充??梢哉J為用于執(zhí)行線段的平移以及檢測它的點是否包含在平行四邊形內的操作,與用于描繪兩個已知點之間的傾斜線段Bresenham算法所用的操作具有相同的復雜度。另一方面,計算投影點E的步驟使第二實施例比第一實施例更復雜一些。然而,如下面呈現(xiàn)的實現(xiàn)例子所示,第二實施例的實現(xiàn)依然相當簡單。
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(xiàn)_ok,F(xiàn)x,F(xiàn)y,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?。?)&&(Cx<Ax))‖ ((transHorizontal!=0)&&(Cy<Ay))){ E_ok=1; } else{<!-- SIPO <DP n="12"> --><dp n="d12"/> E_ok=0; } if(((transVertical!=0)&&(Cx>Ax))‖ ((transHorizontal?。?)&&(Cy>Ay))) F_ok=1; else F_ok=0; AB_x=Ax; AB_y=Ay; init(Ax,Ay,Bx,By,&AB_dx,&AB_dy,&AB_xinc,&AB_yinc, &AB_cumul,&AB_max,&AB_mode); for(AB_i=1;AB_i<=AB_max+1;AB i++){ if(transVertical!=0){ if((F_ok==1)&&(AB_x==Cx)){ Fx=Dx; Fy=By+(AB_y-Ay); } if((E_ok==1)&&(AB_x==Dx)){ Ex=Cx; Ey=Ay-(By-AB_y); } }else if((transHorizontal!=0)){ if((F_ok==1)&&(AB_y==Cy)){ Fx=Bx+(AB_x-Ax); Fy=Dy; } if((E_ok==1)&&(AB_y==Dy)){ Ex=Ax-(Bx-AB_x); Ey=Cy; } } next(AB_mode,AB_xinc,AB_yinc,AB_dx,AB_dy, &AB_cumul,&AB_x,&AB_y);<!-- SIPO <DP n="13"> --><dp n="d13"/> } // //在線段AC上的Bresenham AC_x=Ax; AC_y=Ay; init(Ax,Ay,Cx,Cy,&AC_dx,&AC_dy,&AC_xinc,&AC_yinc, &AC_cumul,&AC_max,&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,&EA_dx,&EA_dy,&EA_xinc,&EA_yinc, &EA_cumul,&EA_max,&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, &EA_cumul,&EA_x,&EA_y); } } //<!-- SIPO <DP n="14"> --><dp n="d14"/> //在線段AB上的Bresenham AB_x=Ax; AB_y=Ay; init(Ax,Ay,Bx,By,&AB_dx,&AB_dy,&AB_xinc,&AB_inc, &AB_cumul,&AB_max,&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, &AB_cumul,&AB_x,&AB_y); } // //在線段BF上的Bresenham if(F_ok==1){ BF_x=Bx; BF_y=By; init(Bx,By,F(xiàn)x,F(xiàn)y,&BF_dx,&BF_dy,&BF_xinc,&BF_yinc, &BF_cumul,&BF_max,&BF_mode); for(BF_i=1;BF_i<=BF_max+1;BF_i++){ next(BF_mode,BF_xinc,BF_yinc,BF_dx,BF_dy, &BF_cumul,&BF_x,&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, &AC_cumul,&AC_x,&AC_y); } }
有可能通過適當編程的電路實現(xiàn)按照本發(fā)明的處理方法。在程序存儲器中含有的計算機程序可使該電路執(zhí)行以上參照圖4和6所述的各種操作。也可以通過讀取含有所述程序的諸如盤的數(shù)據(jù)介質,將該計算機程序裝入程序存儲器。這種讀取也可以通過諸如因特網(wǎng)的通信網(wǎng)絡而進行。在這種情況下,服務提供商將使計算機程序以可下載信號的形式提供給感興趣的當事方。
本發(fā)明不限于剛剛通過舉例所說明的實施例。在本發(fā)明的范圍內可以對它們作出各種修改和改進。特別地,可以使用其它成像方式,諸如磁共振成像和正電子放射斷層攝影術。在本文的語境中,動詞“包含”被用來表示不排除對其它元素、裝置或步驟的使用。
權利要求
1.一種填充包含第一頂點(A)、第二頂點(B)、第三頂點(C)和第四頂點(D)的平行四邊形(ABCD)的方法,所述方法包含
-計算第一頂點(A)與第二頂點(B)之間的第一線段(AB)上的各點的坐標的步驟(10);
-計算第一頂點(A)與第三頂點(C)之間的第二線段(AC)上的各點的坐標的步驟(11);
-計算第二頂點(B)與第四頂點(D)之間的第三線段(BD)上的各點的坐標的步驟(12);
-計算一個平行于第一線段AB并且被包含在平行四邊形ABCD內的線段上的各點的坐標的循環(huán)步驟(20)。
2.如權利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計算平行于第一線段AB的線段上的各點的坐標的循環(huán)步驟(20)還包含子步驟(21),該子步驟計算一個在屬于第二線段(AC)的點(Ai)與屬于第三線段(BD)的點(Bi)之間的線段上的各點的坐標,點(Ai)和(Bi)分別位于在水平(Ax)或垂直(Ay)優(yōu)選方向上與第一頂點(A)和第二頂點(B)的相同距離的位置上。
3.如權利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計算平行于第一線段AB的線段的坐標的循環(huán)步驟(20)包含子步驟(22)和檢測子步驟(23),子步驟(22)在水平或垂直優(yōu)選方向上平移第一線段(AB),旨在提供一個被包含在平行四邊形(ABCD)內的平移線段A’iB’i;檢測子步驟(23)旨在檢測平移線段A’iB’i上的點(P)是否被包含在平行四邊形(ABCD)內。
4.如權利要求3中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計算平行于第一線段AB的線段上的各點的坐標的循環(huán)步驟(20)還包含
-子步驟(24),計算第三頂點(C)在第一線段(AB)的延長線上并平行于優(yōu)選方向的一個投影(E)的坐標;
-子步驟(25),計算由投影(E)和第一頂點(A)構成的線段(EA)的點的坐標;
-子步驟(26),在優(yōu)選方向上平移線段(EA),旨在提供與線段(EA)平行的線段(EiA’i);
-子步驟(27),旨在檢測從(EA)平移的線段(EiA’i)上的點(P)是否被包含在平行四邊形(ABCD)內。
5.如權利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計算線段上的各點的坐標的各步驟使用中點算法。
6.一種用于描繪和填充圖形屏面的平行四邊形(ABCD)、旨在從第一頂點(A)、第二頂點(B)、第三頂點(C)和第四頂點(D)的坐標提供被包含在平行四邊形中的各點坐標的系統(tǒng),所述系統(tǒng)包含
-用于計算第一頂點A與第二頂點B之間的第一線段上的各點的坐標的裝置(10);
-用于計算第一頂點A與第三頂點C之間的第二線段上的各點的坐標的裝置(11);
-用于計算第二頂點B與第四頂點D之間的第三線段上的各點的坐標的裝置(12);
-用于計算平行于第一線段AB并且被包含在平行四邊形ABCD內的線段各點的坐標的循環(huán)裝置(20)。
7.一種計算機程序產(chǎn)品,包含一個指令集,當它們被加載到一個電路中時,使該電路執(zhí)行如權利要求1中所要求的方法。
全文摘要
本發(fā)明涉及一種根據(jù)對平行四邊形(ABCD)的頂點的了解以描繪和填充在圖形屏面的離散網(wǎng)格上的平行四邊形(ABCD)的方法,該平行四邊形包含第一頂點(A)、第二頂點(B)、第三頂點(C)和第四頂點(D)。按照本發(fā)明的方法包含計算第一頂點(A)與第二頂點(B)之間的第一線段(AB)上的各點的坐標的步驟(10);計算第一頂點(A)與第三頂點(C)之間的第二線段(AC)上的各點的坐標的步驟(11);計算第二頂點(B)與第四頂點(D)之間的第三線段(BD)上的各點的坐標的步驟(12);計算平行于第一線段AB并且被包含在平行四邊形ABCD內的線段上的各點的坐標的循環(huán)步驟(20)。有利地,所述計算線段上的各點的坐標的各步驟使用所謂的中點算法或Bresenham算法。
文檔編號G06T11/40GK1777917SQ20048001095
公開日2006年5月24日 申請日期2004年4月15日 優(yōu)先權日2003年4月24日
發(fā)明者Q·趙, L·帕斯奎爾, M·杜蘭頓 申請人:皇家飛利浦電子股份有限公司