CG-光柵圖形學多邊形掃描轉換算法-學習筆記


一、多邊形掃描轉換算法——X掃描線算法

1. 背景

1°  多邊形的兩種重要表示方法:頂點示和點陣表示;

2° 光柵圖形的一個基本問題就是把多邊形的頂點表示轉換成點陣表示。稱為多邊形的掃描轉換

2. 原理

X-掃描線算法填充多邊形的基本思想是按掃描線順序,計算掃描線與多邊形的相交區間,再用要求的顏色顯示這些區間的像素,即完成填充工作;區間的端點可以通過計算掃描線與多邊形邊界線的交點獲得。 

  

 如掃描線y=3與多邊形的便捷相交於4點:(2,3)、(4,3)、(7,3)、(9,3);

這四點定義了掃描線上的區間(2,4)、(7,9),區間內像素應取填充色;

 算法核心:按X遞增順序排列交點的X坐標序列。

3. 算法步驟

1° 確定多邊形所占有的最大掃描線書,得到多邊形頂點的最小和最大Y值(ymin、ymax);

2° 從y = ymin到y = ymax,每次用一條掃描線進行填充;

3° 對一條掃描線填充的過程可分為四個步驟:

        a. 求交:計算掃描線與多邊形各邊的交點;

        b. 排序:把所有交點按遞增順序進行排序;

        c. 交點配對:第一個與第二個,第三個與第四個;

        d. 區間填色:把這些相交區間的像素置成不同於背景色的填充色;

4. 交點取舍問題  ---->  交點的個數應保證為偶數個

a. 若共享頂點的兩條邊分別落在掃描線的兩邊,交點只算一個;

b. 若共享頂點的兩條邊在掃描線的同一邊,這時交點作為零個兩個

【注意】檢查共享頂點的兩條邊的另外兩個兩個端點的y值,按這個y值中大於交點y值的個數來決定交點數;(大於-->2、小於--->0)

5. 求交

為了計算每條掃描線與多邊形的交點,最簡單的方法是把多邊形的所有邊放在一個表中。在處理每條掃描線是,按順序從表中取出所有的邊,分別與掃描線求交;計算量非常大!!!

二、多邊形掃描轉換算法——改進的X掃描線算法

 1. 引入特殊的數據結構

1)活性邊表(AET):把當前掃描線相交的邊成為活性邊,並把它們按與掃描線交點x坐標遞增的順序存放在一個鏈表中;

2)結點內容(一個結點在數據結構里可用結構來表示)

            x:當前掃描線與邊的交點坐標

            ∆x:從當前掃描線到下一條掃描線間x的增量        

            ymax:該邊所交的最高掃描線的坐標值ymax

3)新邊表(NET):為了方便活性邊表的建立與更新,用來存放多邊形的邊的信息

     a)首先構造一個縱向鏈表,鏈表的長度為多邊形所占有的最大掃描線數,鏈表的每個結點,成為一個吊桶,對應多邊形覆蓋的每一條掃描線;

                                ====》

    b)NET掛在與該邊低端y值相同的線桶中。也就是說,存放在該掃描線第一次出現的邊;

數據結構內容:該邊的ymax、該邊較低點的x坐標值xmin,該邊的斜率1/k、指向下一條具有相同較低端y坐標的邊的指針;

示例:

2. 算法原理

1° 隨着掃描線的移動,掃描線與多邊形的交點和上一次交點相關:

設邊的直線斜率為k:

推導得:,即∆x = 1 / k;

2° 需要知道一條邊何時不再與下一條掃描線相交,以便及時把它從有效邊表中刪除出去,避免下一步進行無謂的計算;ymax是邊所在的最大掃描線值,通過它可以知道何時才能“拋棄”該邊。

從上邊這個NET表里就知道多邊形是從哪里開始的:在這個表里只有1、3、5、7處有邊,從y=1開始做,而在1這條線上有兩條邊進來了,然后就把這兩條邊放進活性邊表來處理。

3° 每一次更新,需要對已有的邊進行三個處理:

     1)是否被去除掉;

     2)如果不被去除,第二就要對它的數據進行更新。所謂更新數據就是要更新它的x值,即x+1/k;

     3)看有沒有新的邊進來,新的邊在NET里,可以插入排序插進來;


免責聲明!

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



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