第03章2基于光柵掃描轉(zhuǎn)換的二維圖元生成算法_第1頁
第03章2基于光柵掃描轉(zhuǎn)換的二維圖元生成算法_第2頁
第03章2基于光柵掃描轉(zhuǎn)換的二維圖元生成算法_第3頁
第03章2基于光柵掃描轉(zhuǎn)換的二維圖元生成算法_第4頁
第03章2基于光柵掃描轉(zhuǎn)換的二維圖元生成算法_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

計算機圖形學(xué)第3章基于光柵掃描的二維圖元生成算法第二部分3.6裁剪在許多應(yīng)用中,面對一張大的畫面,或者是由于實際需要,或者是顯示屏幕有限,常要求在一個矩形區(qū)域內(nèi)指定要顯示的部分畫面。這種用來指定圖形顯示內(nèi)容的矩形區(qū)域稱為裁剪窗口。窗口內(nèi)的圖形被顯示出來了,而窗口之外的圖形則被裁剪掉。從圖形的顯示過程知道,任何圖形在顯示之前都要經(jīng)過裁剪工作。因此圖形的裁剪和圖形的變換一樣,直接影響圖形系統(tǒng)的效率。裁剪的方法很多,效率的高低常與計算機圖形硬件水平及圖形復(fù)雜程度有關(guān),要根據(jù)實際情況來選擇合適的裁剪算法3.6裁剪裁剪的基本目的是判斷這個圖形元素是否落在窗口區(qū)域之內(nèi),如落在區(qū)域之內(nèi)則進一步求出位于區(qū)域之內(nèi)的部分。因此裁剪處理的基礎(chǔ)有兩個方面:一是圖元在窗口區(qū)域內(nèi)外的判別,二是圖形元素與窗口的求交。

