圖形學(xué)的基本目標(biāo)和任務(wù)
目標(biāo)
視覺交流马僻,通過圖形或者幾何的方式來表示或展示一些問題或信息冰木。
基本任務(wù)
表示:將客觀世界用二維或三維的方式表示
繪制:如何將計(jì)算機(jī)中的對(duì)象用一種直觀形象的圖形圖像方式表現(xiàn)出來
交互:通過計(jì)算機(jī)輸入輸出設(shè)備,以有效的方式表示與繪制的技術(shù)
計(jì)算機(jī)圖形學(xué)相關(guān)學(xué)科
圖像處理:將客觀世界中原來存在的物體形象處理成新的數(shù)字化圖像的相關(guān)技術(shù)。
模式識(shí)別:用攝像機(jī)和計(jì)算機(jī)代替人眼對(duì)目標(biāo)進(jìn)行識(shí)別跟蹤和測(cè)量,用計(jì)算的方法模擬人類的視覺系統(tǒng)陌知。
計(jì)算幾何:研究幾何模型和數(shù)據(jù)處理的學(xué)科,討論幾何形體的計(jì)算機(jī)表示掖肋,分析和綜合仆葡。。
計(jì)算機(jī)圖形學(xué)的應(yīng)用領(lǐng)域
計(jì)算機(jī)輔助設(shè)計(jì)與制造
科學(xué)計(jì)算可視化
虛擬現(xiàn)實(shí)
計(jì)算機(jī)動(dòng)畫
計(jì)算機(jī)游戲
CG插畫
圖形系統(tǒng)體系結(jié)構(gòu)(圖形流水線)
應(yīng)用程序階段(產(chǎn)生圖元):把數(shù)據(jù)以圖元的形式提供給圖形硬件志笼,也提供用于表面紋理映射的圖像或者位圖沿盅。
幾何處理階段(產(chǎn)生二維屏幕坐標(biāo)):以每個(gè)頂點(diǎn)為基礎(chǔ)對(duì)幾何圖元進(jìn)行處理,并從三維坐標(biāo)變換為二維屏幕坐標(biāo)纫溃。
像素處理階段:屏幕對(duì)象被傳送到像素處理器進(jìn)行光柵化腰涧,再對(duì)每個(gè)像素進(jìn)行著色,然后再輸出到幀緩沖器紊浩,最后再輸出到顯示器窖铡。
直線生成算法(待補(bǔ))
區(qū)域填充
- 邊界定義的區(qū)域,區(qū)域邊界上的像素顏色已確定坊谁,區(qū)域內(nèi)部像素沒有設(shè)置制定的顏色费彼。邊界上和區(qū)域內(nèi)的目標(biāo)顏色值可相同也可不同。
- 內(nèi)定義區(qū)域呜袁。只劃分區(qū)域內(nèi)外部分敌买,區(qū)域外所有像素已有特定顏色,區(qū)域內(nèi)顏色與區(qū)域外不同阶界。
漫水法:四連通&&八連通
void FloodFill4 (int x, int y, int newcolor, int boundaryColor) {
// 當(dāng)處理內(nèi)定義區(qū)域時(shí)虹钮,用if (getpixel(x, y)!=newcolor)判斷即可
if (getpixel(x, y)!=newcolor && getpixel(x,y)!=boundaryColor) {
setpixel(x, y, newcolor, boundaryColor);
FloodFill4(x-1, y, newcolor, boundaryColor);
FloodFill4(x, y+1, newcolor, boundaryColor);
FloodFill4(x+1, y, newcolor, boundaryColor);
FloodFill4(x, y-1, newcolor, boundaryColor);
//如果是基于八連通聋庵,則要增加其它四個(gè)方向的類似代碼
}
}
void FloodFill (int x, int y, int newcolor, int boundaryColor)
{
Stack stack;
stack.Push(Pixel(x, y)); //把種子像素(x,y)推入棧中
while (! stack.Empty()) //當(dāng)棧不空時(shí)循環(huán)執(zhí)行以下代碼
{
pixel=stack.Pop(); //從棧頂彈出一個(gè)像素
// 當(dāng)處理內(nèi)定義區(qū)域時(shí),用if (pixel.Color !=newcolor)判斷即可
if (pixel.Color != newcolor && pixel.Color != boundaryColor) {
xx = pixel.x; yy = pixel.y;
setpixel( xx, yy, newcolor, boundaryColor);
stack.Push ( Pixel (xx-1, yy ));
stack.Push ( Pixel( xx, yy+1));
stack.Push ( Pixel (xx+1, yy ));
stack.Push ( Pixel(xx, yy-1));
}
}
}
種子掃描線填充算法:
從給定的種子點(diǎn)開始芙粱,填充當(dāng)前掃描線上種子點(diǎn)所在的區(qū)間祭玉,然后確定與這一區(qū)間相鄰上下兩條掃描線上需要填充的區(qū)間。在這個(gè)區(qū)間上取最左側(cè)或最右側(cè)的一個(gè)點(diǎn)作為新的種子點(diǎn)春畔,不斷重復(fù)以上過程脱货,直到所有區(qū)間都被處理完。
算法步驟:
- 從包含種子像素的堆棧中推出區(qū)段內(nèi)的種子像素律姨;
- 沿著掃描線振峻,對(duì)種子像素的左右像素進(jìn)行填充,直至遇到邊界像素為止择份;
- 區(qū)段內(nèi)最左和最右像素記為xl和xr扣孟,在此區(qū)間內(nèi),檢查與當(dāng)前掃描線相鄰的上下兩條掃描線是否全為邊界像素或已被填充過荣赶;
- 如果經(jīng)測(cè)試凤价,這些掃描線上的像素段需要填充,則在xl和xr區(qū)間范圍內(nèi)拔创,把每一像素段的最右像素作為種子像素利诺,并壓入堆棧;
- 初始化時(shí)剩燥,向堆棧壓入種子像素慢逾,并在堆棧為空時(shí)結(jié)束。
反走樣技術(shù)
對(duì)圖形進(jìn)行光柵化時(shí)躏吊,離散的像素表示連續(xù)直線和區(qū)域邊界時(shí)引起的失真現(xiàn)象稱為走樣氛改。用于減小和消除走樣的技術(shù)稱為反走樣。
- 超采樣方法:通過軟件方式來提高分辨率比伏。將圖形以高于物理光柵設(shè)備分辨率完成光柵化(偽光柵化),按每個(gè)子像素合并得到要顯示的像素灰度值疆导。
- 線段反走樣技術(shù):假定線段有寬度赁项,把線段看成狹長矩形,線段通過每個(gè)像素時(shí)澈段,求出兩者相交的面積悠菜,根據(jù)該面積值來確定像素的灰度值和顏色值。顏色值與面積呈線性關(guān)系败富。
- 多邊形反走樣算法:采用線段反走樣來改善多邊形邊界的顯示質(zhì)量悔醋。求像素與邊界的相交面積。