1. 程式人生 > >圖形學(5)多邊形的掃描轉換(下)

圖形學(5)多邊形的掃描轉換(下)

本模組內容絕大部分是在慕課上看中國農業大學網客時的筆記,因此算作轉載,在此鳴謝趙明、李振波兩位老師,感謝他們錄製該門課程供大家學習!

X-掃描線改進演算法

由於X-掃描線演算法的效率問題,下面給出如何巧妙地避免演算法中的求交運算從而提高效率。

重要思想

進行改進之前首先我們要再提一提兩個圖形學中重要的思想

  1. 掃描線:用掃描線掃描的方法處理圖形影象
  2. 增量:利用直線等圖形的幾何特性儘量避免乘法而改為簡單的加法運算

改進思路

接下來,我們考慮求交過程是否也能用增量思想進行簡化、如何簡化。思考的思路有以下幾個方面

  1. 在處理一條掃描線時,僅對與它相交的邊(有效邊)求交
  2. 考慮掃描線的連貫性:當前掃描線的交點順序與下一條掃描線與各邊的交點順序很可能相同或非常相似
  3. 考慮多邊形的連貫性:某條邊與當前掃描線相交時,很可能也與下一條掃描線相交
於是,我們對多邊形邊的表述方式進行改進,引進一套特殊的資料結構來表達它們

資料結構

活性邊表(Active Edge Table,AET)

定義:

把與當前掃描線相交的邊稱為活性邊,把它們按照與掃描線交點x座標遞增的順序存放在一個連結串列中,就構成了活性邊表。

節點內容:

X-->Δx-->ymax-->next

x表示當前掃描線與邊的交點座標

Δx表示從當前掃描線到下一掃描線,交點x值的變化量

ymax表示該邊所交的最高掃描線的座標值

蘊含思想:

  1. 由於多邊形的邊是直線,因此Δx的值一般是定值。即x7=x6+1/k,Δx=1/k這樣(須注意考慮斜率為0的情況)
  2. 儲存ymax是希望知道該邊什麼時候不再與下一條掃描線相交,以便及時將它從有效邊表中移除,避免下一步進行不必要的運算

新邊表(New Edge Table,NET)

為了方便活性邊表的建立與更新,我們構造一個新邊表協助存放多邊形資訊。

NET節點資訊:

  • 該邊的ymax,
  • 該邊較低點的x座標xmin,
  • 該邊的斜率倒數1/k,
  • 指向下一條具有相同較低y座標的邊的指標next

NET的構造步驟:


  • 構造一個縱向連結串列,連結串列長度為多邊形所佔的最大掃描線數,該連結串列的每個節點成為一個“吊桶”,對應多邊形覆蓋的每一條掃描線
  • NET掛在與該邊低端y值相同的掃描線吊桶中,換句話講就是,存放在第一次掃到它的掃描線處

每做一次新的掃描時,我們需要對已有的邊進行三個處理:

  1. 是否被去除掉
  2. 如果不被去除,就需要對其進行資料更新,更新它的x值:x+=1/k
  3. 看有沒有新的邊進來,新的邊在NET中,可以通過插入排序插進來

演算法邏輯:

  1. 初始化NET表為空
  2. 按掃描線順序構建NET表,即將ymin=i的邊放入NET[i]
  3. 初始化AET表為空,進行如下操作
    1. a) 按掃描線順序將NET表中的邊節點NET[i]用插入排序法插入到AET表中,按x座標遞增順序排列
    2. b) 遍歷AET表,將配對交點區間填色
    3. c) 遍歷AET表,將ymax=i的節點從AET表中刪除,將ymax>i節點的x值遞增Δx
*注:若允許多邊形的邊自相交,c)之後要用氣泡排序法對AET表重新排序

多邊形掃描轉換演算法小結

掃描線演算法可以實現已知任意多邊形域邊界的填充,該填充演算法是按掃描線的順序,計算掃描線與多邊形相交出的“內”區間進行填充。

為了解決效率問題,我們用到了增量思想,連貫性思想,還建立了一套特殊的資料結構來避免求交運算。

其不足之處在於,它無法對未知邊界的多邊形進行填充,也就是說想用這套演算法,必須首先得到多邊形的幾何資訊

多邊形填充演算法擴充套件

邊緣填充演算法

邊緣填充演算法基本思想是按任意順序處理多邊形的每條邊,對處理的邊用掃描線掃描,將交點右側所有畫素取補,以此代替交點的排序、配對。根據“畫素點顏色經過偶數次取補運算後顏色不變”,因此待所有邊處理完畢後,即可完成填充。過程如圖:

 

