消隱算法(二)——區間掃描線算法/區域子分割算法(Warnock算法)


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)分而治之


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM