掃描多邊形填充算法

转载 2012年09月29日 22:33:48

http://www.cnblogs.com/carekee/articles/1769714.html

多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,一個首要的問題就是求出多邊形所佔據的柵格象素,判斷一個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們采用掃描線多邊形填充算法

掃描多邊形填充算法的基本原理——在直角坐標系中,假設有一條從左至右的掃描線穿過多邊形,從左至右開始計數,與多邊形交點為奇數時,開始進入多邊形,與多邊形交點為偶數時,走出多邊形。這樣在這相鄰配對的奇偶交點間的所有象素都在多邊形內。如圖,奇數交點ac,都是進入多邊形,偶數交點bd都是走出多邊形,相鄰的奇偶交點配對,ab之間,cd之間的象素都在多邊形內,可見一條掃描線上,與多邊形交點個數需要為偶數。依據這樣的思路,掃描線從上到下,從左到右依次掃過多邊形即可求得多邊形所佔據的象素。(注意退化情況的處理,也就是掃描線剛好經過頂點或者多邊形的邊本身就是水平的情況)


具體實現——首先,求多邊形最上,最下的行號,以便於確定掃描線的行數,這個可以根據多邊形的MBR求得;其次,確定一條掃描線上,與多邊形的交點,保證交點個數為偶數,並對這些交點按列號從小到大排列;最後,掃描轉換,掃描線從上到下,每條掃描線從左到右,對這些排序好的奇偶點配對連線。所采用的數據結構類似於「鋸齒狀的二維數組」,第一維代表行號,第二維代表一行中的交點。為了實現以上的步驟,需要對多邊形邊界進行柵格化,確定邊界所經過的柵格,並把這些存儲為「鋸齒狀的二維數組」(柵格化方法有:數值微分法,Bresenham算法,柵格中心線求交法)。退化情況的處理:

一、邊線端點的處理。比較此端點與它相鄰的前後兩端點所在掃描線的行號,設此端點的行號為h0,前一端點的行號為h1,後一端點的行號為h2。

1)        h0>h1 and h0>h2,如圖,點A、C、F,這些端點的柵格點不予以記錄,即掃描線經過該點,計交點為0。

2)        h0<h1 and h0<h2,如圖,點B、E、G,這些端點的柵格點記錄兩次,即掃描線經過該點,計交點為2。

3)        h0<h1 and h0>h2 or h0>h1 and h0<h2,如圖,點D,H,這些端點的柵格點記錄一次,即掃描線經過該點,計交點為1。


二、水平線的處理。多邊形邊線段,掃描出來為一橫線,即一條線段從頭到尾都佔據一行柵格。理論上,這種情況與掃描線有無數個交點,為了保持一行中交點個數為偶數,判斷當前橫線段與前後相鄰兩條線段的位置關系,同時先柵格化此橫線,作以下規定。

1)        前後相鄰兩線段位於此橫線段的異側,如圖,橫線段AB,前後兩線段AIBC位於橫線段AB的異側,則與此橫線段交點計為1,記錄A點或者B點,均可。

2)        前後相鄰兩線段位於此橫線段的同側,如圖,橫線段GF,前後兩線段GHFE位於橫線段GF的同側,則與此橫線段交點計為0,不記錄任何交點。


這種判斷的思想是這樣的:基於動態的思想,橫線AB,假設A和B兩點相互靠近,最終成為一點,假設為A『,根據端點處理的方法,A』介於前後兩點I、C之間,應計交點一個,而對於橫線GF,一樣的道理,GF相互靠近最終成為一點,假設為F『,根據端點處理的方法,F』大於前後兩點E、H,應計交點0。這種判斷可以有效處理橫線,但又帶來一個新的問題,如果相鄰前或者後兩線段也是同此橫線一樣,也是在這一行水平,這樣就要遞推到更前或者更後的線段,直到找出以上判斷的條件。


