一、多邊形的掃描轉換
一、
1、定義:把多邊形的頂點表示轉化為點陣表示(就是已知多邊形的邊界,如何找到多邊形內部的點,即把多邊形內部填上顏色)
2、表示方法:頂點表示和點陣表示

3.頂點表示:是用多邊形的頂點序列來表示多邊形。
優點:這種表示直觀、幾何意義強。占內存少,易於進行幾何變換。
缺點:沒有明確指出哪些像素在多邊形內,故不能直接用於面着色。
4、點陣表示:用位於多邊形內的像素集合來刻畫多邊形
優點:是光柵顯示系統顯示時所需的表現形式
缺點:丟失了許多幾何信息(如邊界,頂點等)
5.多邊形分類:
1>凸多邊形:任意兩點的連線均在多邊形內
2>凹多邊形:兩頂點的連線有可能不在多邊形內
3>含內環的多邊形:多邊形內包含多邊形
多邊形掃描算法對這三種多變形均應滿足。
二、X-掃描線算法
1、基本思想:按掃描線順序,計算掃描線與多邊形的相交區間,再用要求的顏色顯示這些區間的像素,即完成填充工作。

2、算法核心:按X遞增順序排列交點的X坐標序列
3、算法步驟:
1>確定多邊形所占有的最大掃描線數,得到多邊形頂點的最小和最大的y值
2>從Ymin到Ymax,每次用一條掃描線進行填充
3>對一條掃描線進行填充可分為4個步驟:
A、求交:計算掃描線與多邊形各邊的交點
B、排序:把所有交點按遞增順序進行排序
C、交點配對:交點的個數應保證為偶數個
D、區間填色:把相交區間內的像素置成填充色
4、當掃描線與多邊形頂點相交時,交點的取舍問題:
1>若共享頂點的兩條邊分別落在掃描線的兩邊,交點算一個
2>若共享頂點的兩條邊在掃描線的同一邊,交點算零個或兩個(檢查若共享頂點的兩條邊的另外兩個端點的y值,若在共享頂點的下方,則算0,在上方,則算2)
舉例計算交點個數:

5、為了計算每條掃描線與多邊形各邊的交點,最簡單的方法是把多邊形的所有邊放在一個表中。在處理每條掃描線時,按順序從表中取出所有的邊,分別於掃描線求交
但是效率極低(求交計算量大,比如說有100個多邊形,每個多邊形有5條邊,就要算100*5*768次求交運算)
所以盡量不求交!
三、改進的X-掃描線算法
1、從三方面考慮改進:
1>在處理掃描線時,僅對與它相交的多邊形邊(有效邊)進行求交運算
2>考慮掃描線的連貫性:即當前掃描線與各邊的交點順序與下一條掃描線與各邊的交點順序相同或相似

3>考慮多邊形的連貫性:即當某條邊與當前掃描線相交時,它很可能也與下一條掃描線相交
為避免求交運算,引入一種數據結構:
(1)活性邊表:把與當前掃描線相交的邊稱為活性邊(有效邊),並把他們按與掃描線交點x坐標遞增的順序存放在一個鏈表中。
(2)結點內容:
X:當前掃描線與邊的交點坐標
△x:從當前掃描線到下一條掃描線間x的增量
Ymax:該邊所交的最高掃描線的坐標值Ymax

2、增量的值

△x=1/k(即從當前掃描線到下一條掃描線間x的增量為當前直線的斜率的倒數)
另外需要知道一條邊何時不再與下一條掃描線相交,以便及時把它從有效邊表中刪除出去,避免下一步無謂的計算,這也是Ymax的作用。
例如:

3.新邊表
為了方便活性邊表的建立與更新,需構造一個新邊表,用來存放多邊形邊的信息,分為4個步驟
1>首先構造一個縱向鏈表,鏈表的長度為多邊形所占有的最大掃描線數,鏈表的每個結點,稱為一個吊桶,對應多邊形覆蓋的每一條掃描線。
2>新邊表存放該掃描線第一次出現的邊
存放Ymax,該邊低點的X坐標,△x=1/k,next

例子:

結果如下:

在這個表里只有1,3,5,7,處有邊,從y=1開始,而在1掃描線上有兩條邊進來,然后就把兩條邊放進活性邊表來處理。
每做一次新的掃描線時,要對已有的便進行三個處理:
1、是否被去除掉(不是活性邊)
2、若沒有,則對其數據更新x值,加上1/k
3、看是否有新邊進來,新的邊在新邊表里
避免了求交運算!
四、多邊形掃描轉換算法小結
掃描轉換算法可以實現已知任意多邊形域邊界的填充。該填充算法是按掃描線的順序,計算掃描線與待填充區域的相交區間,再用要求的顏色顯示這些區間的像素,即完成填充工作。
為了提高算法效率:
1>增量的思想
2>連貫性思想
3>構建了一套特殊的數據結構
缺點:無法實現對未知邊界的區間填充
