多邊形的表示
- 頂點表示。只要得到頂點再連線即可。如果是凸多邊形由點集極角排序即可,其他情況不太了解
- 點陣表示。需要判斷哪些屬於內部點
本文主要討論點陣表示
其實主要是PPT的copy,但是復制一遍確實印象深刻一點🐕
1.逐點判斷法
即一個個點判斷是不是屬於圖形內部,主要方法是射線法。
從待判斷點發出射線,設與多邊形交點個數為\(k\)
- \(k\)與多邊形邊的交點若為奇數,在內部;若為偶數,則該點在外部
-
特殊情況:
- 該點在邊上,要先特判該點是不是邊上一點
- 射線在邊上,會有無數個點,要特斷射線是否與邊同線
- 交點為頂點,如果異測是1個,同側算0個或2個
判斷點的實現代碼(ACM):https://www.cnblogs.com/muyefeiwu/p/11260366.html
這個算法的特點是復雜度高
改進:利用內部點的連續性
2.掃描線算法
基本思路
- 掃描線一般取平行於\(X\)軸的直線,區間是指掃描線與邊的交點
- 將掃描線與邊的交點按\(x\)坐標從小到大排序
- 交點兩兩配對(交點個數為偶數),填充區間
連貫性
(1)邊的連貫性(Edge Coherence)—優化交點計算
-
某條邊與當前掃描線相交,也可能與下一條掃描線相交
-
如\(L_1\)與邊AE和AB相交,下條掃描線\(L_2\)也與邊AE和AB相交。
(2)掃描線的連貫性(Scan-line Coherence) )—優化交點排序
-
當前掃描線與各邊的交點順序與 下一條掃描線與各邊的交點 順序可能相同或類似
-
如點1,2的次序與點3,4的次序
(3)區間的連貫性(Span Coherence)
-
同一區間上的像素取同一顏色屬性
-
如點3和點4之間的線段
交點計算
由掃描線\(y=e\)與多邊形的交點遞推計算掃描線 \(y=e+1\)的交點
-
第一類交點:位於同一條邊上的后繼交點—如\(I_0,I_2,I_4\) : $x’=x+\frac{1}{m} $
-
第二類交點:邊與掃描線的第一個交點—如\(I_3 , I_1\) : 就是邊的下端點
- 水平邊不參與計算交點
算法數據結構
一、邊的分類表\(ET\)(Edge Table)
- 按照邊的下端點,對非水平邊進行分類的鏈表
- 下端點\(y\)坐標值等於\(i\)的邊屬於第i類,同類中有多條邊時按\(x\)從小到大排序(\(x\)也一樣時按邊上端點的\(x\)值)
struct ET{
int ymax; //邊的上端點的y坐標值
float x; //邊的下端點的x坐標
float deltax; //邊的斜率的倒數
ET *nextEdge; //下一條邊的指針
}edga[N]; //每條掃描線對應一條鏈表
其中edga[0],edga[2],edga[3],edga[6],edga[8]
因為沒有與邊的下端點相交,所以為空
數據結構對應相關方法:
deltax
:用於遞推計算交點$x’=x+\frac{1}{m} $ymax
: 當掃描線y = e + 1 == ymax
,說明下 一條掃描線與此邊不相交。
二、活性邊表\(AEL\)(Active Edge List)
-
結構定義與\(ET\)表是一樣的
-
x
的含義不一樣:當前掃描線與邊的交點的\(x\)坐標 -
作用:存儲與當前掃描線的交點,同時快速計算下一條掃描線與多邊形相交的點,且可判斷邊是否與下一條掃描線相交
-
實例
在\(Y=7\)的時候\(ET\)表不為空,所以就將\(ET\)表中的邊插入到\(AEL\)表中
算法過程
- 先建立\(ET\)表,掃描線從下往上掃,即設置一個指針\(p\),從\(y_{min}\)開始
- 如果此時的\(ET\)表不為空,就將表中元素取出插入到\(AEL\)中,插入排序
- \(AEL\)表中的元素兩兩配對,獲得填充區段,再填充
p++
- 將\(AEL\)中滿足\(y = y_{max}\)邊刪去 因為每條邊被看作下閉上開的
- 對\(AEL\)中剩下的每一條邊的\(x\)遞增\(deltax\),即\(x = x+deltax\)
- 直到\(ET\)表和\(AEL\)表都為空,算法結束