午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

用于填充平行四邊形的方法和系統(tǒng)的制作方法

文檔序號(hào):6482762閱讀:328來(lái)源:國(guó)知局
專利名稱:用于填充平行四邊形的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及填充平行四邊形的方法。本發(fā)明也涉及實(shí)現(xiàn)這樣一個(gè)方法的系統(tǒng)。最后,本發(fā)明涉及實(shí)現(xiàn)這樣一個(gè)方法的計(jì)算機(jī)程序。
本發(fā)明特別適用于圖像合成、二維或三維視頻游戲以及按照MPEG-4標(biāo)準(zhǔn)的視頻對(duì)象處理等領(lǐng)域。
背景技術(shù)
在視頻游戲領(lǐng)域以及更一般地在圖像合成領(lǐng)域,提出了一個(gè)問題,即在一個(gè)圖形屏面上顯示所關(guān)心的具有或多或少地復(fù)雜的形狀的對(duì)象,該圖形屏面包含點(diǎn)地離散網(wǎng)格—這些點(diǎn)在二維空間中通常被稱作像素,在三維空間中被稱作三維像素。為此,將所關(guān)心的對(duì)象分解成基本的形式(一般是三角形),根據(jù)對(duì)它們的頂點(diǎn)的坐標(biāo)的了解,在屏面上的離散網(wǎng)格上描繪和填充它們,向它們分配一個(gè)紋理值。因此,一個(gè)問題是使離散網(wǎng)格上的一個(gè)點(diǎn)對(duì)應(yīng)于具有非整數(shù)實(shí)坐標(biāo)的基本形狀上的一個(gè)點(diǎn)。已經(jīng)開發(fā)了用于管理這個(gè)問題的技術(shù),大多數(shù)都是根據(jù)所謂的“中點(diǎn)”算法或Bresenham算法的原理。這個(gè)算法最初是由Jack E.Bresenham的文件“Algorithm for Computer Control of aDigital Plotter”(數(shù)字繪圖儀的計(jì)算機(jī)控制算法)公開的,1965公布于IBM System Journal,卷4(1),25-30頁(yè)上。該算法尤其使得有可能快速有效地描繪傾斜線段。這樣一個(gè)算法被廣泛用于圖像合成領(lǐng)域。所屬技術(shù)領(lǐng)域的人員也熟知的其他技術(shù),后來(lái)從這個(gè)算法中衍生出來(lái),用于填充三角形甚至多邊形。
這些技術(shù)的共同特點(diǎn)是,提出通過水平或垂直掃描來(lái)填充三角形、甚至多邊形。一類很適合于這樣一個(gè)掃描的三角形是包含直線段的三角形,就是說,水平的或垂直的。