裁剪可以對掃描轉(zhuǎn)換之后的點陣圖形在設(shè)備坐標系中進行,也可以在世界坐標系中對掃描轉(zhuǎn)換之前的參數(shù)表示的圖形進行。前者算法簡單,但效率不高,因為無論圖形落在窗口的內(nèi)部還是外部,都要掃描轉(zhuǎn)換,它一般適用于求交難度較大的圖形。而后者主要應(yīng)用于點、線、多邊形等簡單圖元。由于世界坐標系一般為浮點坐標系,故有時也稱世界坐標系中的裁剪為分析裁剪,它是大多數(shù)圖形系統(tǒng)所采用的裁剪方法3.6.1窗口視口變換窗口:由用戶坐標系定義的一個矩形區(qū)域;視口:由設(shè)備坐標系定義的一個矩形區(qū)域;當把用戶坐標系中的圖形在圖形設(shè)備上輸出時,可以定義適當?shù)拇翱诤鸵暱冢勾翱诘膱D形在視口內(nèi)顯示,處于窗口外或視口外的圖形則不被顯示即稱被裁剪掉。固定視口而改變窗口,就可以在視口中觀察到用戶描述的全部圖形了視口HVLV(XV1,YV1)窗口HW(XW1,YW1)LW窗口與視口的關(guān)系用戶坐標系設(shè)備坐標系3.6.2線段裁剪裁剪算法有二維的和三維的,裁剪對象可以是規(guī)則形體,也可以是不規(guī)則形體,其裁剪算法可以用硬件實現(xiàn),也可以用軟件實現(xiàn)。在進行裁剪時,畫面中對應(yīng)于屏幕顯示的那部分區(qū)域也即窗口,把其定義為矩形,由上、下、左、右四條邊圍成,即:(xL,yB),(xR,yH)。裁剪的實質(zhì)就是決定圖形中哪些點、線段、文字、以及多邊形在裁剪窗口之內(nèi),在窗口內(nèi)的圖形被保留顯示,而窗口之外的畫面被裁去。如圖所示。對于點(x,y),只要判別兩對不等式:xLxxR, yByyH若四個不等式均成立,則點在窗口矩形之內(nèi);否則,點在窗口矩形之外。其中,等號表示點位于窗口的邊界上。1.Cohen-Sutherland算法Cohen-Sutherland算法有時也稱為編碼算法,該算法分為三個步驟:第一步:判別線段兩端是否都落在窗口內(nèi),如果是,則線段完全可見;否則進入第二步第二步:判別線段是否為顯然不可見,即線段的兩端點均落在窗口某邊所在直線的外側(cè),如果是,則裁剪結(jié)束;否則進入第三步第三步:求線段與窗口邊延長線的交點,這個交點將線段分為兩段,其中一段顯然不可見,舍棄。對余下的另一段重新進行第一步、第二步判斷,直至結(jié)束。1.Cohen-Sutherland算法整個裁剪過程可以看作一個遞歸過程。為了實現(xiàn)這個算法,首先用窗口四條邊所在的直線將整個二維平面分成9個區(qū)域,如圖3-36。每個區(qū)域賦予一個四位的編碼CtCbCrCl,其中各位編碼的含義如下:1.Cohen-Sutherland算法如圖是各個區(qū)的編碼的十進制數(shù)。判斷線段的一個端點是否在窗口內(nèi)部,只需判斷它的編碼值是否為0。注意到編碼中各個位的含義,當兩個端點的編碼的邏輯“與”非0時,它們必然落在窗口某邊的外側(cè),也即線段為顯然不可見的1.Cohen-Sutherland算法線段端點編碼實例兩個端點“邏輯與”操作的語義是兩個“端點都怎么樣”1.Cohen-Sutherland算法對既非完全可見,又非顯然不可見的線段,如圖3-38中的AD,需要進行求交運算。求交前實現(xiàn)要測試線段和窗口哪條邊所在直線有交,這只要判斷線段兩端點編碼中各位的值即可。如圖中的AD,D點編碼中的Cl=1,而A點編碼中的Cl=0,則知道AD和窗口的左邊所在直線有交。在程序中,求交測試的順序是固定的。不妨假定求交測試的順序為窗口的左邊、上邊、右邊、下邊。按照這個順序,線段EJ和窗口四邊被求出的交點順序為F、I、H、G。從而在Cohen-Sutherland裁剪算法中,最壞的情況下,一條線段在裁剪時需要求交四次1.Cohen-Sutherland算法intLineClip(CPoint&posBeg,CPoint&posEnd,CRectrect){ intaccept,done; charc0,c1,code; intx0,y0,x1,y1,x,y; doublem; accept=0;//線段可見標志

done=0;//裁剪完成標志

x0=m_posBeg.x; y0=m_posBeg.y; x1=m_posEnd.x; y1=m_posEnd.y; c0=GetCSCode(x0,y0,rect);//返回線段起點的編碼

c1=GetCSCode(x1,y1,rect);//返回線段終點的編碼1.Cohen-Sutherland算法while(!done){ if(!c0&&!c1){//線段完全可見 posBeg.x=x0; posBeg.y=y0; posEnd.x=x1; posEnd.y=y1; accept=1; done=1; }elseif(c0&c1){//線段完全不可見 posBeg.x=0; posBeg.y=0; posEnd.x=0; posEnd.y=0; accept=0; done=1;}1.Cohen-Sutherland算法

else{//處理非完全可見又非顯然不可見的情況 if(c0){//首點不可見。Code=首點 code=c0;(code指向不可見的那一方) } else{//首點可見,code=終點 code=c1; } if(code&0x01){//線段與窗口的左邊有交

x=rect.left; m=(double)(y1-y0)/(double)(x1-x0); y=y0+(int)((x-x0)*m); } elseif(code&0x08){//線段與窗口的上邊有交 y=rect.top; m=(double)(x1-x0)/(double)(y1-y0); x=x0+(int)((y-y0)*m); }1.Cohen-Sutherland算法elseif(code&0x02){//線段與窗口的右邊有交 x=rect.right; m=(double)(y1-y0)/(double)(x1-x0); y=y0+(int)((x-x0)*m); } elseif(code&0x04){//線段與窗口的下邊有交 y=rect.bottom; m=(double)(x1-x0)/(double)(y1-y0);

x=x0+(int)((y-y0)*m);

}1.Cohen-Sutherland算法if(code==c0){ x0=x; y0=y; c0=GetCSCode(x0,y0,rect); } else{ x1=x; y1=y; c1=GetCSCode(x1,y1,rect);

}}}returnaccept;}1.Cohen-Sutherland算法CharGetCSCode(intx,inty,CRectrt){ charcode=0; if(x<rt.left)//編碼為***1,最后一位置1 code=code|0x01; else//編碼為***0,最后一位置0 code=code&0xfe;

if(x>rt.right)//編碼為**1* code=code|0x02; else//編碼為**0* code=code&0xfd;1.Cohen-Sutherland算法if(y<rt.bottom)//編碼為*1** code=code|0x04;else//編碼為*0** code=code&0xfb;if(y>rt.top)//編碼為1*** code=code|0x08;else//編碼為0*** code=code&0xf7;returncode;}2.中點分割算法在圖中的b線段,檢查端點編碼可知它既不是完全可見段,也不是完全不可見段,則在中點Pm1處將b分為二段,兩段的情況仍然相同。先不考慮P1Pm1,在Pm2處將Pm1P2分為二段從圖中可見,Pm1Pm2完全可見,而Pm2P2部分可見。這樣處理的結(jié)果將導(dǎo)致線段的可見部分被劃分成一系列的可見小段然后再逐段畫出,顯然效率降低。2.中點分割算法求P1最遠可見點的算法:1)

若P2在窗口內(nèi),則P2就是離P1最遠的可見點,結(jié)束該算法,否則進行下一步;2)

