爲了不求交運算,須要引進一套 特殊的數據結構算法
(1)活性邊表(AET):把與當前掃描線相交的邊稱爲活性邊,並把它們按與掃描線交點x座標遞增的順序存放在一個鏈表中。數據結構
(2)結點內容(一個結點在數據結構裏可用結構來表示)
x: 當前掃描線與邊的交點座標
△x: 從當前掃描線到下一條掃描線間x的增量
ymax: 該邊所交的最高掃描線的座標值ymax
3d
隨着掃描線的移動,掃描線與多邊形的交點和上一次交點相關:
△x=1/k 指針
另外,須要知道一條邊什麼時候再也不與下一條掃描線相交,以便及時把它從有效邊表中刪除出去,避免下一步進行無謂的計算blog
其中x爲當前掃描線與邊的交點,ymax是邊所在的最大掃描線值,經過它能夠知道什麼時候才能「拋棄」該邊,△x表示從當前掃描線到下一條掃描線之間的x增量即斜率的倒數。next爲指向下一條邊的指針 排序
爲了方便活性邊表的創建與更新,需構造一個新邊表(NET),用來存放多邊形的邊的信息:效率
1.首先構造一個縱向鏈表,鏈表的長度爲多邊形所佔有的最大掃描線數im
2.NET掛在與該邊低端y值相同的掃描線桶中。也就是說,存放在該掃描線第一次出現的邊 d3
-該邊的ymax
- 該邊較低點的x座標值xmin
- 該邊的斜率1/k
- 指向下一條具備相同較低端y座標的邊的指針
鏈表
在這個表裏只有一、三、五、7處有邊,從y=1開始作,而在1這條線上有兩條邊進來了,而後就把這兩條邊放進活性邊表來處理
每作一次新的掃描線時,要對已有的邊進行三個處理:
一、是否被去除掉;
二、若是不被去除,第二就要對它的數據進行更新。所謂更新數據就是要更新它的x值,即:x+1/k
三、看有沒有新的邊進來,新的邊在NET裏,能夠插入排序插進來。
這個算法過程歷來沒有求交,這套數據結構使得你不用求交點!避免了求交運算。
掃描線法能夠實現已知任意多邊形域邊界的填充。該填 充算法是按掃描線的順序,計算掃描線與待填充區域的 相交區間,再用要求的顏色顯示這些區間的像素,即完 成填充工做
爲了提升算法效率: (1)增量的思想 (2)連貫性思想 (3)構建了一套特殊的數據結構