如圖,判斷線段AB,需要找到前一條線段AJ,後一條線段BC,由於BC與AB都是水平的,需要找再下一條CD,得到AJ、CD位於水平線的異側,則計交點為1。判斷線段GH,前後兩線段GF、HI都是水平的,需要分別尋找更前,、更後的線段FE、IJ,一直遞歸下去,直到確定判斷條件。如果覺得這種情況比較麻煩,在程序端點循環的時候,找到第一段不是橫線的起點開始循環,這樣,只要判斷,橫線後面條線段的情況,直到確定判斷條件即可。


边界扫描/JTAG

JTAG,边界扫描测试的一个标准协议。大多边界扫描测试,都是通过JTAG接口实现的。边界扫描测试的原理_百度文库 http://wenku.baidu.com/link?url=dF_gVFxttT...
  • u011729865
  • u011729865
  • 2016年10月08日 13:51
  • 1067

如何讓Windows在開機時做磁碟掃描及修復

Windows裡面有磁碟掃描程式,號稱可以檢查磁碟分割區是否有錯誤,而要讓Windows在開機檢查的方式,其實還蠻簡單的,只要照著下列兩個步驟做就可以了。 Step1. 在要掃描的磁碟分割區上...
  • shuixin536
  • shuixin536
  • 2012年12月31日 12:04
  • 591

shell ip扫描

#shell script echo ping扫描 echo 开始扫描... echo 获取本机IP... myip=`ifconfig eth0 | awk '{print $2}'...
  • agoago_2009
  • agoago_2009
  • 2012年08月24日 22:32
  • 914

插件如何安装到WeX5

三、插件如何安装到WeX5这里以常用的条形码扫描为例介绍。 http://plugins.cordova.io/#/package/com.phonegap.plugins.barcodescanne...
  • pilot10
  • pilot10
  • 2016年03月10日 09:24
  • 1273

Android "QR二维码扫描"

支持开灯 扫描结果 支持 复制、分享、浏览打开(超链接) 自动保存扫描记录 划动删除 图和源码 git: http://git.oschina.net/892642257/QRCode csdn(...
  • OnlyOneCoder
  • OnlyOneCoder
  • 2014年08月04日 17:17
  • 3613

掃描工作原理

条码阅读器 条码阅读器是用于读取条码所包含的信息的设备,条码阅读器的结构通常为以下几部分:光源、接收装置、光电转换部件、译码电路、计算机接口。它们的基本工作原理为:由光源发出的光线经过光学系统照射到...
  • hongkonglife
  • hongkonglife
  • 2014年03月17日 21:53
  • 356

WEB Apache漏洞扫描

修改 httpd.conf 文件 寻找以下文字(多处) Options IndexesFollowSymLinks 修改为 OptionsFollowSymLinks 若版本低可以修改为...
  • oyzl68
  • oyzl68
  • 2012年09月26日 10:00
  • 1708

关于cookie与网络安全的一些学习

cookie: cookie只能被放置它的网站读取,这一点是浏览器保证的,也是浏览器的一个重要安全机制。-----用靠谱的浏览器。 cookie在传输过程中和网站方都有可能被窃取。 cookie...
  • u012063507
  • u012063507
  • 2015年11月25日 11:16
  • 504

神州数码易拓TIPTOP ERP集成扫描仪、高拍仪程序

4gl调用web程序代码 #扫描 WHEN "scanning" IF cl_chk_act_auth() THEN IF cl_null(g_oga.oga01) ...
  • wahaa591
  • wahaa591
  • 2015年04月29日 16:17
  • 1305

JTAG/边界扫描 —— 它可以为你做些什么?

原文链接:http://www.elexcon.com/news/41790.html 自从集成电路出现以来,对其功能的检查一直以来都很有必要。对于数字电路,测试很简单:相继应用所有可能的测试矢...
  • u014276460
  • u014276460
  • 2015年10月22日 11:30
  • 3930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:掃描多邊形填充算法
举报原因:
原因补充:

(最多只允许输入30个字)