2.區間掃描線算法——>被認為是消隱算法中最快的
掃描線的交點把這條掃描線分成了若干個區間,每個區間上必然是同一種顏色。對於有重合的區間,如a6a7這個區間,要么顯示F2的顏色要么顯示F3的顏色,不會出現顏色的跳躍。
要實現這個算法:
1>首先要有投影多邊形;
2>然后求交點;
3>交點進行排序;
4>在每個區間找當中的一個象素(i,j),在(i,j)處計算每個相關面的z值,對相關深度值z進行比較,其中最大的一個就表示是可見的,整個這段區間就畫這個z值最大面的顏色。
【確定小區間的顏色】
(1)小區間上沒有任何多邊形,就用背景色顯示,如[a4,a5];
(2)小區間只有一個多邊形,就顯示該多邊形的顏色,如[a1,a2];
(3)小區間上存在兩個或兩個以上的多邊,就必須通過深度測試判斷那個多邊形可見,如[a6,a7]。
3.區域子分割算法(Warnock算法)
【采用了分而治之的思想,利用了堆棧的數據結構】
把物體投影到全屏幕窗口上,然后遞歸分割窗口,直到窗口內目標【足夠簡單】,可以顯示為止。
3.1【足夠簡單是指】
(1)窗口內僅包含一個多邊形;
(2)窗口與一個多邊形相交,且窗口內無其他多邊形;
(3)窗口被一個多邊形所包圍;
(4)窗口與一個多邊形相離。
——>【窗口與多邊形的關系:包含/相交/包圍/相離】
【判斷多邊形與窗口是分離的】
【判斷多邊形在窗口內】
【判斷多邊形與窗口相交,可以采用直線方程作為判別函數來判斷】
3.2窗口有多個多邊形投影面,如何顯示?【分而治之】
(1)若窗口內沒有物體則按照背景色顯示;
(2)若窗口內只有一個面,則把該面顯示出來;
(3)若窗口內含有兩個以上的面,則把窗口等分成四個子窗口,對每個小窗口再做上述同樣的處理。
(4)若到某個時刻,【窗口僅有象素那么大】,而窗口內仍有兩個以上的面,這時不必再分割,只要取窗口內【最近的】可見面的顏色或所有可見面的【平均顏色】作為該象素的值。
【假設顯示器分辨率1024*1024,窗口最多分幾次?10次】
二、光柵掃描算法小結
1、直線段的掃描轉換算法
(1)DDA算法利用了直線的【斜截式方程】(y=kx+b),引進了【增量思想】(把一個乘法和一個加法變成一個加法);
(2)中點法采用直線的【一般式方程】,引進了【增量思想】,比DDA算法的優點是采用了【整數加法】;
(3)Bresenham算法采用了【增量和整數算法】,還可以用於二次曲線。
2、多邊形的掃描轉換和區域填充
有四個步驟:求交、排序、配對、填色。引進了【圖形的連貫性】,手段就是利用了【增量算法】和【特殊的數據結構】。
3、直線和多邊形裁剪
cohen-Sutherland算法的核心思想是【編碼】,把屏幕分成【9個區域】,用【4位編碼】描述這9個區域,通過4位編碼的“與”、“或”運算來判斷直線段是在窗口內或外。
Liang-Barsky算法用【參數方程】表示,把被裁剪的直線段看成是一條【有方向的線段】,把窗口的四條邊分成兩類(入邊和出邊)
4、走樣和反走樣
反走樣主要有三種方法:提高分辨率、區域采樣、加權區域采樣。
5、消隱
z-buffer算法把數組變成了【單個變量】;
區間掃描線算法把逐點處理變成【逐段處理】,提高算法效率;
Warnock算法采用了【分而治之】的思想,利用【堆棧】的數據結構。
核心思想:
(1)增量思想
(2)編碼思想
(3)符號判斷—>整數算法
(4)圖形的連貫性
(5)分而治之