圖1表示一個(gè)三角形IJK,它的線段JK是水平的。在這個(gè)情況中,這樣一個(gè)三角形的填充包含以下步驟
—按照Bresenham算法描繪線段IJ的步驟。這個(gè)步驟旨在計(jì)算一個(gè)坐標(biāo)系(Jx,Jy)中的線段IJ的點(diǎn)Ji的坐標(biāo)。知道這些坐標(biāo),就有可能描繪這些點(diǎn)并向它們分配紋理值;
—按照Bresenham算法描繪線段IK的步驟。這個(gè)步驟旨在計(jì)算一個(gè)坐標(biāo)系(Jx,Jy)中的線段IK的點(diǎn)Ki的坐標(biāo);
—水平掃描三角形IJK的步驟,旨在行進(jìn)通過包含該三角形的有關(guān)區(qū)域RI;
—利用線段IJ和IK的點(diǎn)的坐標(biāo)以檢測(cè)所述區(qū)域RI上的某點(diǎn)是否屬于三角形IJK的檢測(cè)步驟。例如,位于線段JiKi上的點(diǎn)P,如果它的橫坐標(biāo)XP滿足XJi<XP<XKj,則該點(diǎn)屬于三角形IJK。
這個(gè)方法的一個(gè)優(yōu)點(diǎn)是速度快、復(fù)雜度低。這是因?yàn)?,Bresenham算法只用整數(shù)和加法就能實(shí)現(xiàn),因此很適合于硬件實(shí)現(xiàn),這在視頻游戲領(lǐng)域中是特別有益的。這是因?yàn)?,在這個(gè)領(lǐng)域中,所關(guān)心的對(duì)象經(jīng)受越來(lái)越復(fù)雜的處理,為了實(shí)時(shí)地被執(zhí)行,處理是由為提高諸如描繪兩個(gè)已知點(diǎn)之間的傾斜線段的常見計(jì)算而專門設(shè)計(jì)的處理器執(zhí)行的。
這樣的方法也有益地用于視頻壓縮領(lǐng)域,特別是通過MPEG-4標(biāo)準(zhǔn)(動(dòng)畫專家組)進(jìn)行視頻壓縮的領(lǐng)域。這是因?yàn)?,這個(gè)標(biāo)準(zhǔn)具有獨(dú)立于視頻序列的背景之外來(lái)考慮視頻序列中所關(guān)心的對(duì)象的特性。這樣一個(gè)對(duì)象包含被單獨(dú)編碼的形狀和紋理。這個(gè)形狀是通過一般是矩形的圍框(bounding box)而編碼的。圍框內(nèi)的這個(gè)形狀的填充也用Bresenham算法進(jìn)行。
然而,很清楚,盡管視頻游戲場(chǎng)景中所關(guān)心的對(duì)象總是能被分解成以三角形相拼的圖案,但視頻場(chǎng)景中常常含有大量的平行四邊形。這是因?yàn)?,在二維中非常普遍的矩形形狀,將在三維中的透視視圖中變成為平行四邊形。
在MPEG-4標(biāo)準(zhǔn)中使用的圍框受相同類型的變形,在透視視圖中變成平行四邊形。
盡管具有一個(gè)直線段的二個(gè)三角形足以描述一個(gè)矩形,對(duì)于平行四邊形來(lái)說則至少必須有四個(gè)三角形。因此,平行四邊形由四個(gè)三角形的描述和這些三角形的連接來(lái)表示。當(dāng)在圖形屏面上描繪和填充這個(gè)平行四邊形時(shí),這樣一個(gè)表示是復(fù)雜的,對(duì)存儲(chǔ)空間而言是昂貴的,并且不是非常實(shí)用。