其不足之處在於有些畫素可能被訪問多次,其效率比有效邊演算法低得多。因此我們一般不直接去用它,但它所蘊含的思想確實很精妙,下面的演算法多少都對其有所借鑑。

柵欄填充演算法

柵欄填充演算法借鑑邊緣填充演算法的思想並對其改進,其原理是用柵欄(一條過多邊形頂點並與掃描線垂直的直線)將多邊形分成兩部分,然後用掃描線與多邊形的邊求交,將所有交點依次與柵欄的中間部分取補,從而提高效率

 

(圖來自新浪部落格)

邊界標誌演算法

邊界標誌演算法其原理是對多邊形的每條邊進行掃描,並對邊界畫素打上標誌。然後再利用掃描線掃描該多邊形,對於與多邊形相交的掃描線依從左到右的順序,逐個訪問該掃描線上的畫素。用一個boolean型別inside來表示當前點是否在多邊形內。Inside的初值為假,每當當前訪問的畫素是被打上邊標誌的點時,就把inside取反。對未標誌的畫素,inside不變,然後對畫素進行填色。若inside為真,說明該畫素在多邊形內。

這個演算法的優點在於其不需建立維護邊表,當然也不用對它進行排序,更適合硬體實現,這時它的速度比有序邊錶快一兩個數量級。

需注意的是,如果一條掃描線上有兩個邊界點,就會出現“偶數次取補顏色不變”的問題,需要附加專門的程式碼進行判斷以避免該情況發生


相關推薦

計算機圖形常用演算法實現3 多邊形掃描轉換演算法-掃描線演算法