若P1P2為完全不可見,則結(jié)束該算法,否則進行下一步;3)

取P1P2中點Pm,若Pm點在窗口內(nèi)部,則處理PmP2線段來尋找P1的最遠可見點,即用Pm代替P1,執(zhí)行2,否則P2用Pm代替,執(zhí)行2。直到Pm與線段端點的距離達到分辯率精度為止。3.6.3多邊形裁剪在光柵顯示系統(tǒng)中,常常需要顯示輸出具有連續(xù)色彩的圖形區(qū)域,圖形區(qū)域一般由多邊形構(gòu)成,這時就需要處理多邊形區(qū)域的裁剪問題了。通常有一種錯覺,認為只要把多邊形的每條邊用對直線段的裁剪方法裁剪后,就完成了對多邊形的裁剪,其實不然。在圖形學(xué)中,多邊形定義了一個封閉的二維區(qū)域,裁剪結(jié)果也應(yīng)該是一個封閉的多邊形區(qū)域。多邊形裁剪有其自身的特殊性,這種特殊性表現(xiàn)在:第一,多邊形的邊被裁剪后一般就不再封閉了,需要用窗口邊界的適當部分來封閉它,如何確定這部分的邊界?如圖3.6.3多邊形裁剪第二,一個凹多邊形可能被裁剪成幾個小的多邊形,如何確定這些小多邊形的邊界?如圖1.Sutherland-Hodgman逐次裁剪算法Sutherland-Hodgman多邊形裁剪算法采用了分割處理的策略,將多邊形關(guān)于矩形窗口的裁剪分割為多邊形關(guān)于窗口四邊所在直線的裁剪。所以該算法有時也稱為逐邊裁剪算法。多邊形關(guān)于窗口四邊的裁剪是相繼進行的,不妨假定裁剪順序為左邊、上邊、右邊,下邊,那么原多邊形關(guān)于窗口左邊的裁剪結(jié)果多邊形作為關(guān)于上邊裁剪的輸入多邊形,…。裁剪過程是一個流水線過程,如圖1.Sutherland-Hodgman逐次裁剪算法假設(shè)當前處理的多邊形的邊為SP,頂點S在上一輪處理過了。在情況1中,SP完全落在裁剪邊的內(nèi)側(cè)(半空間之內(nèi)),將P輸出到結(jié)果多邊形頂點表中;在情況2中,P點在外側(cè)不可見,而交點