發(fā)明內(nèi)容
本發(fā)明的目的是提出一種以更簡(jiǎn)單快捷的方式、只用這四個(gè)頂點(diǎn)的坐標(biāo)來(lái)描繪和填充平行四邊形的解決方案。
這個(gè)目的是通過對(duì)一個(gè)包含第一頂點(diǎn)、第二頂點(diǎn)、第三頂點(diǎn)和第四頂點(diǎn)的平行四邊形進(jìn)行填充的方法實(shí)現(xiàn)的,該方法包含
—計(jì)算第一頂點(diǎn)與第二頂點(diǎn)之間的第一線段的坐標(biāo)的步驟;
—計(jì)算第一頂點(diǎn)與第三頂點(diǎn)之間的第二線段的坐標(biāo)的步驟;
—計(jì)算第二頂點(diǎn)與第四頂點(diǎn)之間的第三線段的坐標(biāo)的步驟;
—計(jì)算平行于第一線段并且被包含在平行四邊形內(nèi)的線段的坐標(biāo)的循環(huán)步驟。
按照本發(fā)明的方法使得有可能根據(jù)一個(gè)平行四邊形的四個(gè)頂點(diǎn)的坐標(biāo)計(jì)算位于平行四邊形內(nèi)各點(diǎn)的坐標(biāo),并因此描繪和填充平行四邊形而無(wú)需將其分解成若干個(gè)三角形。所述方法包含描繪平行四邊形的第一線段,然后描繪互相平行并且位于第一線段的各側(cè)的第二和第三線段,最后描繪包含在第二和第三線段之間的、第一線段的所有可能的平行線。
在第一實(shí)施例中,計(jì)算與第一線段平行的線段的坐標(biāo)的循環(huán)步驟,包含選擇第二線段上的一個(gè)點(diǎn)和第三線段上的一個(gè)點(diǎn),使得這兩點(diǎn)分別位于在優(yōu)選的水平或垂直方向上離第一和第二頂點(diǎn)相等距離的位置,并計(jì)算位于這兩點(diǎn)之間的線段各點(diǎn)的坐標(biāo)。
計(jì)算線段上各點(diǎn)的坐標(biāo)的各個(gè)步驟,有利地使用Bresenham算法—也稱中點(diǎn)算法,因?yàn)樗沟糜锌赡芎?jiǎn)單快捷地描繪兩點(diǎn)之間的傾斜線段。
按照本發(fā)明的方法通過只要根據(jù)對(duì)平行四邊形的四個(gè)頂點(diǎn)的了解而提供平行四邊形中包含的點(diǎn)的坐標(biāo),避免了將平行四邊形分解成三角形,并使得有可能節(jié)省存儲(chǔ)空間。這是因?yàn)?,只有四個(gè)頂點(diǎn)的坐標(biāo),而不是所有三角形的頂點(diǎn)以及平行四邊形內(nèi)的這些三角形的連接的表示,必須被存儲(chǔ)在存儲(chǔ)器中。
在第二實(shí)施例中,計(jì)算與第一線段平行的線段的坐標(biāo)的循環(huán)步驟,包含在平行四邊形內(nèi)以一定的增量在一個(gè)優(yōu)選方向上平移第一線段。知道了這個(gè)增量,就能容易地從第一線段的點(diǎn)的坐標(biāo)推導(dǎo)出所獲得的平移線段上的點(diǎn)的坐標(biāo)。繼續(xù)這個(gè)操作,以便覆蓋平行四邊形的整個(gè)表面。
第二實(shí)施例的一個(gè)主要優(yōu)點(diǎn)是提供平行四邊形的徹底填充,就是說沒有任何漏洞(hole)。平移一個(gè)線段不導(dǎo)致任何誤差積累。相反,處于并排位置的平移線段完美結(jié)合,因?yàn)樗鼈兪峭瑯拥摹?br> 附圖簡(jiǎn)介
現(xiàn)在將參照附圖中的實(shí)施例的例子進(jìn)一步本發(fā)明,然而本發(fā)明并不受限于這些附圖。
圖1a表示按照現(xiàn)有技術(shù)的對(duì)具有一條直邊的三角形的填充;
圖1b表示按照本發(fā)明的對(duì)平行四邊形的填充;
圖2a表示按照本發(fā)明的對(duì)平行四邊形的填充的方法的功能示意圖2b表示按照本發(fā)明第一實(shí)施例填充平行四邊形的例子;
圖3a和3b表示用于描繪離散網(wǎng)格上的傾斜線段Bresenham算法的原理;
圖4表示本發(fā)明第一實(shí)施例的功能示意圖5表示在按照本發(fā)明第一實(shí)施例的對(duì)平行四邊形填充期間漏洞的形成;
圖6表示本發(fā)明第二實(shí)施例的功能示意圖7a和7b表示按照本發(fā)明第二實(shí)施例填充平行四邊形的例子;
圖8表示按照本發(fā)明第二實(shí)施例計(jì)算點(diǎn)E的坐標(biāo)的方法的原理。
具體實(shí)施例方式
按照本發(fā)明的方法涉及對(duì)圖形屏面上的離散網(wǎng)格上的平行四邊形進(jìn)行填充。所述方法同樣好地既適合于二維表示也適合于三維表示。以下僅就二維的情形作說明。然而,對(duì)于所屬領(lǐng)域的熟練人員來(lái)說,要將此情形擴(kuò)展到三維,并無(wú)任何特別的困難。
圖1b表示按照本發(fā)明的一個(gè)僅僅根據(jù)對(duì)平行四邊形ABCD的第一頂點(diǎn)A、第二頂點(diǎn)B、第三頂點(diǎn)C和第四頂點(diǎn)D的了解而填充該平行四邊形該的例子。填充是通過以平行于第一線段AB的方式對(duì)平行四邊形ABCD進(jìn)行連續(xù)掃描而實(shí)現(xiàn)的。
圖2a中以功能性方式表示了按照本發(fā)明的方法的一個(gè)例子。該方法包含計(jì)算第一線段AB的點(diǎn)的坐標(biāo)的步驟10。為了文字的簡(jiǎn)化,以下把術(shù)語(yǔ)AB給予在一個(gè)以第一頂點(diǎn)A為原點(diǎn)的坐標(biāo)系(Ax,Ay)中的線段AB各點(diǎn)的所有坐標(biāo){(XA,YA)(X1,Y1),(X2,Y2),...,(XB,YB)}。由第一線段AB上各點(diǎn)構(gòu)成的集合因此被表達(dá)為AB={(0,0)(X1,Y1),(X2,Y2),...,(XB,YB)}。
按照本發(fā)明的方法也包含計(jì)算第二線段AC上的點(diǎn)的坐標(biāo)的步驟11和計(jì)算第三線段BD上的點(diǎn)的坐標(biāo)的步驟12。
有益地,這個(gè)對(duì)坐標(biāo)的計(jì)算是按照被稱為Bresenham算法或中點(diǎn)算法的算法進(jìn)行的。這樣一個(gè)算法尤其使得描繪圖形屏面的離散網(wǎng)格中的傾斜線段成為可能。動(dòng)詞“描繪”(trace)這里的意思是確定構(gòu)成該傾斜線段的離散近似值的離散網(wǎng)格上的各點(diǎn)。
Bresenham算法的原理在圖3a和3b中表示。在圖3a中,表示了一個(gè)離散網(wǎng)格1,它由坐標(biāo)系(Ox,Oy)標(biāo)注并由傾斜線段2切割。算法過程如圖3b所示
—優(yōu)選方向的選擇。這個(gè)選擇與線段2的傾斜度的度量α有關(guān)。如果這個(gè)傾斜度小于45度,則選擇軸Ox,否則就是軸Oy。在圖2b的例子中,是軸Ox。
—從該線段的一端S1開始,沿優(yōu)選方向Ox的軸遞增坐標(biāo)xs1??疾鞂儆诰€段2的使得xs=xs1+1的點(diǎn)S。這是一個(gè)確定網(wǎng)格1上哪個(gè)點(diǎn)最接近S的事情。兩個(gè)點(diǎn)是候選點(diǎn)位于S1的東北、使得xc1=xs1+1且Yc1=Y(jié)s1+1的點(diǎn)C1,以及位于S1的東邊、使得xc2=xs1+1且Yc2=Y(jié)s1的點(diǎn)E。
—考察線段C1C2的中點(diǎn)M,評(píng)估差Δ1=Y(jié)c1-yM和Δ2=y(tǒng)M-yc2。如果Δ1<Δ2,選擇C1作為點(diǎn)S的近似,否則,選擇C2作為點(diǎn)S的近似。
—對(duì)傾斜線段2上的所有的點(diǎn)重復(fù)該操作。獲得一個(gè)不連續(xù)的線3,這是在8種相關(guān)性(即考慮到一個(gè)點(diǎn)有8個(gè)相鄰點(diǎn)的關(guān)系)的意義上的一連串的相關(guān)點(diǎn)。
以下用C語(yǔ)言表示一個(gè)使用Bresenham算法來(lái)描繪一個(gè)線段的“劃線”(line)函數(shù)的實(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);   }   }  }
這個(gè)例子顯示這個(gè)算法的簡(jiǎn)單性,該算法只用整數(shù)值,沒有乘法,被總結(jié)為幾行代碼。Bresenham算法很好地適合于以硬件來(lái)實(shí)現(xiàn)。
然而,本發(fā)明并不限于使用這個(gè)算法,而是涉及任何其它的描繪傾斜線段的方法。存在將一個(gè)單詞與此線段相關(guān)聯(lián)的線段描繪方法,這個(gè)單詞的計(jì)算是根據(jù)這個(gè)線段上兩個(gè)連續(xù)點(diǎn)之間的連接的Freeman碼的。Castle方法在Castle所著的文件“An application of Euclid’salgorithm to drawing straight lines”(應(yīng)用歐幾里得算法繪直線)中描述(該文由Springer-Verlag出版在“Fundamental Algorithms inCoumputer Graphics”(計(jì)算機(jī)圖形的基本算法)中發(fā)表,見135-139頁(yè))。這些方法的一個(gè)缺點(diǎn)是比實(shí)現(xiàn)Bresenham算法更復(fù)雜。
圖2b表示一個(gè)平行四邊形ABCD的例子,通過Bresenham算法描繪該平行四邊形的第一、第二和第三線段AB、AC和BD。在這個(gè)例子中,通過以橫軸Ax為優(yōu)選方向描繪第一線段AB,而第二和第三線段AC和BD則是通過以縱軸Ay為優(yōu)選方向而被描繪的。
在三個(gè)步驟11、12和13的結(jié)尾,第一、第二和第三線段AB、AC和BD的跡線是已知的。構(gòu)成這三個(gè)線段的離散網(wǎng)格上的所有的點(diǎn)因此完全由它們?cè)谧鴺?biāo)系(Ax,Ay)中的坐標(biāo)所確定。
最后,按照本發(fā)明的方法包含一個(gè)步驟20,它描繪平行于第一線段AB且包含在平行四邊形ABCD內(nèi)的所有線段。
在由圖4中的功能示意圖描述并由圖2b中的例子例示的本發(fā)明第一實(shí)施例中,所述步驟20包含子步驟21,該子步驟計(jì)算一個(gè)被包含在屬于第二線段AC的點(diǎn)Ai與屬于第三線段BD的點(diǎn)Bi之間的線段的坐標(biāo),Ai和Bi位于分別與A和B的距離相等的位置。重復(fù)子步驟21,以便描繪位于平行四邊形ABCD內(nèi)的并且分別在水平或垂直優(yōu)選方向上與A和B距離相等的所有線段AiBi。在圖2b的例子中,線段AC和BD的優(yōu)選方向是縱軸Ay。從xA開始,第二線段AC的點(diǎn)A1和第三線段BD的相應(yīng)點(diǎn)B1是這樣考慮的,以便使YA1=Y(jié)A+1和使YB1=Y(jié)B+1。第二和第三線段AC和BD是平行的,點(diǎn)A1和B1沿軸Ay分別與A和B距離相等。
有利地,子步驟21用Bresenham算法計(jì)算線段A1B1上的點(diǎn)的坐標(biāo)。對(duì)YAi≤yC的所有線段AiBi重復(fù)這個(gè)操作,就是說,一直到所有的平行四邊形被遍歷。
下面表示一個(gè)旨在用前面描述“劃線”(line)函數(shù)來(lái)填充一個(gè)平行四邊形的“平行四邊形”函數(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ā)明的這個(gè)第一實(shí)施例的一個(gè)優(yōu)點(diǎn)是它非常簡(jiǎn)單。如下文所示的“平行四邊形”函數(shù)例子所顯示的那樣,Bresenham算法只使用整數(shù)值和限于加法和比較檢測(cè)的簡(jiǎn)單運(yùn)算。這樣一個(gè)算法因此與實(shí)時(shí)執(zhí)行相容并且和適合于硬件實(shí)現(xiàn),而這是例如生成視頻游戲所要求的。
本發(fā)明的這個(gè)第一實(shí)施例的一個(gè)缺點(diǎn)是不保證在平行四邊形中使用的離散網(wǎng)格上的所有各點(diǎn)的窮盡遍歷。這是因?yàn)锽resenham算法是以近似為基礎(chǔ)的,這會(huì)引起誤差。在圖3b中,線段2的點(diǎn)S的縱坐標(biāo)ys被替換為整數(shù)縱坐標(biāo)yc1所產(chǎn)生的誤差等于yc1-ys。在利用Bresenham算法生成幾個(gè)并排的傾斜點(diǎn)段的過程中,子步驟21累積這種類型的誤差,這意味著離散網(wǎng)格上的某些點(diǎn)盡管被包含在平行四邊形內(nèi),卻不在任何線段AiBi的跡線上。這樣的誤差由圖5例示。在點(diǎn)A1和B1之間被描繪的線段與在點(diǎn)A和B之間被描繪的線段之間,有未被平行四邊形ABCD的任何線段遍歷的點(diǎn)—盡管它們屬于平行四邊形ABCD。
在圖6中功能性地表示的本發(fā)明的第二實(shí)施例中,步驟20包含子步驟22,它在水平和垂直優(yōu)選方向上平移第一線段AB,以便提供一個(gè)包含在平行四邊形ABCD內(nèi)的平移線段。這個(gè)平移子步驟22包含通過在水平和垂直優(yōu)選方向上平移而計(jì)算一個(gè)平行于第一線段AB的線段的坐標(biāo)。圖7a表示在平行四邊形ABCD內(nèi)沿軸Ax方向?qū)€段AB進(jìn)行橫向平移的例子。這樣的平移非常易于實(shí)現(xiàn)。事實(shí)上,考察在正x的方向上被橫向平移一個(gè)單位的線段A’1B’1。這簡(jiǎn)單地得出XA’1=XA+1且YA’1=Y(jié)A。這樣,所有可能的平移線段A’iB’i例如XA<XA’≤XC都被描繪。形成了平行四邊形6。只有屬于平行四邊形6與平行四邊形ABCD共有的表面5的各點(diǎn)必須被考慮。為此,步驟20包含一個(gè)旨在檢測(cè)A’iB’i上的點(diǎn)P是否屬于平行四邊形ABCD的子步驟23。所述步驟包含確認(rèn)點(diǎn)P的縱坐標(biāo)Xp小于線段BD的點(diǎn)Bi的縱坐標(biāo)YBi,XBi=XB+(XAi-XA’i)。如圖7a所示,第一線段AB在優(yōu)選方向上的這樣的平移并不可能填充整個(gè)平行四邊形ABCD。在圖7a中,考察軸Ax與線段CD的相交的點(diǎn)H。由頂點(diǎn)ACH構(gòu)成的三角形依然有待填充。為此,參看圖7b,考察通過把第三個(gè)頂點(diǎn)C在優(yōu)選方向Ax上投影到線段AB的延長(zhǎng)線上而獲得的點(diǎn)E。步驟20還包含一個(gè)計(jì)算所述投影點(diǎn)E的坐標(biāo)的子步驟24。這個(gè)計(jì)算可以用各種方式進(jìn)行。第一個(gè)解決方案包含考察矢量和矢量