執行環境 vs2015 winform 其他環境只需要替換對應的畫點畫線演算法即可。 這個演算法其實很複雜的,實現起來需要有耐心,一步一步按照演算法思路來寫程式碼。 在演算法中,我使用的是靜態連結串列(c#沒有指標-_-||) 下面的AET為活性邊表,NET儲存新邊表 1.定義陣列,變數

圖形5多邊形掃描轉換

本模組內容絕大部分是在慕課上看中國農業大學網客時的筆記,因此算作轉載,在此鳴謝趙明、李振波兩位老師,感謝他們錄製該門課程供大家學習! X-掃描線改進演算法 由於X-掃描線演算法的效率問題,下面給出如何巧妙地避免演算法中的求交運算從而提高效率。 重要思想 進行

計算機圖形 學習筆記多邊形掃描轉換:X掃描線演算法 和 改進的X掃描線演算法

光柵圖形學演算法 2.4 多邊形掃描轉換-X掃描線演算法 多邊形的掃描轉換和區域填充這個問題是怎麼樣在離散的畫素集上表示一個連續的二維圖形? 多邊形有兩種重要的表示方法:頂點表示和點陣表示 頂點表示 頂點表示是用多邊形的頂點序列來表

計算機圖形常用演算法實現4 多邊形掃描轉換演算法-邊界標誌演算法

程式碼是在winform中執行的。 看書上這個演算法寫起來輕描淡寫的,實際上實現起來還是有很多難點的,難點如下: 1.無法判斷經過某個點的時候是不是應該變號。 2.掃描演算法畫直線的時候,可能同一行有多個點相鄰的情況,如果遇到這樣的點就變號結果會出現錯誤。 3.兩條相鄰邊的路徑可能經過同一個

圖形_多邊形掃描轉換_邊界標誌演算法

1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "

Python 邊做邊 8.5 工具類--MD5工具Md5Util

我說:”昨晚你差點把我蹬到床下去。” 她很無辜的說:“有嗎,我不知道啊~下次你蹬我好了” 需求分析 分析資料可以看出,待抓取資料中有“標籤”“分類”等資訊,這些值通用性比較強,可以只存一份,用關係表來表示其與其他資料的關係,為了查詢等方便,需要生成MD

計算幾何與圖形有關的幾種常用演算法

3.6 用向量的叉積判斷直線段是否有交         向量叉積計算的另一個常用用途是直線段求交。求交演算法是計算機圖形學的核心演算法,也是體現速度和穩定性的重要標誌,高效並且穩定的求交演算法是任何一個CAD軟體都必需要重點關注的。求交包含兩層概念,一個是判斷是否相

算法系列之九:計算幾何與圖形有關的幾種常用演算法

3.6 用向量的叉積判斷直線段是否有交        向量叉積計算的另一個常用用途是直線段求交。求交演算法是計算機圖形學的核心演算法,也是體現速度和穩定性的重要標誌,高效並且穩定的求交演算法是任何一個CAD軟體都必需要重點關注的。求交包含兩層概念,一個是判斷是否相交,另一個是

計算幾何與圖形有關的幾種常用演算法

我的專業是計算機輔助設計(CAD),算是一半機械一半軟體,《計算機圖形學》是必修課,也是我最喜歡的課程。熱衷於用程式碼擺平一切的我幾乎將這本教科書上的每種演算法都實現了一遍,這種重複勞動雖然意義不大,但是收穫很多,特別是丟棄了多年的數學又重新回到了腦袋中,算是最大的收

計算機圖形基礎 : 基本圖形生成演算法之直線的掃描轉換

學習了三種常用的直線掃描轉換演算法 :數值微分法(DDA)、中點畫線法和Bresenham畫線演算法. 注 : 本文中的程式都是假定斜率在0~1之間,其他斜率類似,做相應的簡單處理就好。 數值微分法(DDA,  Digital Differential Analyzer)

[計算機圖形經典演算法] Cohen-Sutherland 演算法 附Matlab程式碼

剛學習了計算機圖形學這門課程,為奠定根基的演算法所傾倒,特此記錄一二。 Cohen-Sutherland 演算法 編碼 Cohen-Sutherland 演算法是早期圖形學演

計算機圖形—— 隱藏線和隱藏面的消除消隱演算法

  一、概述 由於投影變換失去了深度資訊,往往導致圖形的二義性。要消除二義性,就必須在繪製時消除被遮擋的不可見的線或面,習慣上稱作消除隱藏線和隱藏面(或可見線判定、可見面判定),或簡稱為消隱。經過消隱得到的投影圖稱為物體的真實感圖形。 下面這個圖就很好體現了這種二義性。 消隱後的效果圖:

AD軟件原理圖封裝過程即由原理圖轉換到PCB

wid 文件 布線 自動 cnblogs project 空白 blog 菜單欄 第一步:先畫出你所要的原理圖 第二步:點擊菜單欄的工具→封裝管理器,進去封裝管理器頁面,點擊左邊的每一個元件, 然後選擇封裝時的元器件,再點擊右邊的確定(每一個元器件確定好封裝要用的元

Java中longLong與intInteger之間的轉換

轉化 string long tar str 基礎數據類型 ava detail 參考 一、將long型轉化為int型,這裏的long型是基礎類型: long a = 10; int b = (int)a; 二、將Long型轉換為int型,這裏

【活動報名】2050 大會 - 博客園程序員聚會5.25 杭州·雲棲小鎮

yun 相關鏈接 width ima index 博文 AR www .cn 2050 科技公益大會將於 2018.5.25 - 5.27 號在杭州·雲棲小鎮舉行(詳見大會官網),我們將在大會團聚活動中按照技術方向組織程序員的聚會,讓來自五湖四海的程序員朋

Linux學習筆記十三周二次課5月3日、4日

LNMP 復習 十三周二次課(5月3日、4日)復習LNMP擴展nginx中的root和alias區別 http://blog.csdn.net/21aspnet/article/details/6583335 nginx的alias和root配置 http://www.ttlsa.com/nginx/

oracle sql小結主要講橫列轉換的例子decode 以及case

--建表 create table kecheng( id NUMBER, name VARCHAR2(20), course VARCHAR2(20), score NUMBER); --插入資料insert into kecheng (id, name, course, score)values (1

W3Cschool高階指令碼演算法5.排列組合去重演算法挑戰

排列組合去重演算法挑戰 問題: 把一個字串中的字元重新排列生成新的字串,返回新生成的字串裡沒有連續重複字元的字串個數.連續重複只以單個字元為準 例如, aab 應該返回 2 因為它總共有6中排列 (aab, aab, aba, aba, baa, baa), 但是隻有兩

TensorFlow實戰——交通標誌牌GTSRB資料集的格式轉換

 前言:      在上一篇部落格學習瞭如何將資料集轉換成jpg檔案,本文介紹如何將資料集轉換為png的格式,以及如何將資料資訊儲存在csv檔案中,實現程式碼比上編部落格有所改進。一、格式轉換     我的訓練資料集儲存路徑如下:隨意進入一個資料夾,可以看到:    來看看測

棧的應用-四則運算中綴與字尾表示式轉換--Java原始碼

參考連結 結合原文章,做了一定修改,增加Java原始碼實現 1. 概述 對於四則運算表示式的計算,是輸入資料結構中棧的應用,即重點是中綴表示式轉換為字尾表示式 2. 字尾表示式計算 為了解釋字尾表示式的好處,我們先來