i應(yīng)輸出;在情況3中,SP完全在外側(cè),沒有輸出;在情況4中,交點i和P點都是結(jié)果多邊形的頂點,按順序先輸出i再輸出P。從上面分析知道,裁剪結(jié)果多邊形的頂點由兩部分構(gòu)成,一部分是落在裁剪邊內(nèi)側(cè)的原多邊形頂點,一部分是多邊形的邊與裁剪邊的交點。只要將這兩部分頂點按一定的順序連接起來就得到了裁剪結(jié)果多邊形1.Sutherland-Hodgman逐次裁剪算法

左下右上BOOLSHPolygonClip(int&k,CPoint*p,CRect

rect){ constint

maxVertics=100; //最大頂點數(shù)目

int

i;

CPoint

pb,pe;

intm=m_nVertics;

CPoint*a=newCPoint[maxVertics]; for(i=0;i<m;i++)a[i]=m_pHead[i]; //裁剪左邊

pb.x=rect.left; pb.y=rect.top;

pe.x=rect.left; pe.y=rect.bottom; Clip(m,a,pb,pe); //裁剪下邊

pb.x=rect.left; pb.y=rect.bottom;

pe.x=rect.right; pe.y=rect.bottom;

Clip(m,a,pb,pe);1.Sutherland-Hodgman逐次裁剪算法 //裁剪右邊 pb.x=rect.right; pb.y=rect.bottom; pe.x=rect.right; pe.y=rect.top; Clip(m,a,pb,pe);

//裁剪上邊 pb.x=rect.right; pb.y=rect.top; pe.x=rect.left; pe.y=rect.top; Clip(m,a,pb,pe); k=m; for(i=0;i<k;i++) p[i]=a[i]; delete[]a; returnTRUE;}1.Sutherland-Hodgman逐次裁剪算法//按邊裁剪多邊形,返回被某邊裁剪后的結(jié)果多邊形頂點數(shù)組VoidClip(int&m,CPoint*a,CPointpb,CPointpe){ constintmaxVertics=100; //最大頂點數(shù)目 inti,k; CPointp0; CPoints,p;//線段SP的起點與終點 CPoint*b=newCPoint[maxVertics];//存放結(jié)果臨時頂點數(shù)組

k=0;//開始時,結(jié)果多邊形的頂點數(shù)為0 s=a[m-1];//從多邊形的第n個頂點開始1.Sutherland-Hodgman逐次裁剪算法for(i=0;i<m;i++){ p=a[i]; if(IsInsideRectangle(p,pb,pe)){//點p在邊(pb,pe)的內(nèi)側(cè) if(IsInsideRectangle(s,pb,pe))//情況1 Output(p,k,b); else{//情況4 p0=Intersect(s,p,pb,pe); Output(p0,k,b); Output(p,k,b); } } elseif(IsInsideRectangle(s,pb,pe)){//情況2 p0=Intersect(s,p,pb,pe); Output(p0,k,b); }//情況3沒有輸出 s=p;}m=k;for(i=0;i<m;i++) a[i]=b[i];delete[]b;}1.Sutherland-Hodgman逐次裁剪算法//判斷點p位于裁剪邊的內(nèi)側(cè)還是外側(cè)intIsInsideRectangle(CPointp,CPointpb,CPointpe){ if(pe.x>pb.x){//裁剪邊為窗口的下邊 if(p.y>=pb.y)return1; } elseif(pe.x<pb.x){//裁剪邊為窗口的上邊 if(p.y<=pb.y)return1; } elseif(pe.y>pb.y){//裁減邊為窗口的右邊 if(p.x<=pb.x)return1; } elseif(pe.y<pb.y){//裁減邊為窗口的左邊 if(p.x>=pb.x)return1; } return0;}1.Sutherland-Hodgman逐次裁剪算法//將頂點p加入到多邊形頂點序列中去voidOutput(CPointp,int&k,CPoint*a){ a[k].x=p.x; a[k].y=p.y; k++;}1.Sutherland-Hodgman逐次裁剪算法//求多邊形的邊SP與裁剪邊(pb,pe)的交點CPointIntersect(CPoints,CPointp,CPointpb,CPointpe){ CPointp0; doublem; if(pb.y==pe.y){//水平裁剪邊 p0.y=pb.y; m=(double)(p.x-s.x)/(double)(p.y-s.y); p0.x=s.x+(int)((pb.y-s.y)*m); } else{//豎直裁剪邊 p0.x=pb.x; m=(double)(p.y-s.y)/(double)(p.x-s.x); p0.y=s.y+(int)((pb.x-s.x)*m); } returnp0;}1.Sutherland-Hodgman逐次裁剪算法用Sutherland-Hodgman算法對多邊形裁剪有時會出現(xiàn)問題,比如上述算法就沒有考慮裁剪成兩個分離多邊形的情況,而只是簡單地將所有頂點連接,沒有得到正確的分離的多邊形。為了解決這個問題,在用窗口的一條邊對多邊形進行裁剪時要設(shè)置一個記錄,把多邊形的邊和窗口的邊相交的交點都記錄下來,并對交點進行排序,把交點兩兩配對(交點的個數(shù)必為偶數(shù))。如果只有兩個交點,則多邊形經(jīng)裁剪后仍為一個多邊形,如果有4個交點,則多邊形經(jīng)裁剪后成為兩個多邊形,以此類推2.Weiler-Athenton算法Sutherland-Hodgeman算法解決了裁剪窗口為凸多邊形窗口的問題,但一些應(yīng)用需要涉及任意多邊形窗口(含凹多邊形窗口)的裁剪。Weiler-Atherton多邊形裁剪算法正是滿足這種要求的算法2.Weiler-Athenton算法在算法中,裁剪窗口、被裁剪多邊形可以是任意多邊形:凸的,凹的,甚至是帶有內(nèi)環(huán)的裁剪窗口和被裁剪多邊形處于完全對等的地位,這里我們稱:1、被裁剪多邊形為主多邊形,記為A;2、裁剪窗口為裁剪多邊形,記為B。主多邊形A和裁剪多邊形B的邊界將整個二維平面分成了四個區(qū)域:1、A∩B(交:屬于A且屬于B);2、A-B(差:屬于A不屬于B);3、B-A(差:屬于B不屬于A);4、A∪B(并:屬于A或?qū)儆贐,取反;即:不屬于A且不屬于B)。2.Weiler-Athenton算法內(nèi)裁剪即通常意義上的“裁剪”,取圖元位于窗口之內(nèi)的部分,結(jié)果為A∩B。外裁剪取圖元位于窗口之外的部分,結(jié)果為A-B。觀察右圖不難發(fā)現(xiàn)裁剪結(jié)果區(qū)域的邊界由被裁剪多邊形的部分邊界和裁剪窗口的部分邊界兩部分構(gòu)成,并且在交點處邊界發(fā)生交替,即由被裁剪多邊形的邊界轉(zhuǎn)至裁剪窗口的邊界,或者反之。由于多邊形構(gòu)成一個封閉的區(qū)域,所以,如果被裁剪多邊形和裁剪窗口有交點,則交點成對出現(xiàn)。這些交點分成兩類:一類稱“入”點,即被裁剪多邊形由此點進入裁剪窗口,如圖中a、c、e;一類稱“出”點,即被裁剪多邊形由此點離開裁剪窗口,如圖中b、d、f。2.Weiler-Athenton算法Weiler-Atherton任意多邊形裁剪算法思想:算法從被裁剪多邊形的一個入點開始,碰到入點,沿著被裁剪多邊形按順時針方向搜集頂點序列;而當遇到出點時,則沿著裁剪窗口按順時針方向搜集頂點序列。由于可能存在分裂的多邊形,因此算法要考慮:將搜集過的入點的入點記號刪去,以免重復(fù)跟蹤。將所有的入點搜集完畢后算法結(jié)束。2.Weiler-Athenton算法1、順時針輸入被裁剪多邊形頂點序列Ⅰ放入數(shù)組1中。2、順時針輸入裁剪窗口頂點序列Ⅱ放入數(shù)組2中。3、求出被裁剪多邊形和裁剪窗口相交的所有交點,并給每個交點打上“入”、“出”標記。然后將交點按順序插入序列Ⅰ得到新的頂點序列Ⅲ,并放入數(shù)組3中;同樣也將交點按順序插入序列Ⅱ得到新的頂點序列Ⅳ,放入數(shù)組4中;4、初始化輸出數(shù)組Q,令數(shù)組Q為空。接著從數(shù)組3中尋找“入”點。如果“入”點沒找到,程序結(jié)束。5、如果找到“入”點,則將“入”點放入S中暫存。6、將“入”點錄入到輸出數(shù)組Q中。并從數(shù)組3中將該“入”點的“入”點標記刪去。7、沿數(shù)組3順序取頂點:如果頂點不是“出點”,則將頂點錄入到輸出數(shù)組Q中,流程轉(zhuǎn)第7步。否則,流程轉(zhuǎn)第8步。8、沿數(shù)組4順序取頂點:如果頂點不是“入點”,則將頂點錄入到輸出數(shù)組Q中,流程轉(zhuǎn)第8步。否則,流程轉(zhuǎn)第9步。9、如果頂點不等于起始點S,流程轉(zhuǎn)第6步,繼續(xù)跟蹤數(shù)組3。否則,將數(shù)組Q輸出;流程轉(zhuǎn)第4步,尋找可能存在的分裂多邊形。算法在第4步:滿足“入”點沒找到的條件時,算法結(jié)束。2.Weiler-Athenton算法2.Weiler-Athenton算法2.Weiler-Athenton算法2.Weiler-Athenton算法Weiler-Atherton任意多邊形裁剪算法特點:裁剪窗口可以是矩形、任意凸多邊形、任意凹多邊形??蓪崿F(xiàn)被裁剪多邊形相對裁剪窗口的內(nèi)裁或外裁,即保留窗口內(nèi)的圖形或保留窗口外的圖形,因此在三維消隱中可以用來處理物體表面間的相互遮擋關(guān)系。裁剪思想新穎,方法簡潔,裁剪一次完成,與裁剪窗口的邊數(shù)無關(guān)。3.6.4字符裁剪當字符或文本整個不在窗口時,則不予顯示。然而,當字符和文本部分在窗口內(nèi),部分在窗口外時,就提出了字符裁剪的問題。字符精度:最簡單的字符裁剪方法是把字符方框(即字符掩膜)與窗口比較。若整個方框位于窗口內(nèi),則顯示對應(yīng)字符,否則不予顯示。象素精度:有些應(yīng)用要求更準確的處理:即使字符只有一部分在窗口內(nèi),也要把這一部分顯示出來。若字符為點陣型的,只要在把字符掩膜各位寫入象素之前,先判斷該位對應(yīng)的象素是否在窗口內(nèi),若該位在窗口內(nèi)則寫,否則就不寫。筆劃精度:在字符為矢量型的情形,問題就更復(fù)雜一些。這時要對跨越窗口邊界的筆劃進行裁剪,裁去筆劃伸到窗口外的部分,保留筆劃在窗口內(nèi)的部分,這個問題可以轉(zhuǎn)化為線段的裁剪。3.7反走樣基礎(chǔ)在光柵顯示器上顯示圖形時,直線段或圖形邊界或多或少會呈現(xiàn)鋸齒狀,原因是圖形信號是連續(xù)的,而在光柵顯示系統(tǒng)中,用來表示圖形的卻是一個個離散的像素。這種用離散的量來表示連續(xù)的量而引起的失真,叫做走樣。用于減少或消除走樣的技術(shù),稱為反走樣。常見的走樣現(xiàn)象有三種:階梯走樣、細節(jié)走樣、遺失走樣。所謂階梯走樣是在掃描轉(zhuǎn)換線段時,線段呈現(xiàn)階梯形狀;所謂細節(jié)走樣是指圖形在用象素顯示時會發(fā)生變大變小的現(xiàn)象;而遺失走樣則是對于過小的圖形,用象素現(xiàn)有的分辨率無法顯示的現(xiàn)象。3.7反走樣基礎(chǔ)常用的反走樣方法分為兩類提高分辨率區(qū)域采樣非加權(quán)區(qū)域采樣加權(quán)區(qū)域采樣3.7.1提高分辨率假設(shè)將顯示器的水平和垂直分辨率都提高一倍,則同樣長度的直線段穿過的掃描線條數(shù)增加了一倍,線段上的寬度減小了一倍。這樣顯示出的直線段看起來就平直光滑了一些,達到了減少走樣的效果提高顯示系統(tǒng)的分辨率可以減小走樣的程度,方法也很簡單,但付出的代價卻非常大。假設(shè)要將光柵顯示器系統(tǒng)的水平、垂直分辨率提高一倍,則顯示器的點距要減小一倍,幀緩存的容量要增加到原來的4倍,顯示卡和顯示器之間的傳輸帶寬度也要增加到原來的4倍,而掃描轉(zhuǎn)換同樣大小的圖元卻要花費4倍的時間3.7.2簡單的區(qū)域反走樣算法前面介紹的直線掃描轉(zhuǎn)換算法做了兩點假定:(1)像素是數(shù)學(xué)上抽象的點,它的亮度由覆蓋該點的圖形的亮度所決定;(2)直線段是數(shù)學(xué)上抽象的直線段,它的寬度為0。但實際上,象素不是一個點,而是一個個具有一定面積的小區(qū)域,該區(qū)域的形狀依賴于光柵顯示系統(tǒng)的硬件。直線段的寬度也不是0,在屏幕上顯示的直線段的寬度至少為一象素。算法中所假定的條件和實際情況之間的差距是造成走樣的原因之一,所以,為了減少走樣,必須改變直線段模型。3.7.2簡單的區(qū)域反走樣算法非加權(quán)區(qū)域采樣反混淆方法,歸納為如下幾個步驟:(1)將直線段看作具有一定寬度的狹長矩形;(2)當直線段與象素有交時,求出兩者相交區(qū)域的面積;(3)根據(jù)相交區(qū)域的面積,確定該象素的亮度值(在矩形內(nèi)占的面積越大,顏色越深)3.7.2簡單的區(qū)域反走樣算法在非加權(quán)區(qū)域采用方法中,起關(guān)鍵作用的是直線段與象素相交區(qū)域的面積,如何計算這個面積呢?假設(shè)一條直線段的斜率為m,若規(guī)定它的顯示寬度為一個象素,那么直線段與象素的相交情況有三種3.7.2簡單的區(qū)域反走樣算法

3.7.2簡單的區(qū)域反走樣算法有時為了簡化上述計算,可以通過下面的離散計算方法求出相交區(qū)域的近似面積,用這個近似的面積替代真實的面積來確定像素的顯示灰度。求相交區(qū)域的近似面積的離散計算方法:(1)將屏幕像素分割成n個更小的子像素;(2)計算中心點落在直線段內(nèi)的子像素的個數(shù),記為k;(3)k/n為線段與像素相交區(qū)域面積的近似值。這樣做的目的是為了簡化計算,例如: n=16,k=3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論