二維圖元生成:多邊形掃描轉換算法


多邊形的表示

  • 頂點表示。只要得到頂點再連線即可。如果是凸多邊形由點集極角排序即可,其他情況不太了解
  • 點陣表示。需要判斷哪些屬於內部點

本文主要討論點陣表示

其實主要是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\)表都為空,算法結束


免責聲明!

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



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