是平行的,滿足所屬技術(shù)領(lǐng)域的熟練人員周知的方程-xB·yE-yB·(-xE)=0。已知YE=Y(jié)C,由于E是C沿軸Ax的投影,E的橫坐標(biāo)等于XE=(XB.YC)YB。這個(gè)解決方案的一個(gè)優(yōu)點(diǎn)是根據(jù)非常簡(jiǎn)單的關(guān)系。主要缺點(diǎn)是它使用除法,對(duì)于處理器上的計(jì)算循環(huán)而言這是非常昂貴的。作為替代,可以使用一個(gè)更符合算法的包含兩個(gè)步驟的方法。圖8中表示一個(gè)例子。第一步驟包含確定E在直線(AB)上的一個(gè)非最優(yōu)的位置ENO。該步驟具體如下
xENO=y(tǒng)ENO=0;
do{
xENo+=-|xB-xA|;
yENO+=1|yB-yA|;
}
while(|yENO|≤|yC|);
考察關(guān)于點(diǎn)A與點(diǎn)B對(duì)稱的點(diǎn)E’。如果這個(gè)點(diǎn)E’的縱坐標(biāo)在絕對(duì)值上大于C的縱坐標(biāo),則取ENO等于點(diǎn)E’,否則考察關(guān)于點(diǎn)A與點(diǎn)E’對(duì)稱的點(diǎn)E”,依此類推,直到滿足條件|yENO|≤|yC|。
第二步驟包含通過按照Bresenham算法確定線段ENOA的點(diǎn)的坐標(biāo)來(lái)精選點(diǎn)E在直線(AB)上的位置。從A開始,這只是個(gè)遍歷遠(yuǎn)至點(diǎn)E的線段AENO的問題,就是說,遠(yuǎn)至線段ENOA上的、縱坐標(biāo)等于yc的點(diǎn)。
這個(gè)第二算法的一個(gè)優(yōu)點(diǎn)是不用除法。
步驟20然后包含一個(gè)計(jì)算由投影E和頂點(diǎn)A構(gòu)成的線段EA各點(diǎn)的坐標(biāo)的子步驟25。像前文為描繪傾斜線段而實(shí)現(xiàn)的步驟一樣,所述步驟25有利地使用Bresenham算法。
一個(gè)在優(yōu)選方向上平移線段EA的子步驟26,旨在提供與線段EA平行的線段EiA’i,所依據(jù)的原理類似于前文對(duì)平移線段AB的步驟22所描述的原理。與以前對(duì)線段AB相同的方式,將子步驟26與檢測(cè)步驟27結(jié)合,以檢測(cè)從EA平移的線段EiA’i上的點(diǎn)P是否包含在平行四邊形ABCD中。
線段AB和EA沿軸Ax以對(duì)應(yīng)于線段AC的一個(gè)距離的連續(xù)平移,使得有可能遍歷平行四邊形ABCD上的所有點(diǎn)。這個(gè)第二算法的一個(gè)優(yōu)點(diǎn)是它提供對(duì)平行四邊形ABCD的完全的填充。可以認(rèn)為用于執(zhí)行線段的平移以及檢測(cè)它的點(diǎn)是否包含在平行四邊形內(nèi)的操作,與用于描繪兩個(gè)已知點(diǎn)之間的傾斜線段Bresenham算法所用的操作具有相同的復(fù)雜度。另一方面,計(jì)算投影點(diǎn)E的步驟使第二實(shí)施例比第一實(shí)施例更復(fù)雜一些。然而,如下面呈現(xiàn)的實(shí)現(xiàn)例子所示,第二實(shí)施例的實(shí)現(xiàn)依然相當(dāng)簡(jiǎ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?。?)&amp;&amp;(Cx<Ax))‖  ((transHorizontal?。?)&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,F(xiàn)x,F(xiàn)y,&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);   }  }
有可能通過適當(dāng)編程的電路實(shí)現(xiàn)按照本發(fā)明的處理方法。在程序存儲(chǔ)器中含有的計(jì)算機(jī)程序可使該電路執(zhí)行以上參照?qǐng)D4和6所述的各種操作。也可以通過讀取含有所述程序的諸如盤的數(shù)據(jù)介質(zhì),將該計(jì)算機(jī)程序裝入程序存儲(chǔ)器。這種讀取也可以通過諸如因特網(wǎng)的通信網(wǎng)絡(luò)而進(jìn)行。在這種情況下,服務(wù)提供商將使計(jì)算機(jī)程序以可下載信號(hào)的形式提供給感興趣的當(dāng)事方。
本發(fā)明不限于剛剛通過舉例所說明的實(shí)施例。在本發(fā)明的范圍內(nèi)可以對(duì)它們作出各種修改和改進(jìn)。特別地,可以使用其它成像方式,諸如磁共振成像和正電子放射斷層攝影術(shù)。在本文的語(yǔ)境中,動(dòng)詞“包含”被用來(lái)表示不排除對(duì)其它元素、裝置或步驟的使用。
權(quán)利要求
1.一種填充包含第一頂點(diǎn)(A)、第二頂點(diǎn)(B)、第三頂點(diǎn)(C)和第四頂點(diǎn)(D)的平行四邊形(ABCD)的方法,所述方法包含
-計(jì)算第一頂點(diǎn)(A)與第二頂點(diǎn)(B)之間的第一線段(AB)上的各點(diǎn)的坐標(biāo)的步驟(10);
-計(jì)算第一頂點(diǎn)(A)與第三頂點(diǎn)(C)之間的第二線段(AC)上的各點(diǎn)的坐標(biāo)的步驟(11);
-計(jì)算第二頂點(diǎn)(B)與第四頂點(diǎn)(D)之間的第三線段(BD)上的各點(diǎn)的坐標(biāo)的步驟(12);
-計(jì)算一個(gè)平行于第一線段AB并且被包含在平行四邊形ABCD內(nèi)的線段上的各點(diǎn)的坐標(biāo)的循環(huán)步驟(20)。
2.如權(quán)利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計(jì)算平行于第一線段AB的線段上的各點(diǎn)的坐標(biāo)的循環(huán)步驟(20)還包含子步驟(21),該子步驟計(jì)算一個(gè)在屬于第二線段(AC)的點(diǎn)(Ai)與屬于第三線段(BD)的點(diǎn)(Bi)之間的線段上的各點(diǎn)的坐標(biāo),點(diǎn)(Ai)和(Bi)分別位于在水平(Ax)或垂直(Ay)優(yōu)選方向上與第一頂點(diǎn)(A)和第二頂點(diǎn)(B)的相同距離的位置上。
3.如權(quán)利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計(jì)算平行于第一線段AB的線段的坐標(biāo)的循環(huán)步驟(20)包含子步驟(22)和檢測(cè)子步驟(23),子步驟(22)在水平或垂直優(yōu)選方向上平移第一線段(AB),旨在提供一個(gè)被包含在平行四邊形(ABCD)內(nèi)的平移線段A’iB’i;檢測(cè)子步驟(23)旨在檢測(cè)平移線段A’iB’i上的點(diǎn)(P)是否被包含在平行四邊形(ABCD)內(nèi)。
4.如權(quán)利要求3中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計(jì)算平行于第一線段AB的線段上的各點(diǎn)的坐標(biāo)的循環(huán)步驟(20)還包含
-子步驟(24),計(jì)算第三頂點(diǎn)(C)在第一線段(AB)的延長(zhǎng)線上并平行于優(yōu)選方向的一個(gè)投影(E)的坐標(biāo);
-子步驟(25),計(jì)算由投影(E)和第一頂點(diǎn)(A)構(gòu)成的線段(EA)的點(diǎn)的坐標(biāo);
-子步驟(26),在優(yōu)選方向上平移線段(EA),旨在提供與線段(EA)平行的線段(EiA’i);
-子步驟(27),旨在檢測(cè)從(EA)平移的線段(EiA’i)上的點(diǎn)(P)是否被包含在平行四邊形(ABCD)內(nèi)。
5.如權(quán)利要求1中所要求的填充平行四邊形(ABCD)的方法,特征在于,所述計(jì)算線段上的各點(diǎn)的坐標(biāo)的各步驟使用中點(diǎn)算法。
6.一種用于描繪和填充圖形屏面的平行四邊形(ABCD)、旨在從第一頂點(diǎn)(A)、第二頂點(diǎn)(B)、第三頂點(diǎn)(C)和第四頂點(diǎn)(D)的坐標(biāo)提供被包含在平行四邊形中的各點(diǎn)坐標(biāo)的系統(tǒng),所述系統(tǒng)包含
-用于計(jì)算第一頂點(diǎn)A與第二頂點(diǎn)B之間的第一線段上的各點(diǎn)的坐標(biāo)的裝置(10);
-用于計(jì)算第一頂點(diǎn)A與第三頂點(diǎn)C之間的第二線段上的各點(diǎn)的坐標(biāo)的裝置(11);
-用于計(jì)算第二頂點(diǎn)B與第四頂點(diǎn)D之間的第三線段上的各點(diǎn)的坐標(biāo)的裝置(12);
-用于計(jì)算平行于第一線段AB并且被包含在平行四邊形ABCD內(nèi)的線段各點(diǎn)的坐標(biāo)的循環(huán)裝置(20)。
7.一種計(jì)算機(jī)程序產(chǎn)品,包含一個(gè)指令集,當(dāng)它們被加載到一個(gè)電路中時(shí),使該電路執(zhí)行如權(quán)利要求1中所要求的方法。
全文摘要
本發(fā)明涉及一種根據(jù)對(duì)平行四邊形(ABCD)的頂點(diǎn)的了解以描繪和填充在圖形屏面的離散網(wǎng)格上的平行四邊形(ABCD)的方法,該平行四邊形包含第一頂點(diǎn)(A)、第二頂點(diǎn)(B)、第三頂點(diǎn)(C)和第四頂點(diǎn)(D)。按照本發(fā)明的方法包含計(jì)算第一頂點(diǎn)(A)與第二頂點(diǎn)(B)之間的第一線段(AB)上的各點(diǎn)的坐標(biāo)的步驟(10);計(jì)算第一頂點(diǎn)(A)與第三頂點(diǎn)(C)之間的第二線段(AC)上的各點(diǎn)的坐標(biāo)的步驟(11);計(jì)算第二頂點(diǎn)(B)與第四頂點(diǎn)(D)之間的第三線段(BD)上的各點(diǎn)的坐標(biāo)的步驟(12);計(jì)算平行于第一線段AB并且被包含在平行四邊形ABCD內(nèi)的線段上的各點(diǎn)的坐標(biāo)的循環(huán)步驟(20)。有利地,所述計(jì)算線段上的各點(diǎn)的坐標(biāo)的各步驟使用所謂的中點(diǎn)算法或Bresenham算法。
文檔編號(hào)G06T11/40GK1777917SQ20048001095
公開日2006年5月24日 申請(qǐng)日期2004年4月15日 優(yōu)先權(quán)日2003年4月24日
發(fā)明者Q·趙, L·帕斯奎爾, M·杜蘭頓 申請(qǐng)人:皇家飛利浦電子股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1