專利名稱:封閉區(qū)域的填充方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種封閉區(qū)域的填充方法,且特別涉及一種封閉區(qū)域的快速填充方法。
背景技術(shù):
請(qǐng)參照?qǐng)D1,其示出為傳統(tǒng)的封閉區(qū)域填充方法的流程圖。首先,得到路徑上的頂點(diǎn)的坐標(biāo),如步驟110所示。這些頂點(diǎn)例如是第2圖所示的頂點(diǎn)。然后,找出包含所有頂點(diǎn)的最小矩形,如步驟120所示。接著,在內(nèi)存中開辟一塊區(qū)域,與頂點(diǎn)所分布的最小矩形的區(qū)域相對(duì)應(yīng)(一個(gè)byte對(duì)應(yīng)一個(gè)像素),如步驟130所示。接著,在內(nèi)存區(qū)域中,將封閉區(qū)域之外的所有點(diǎn)、封閉區(qū)域之內(nèi)的所有點(diǎn)、路徑的頂點(diǎn)、斜邊 (包含垂直邊,不包含頂點(diǎn))和水平邊(不包含頂點(diǎn))以不同的值來標(biāo)識(shí),如步驟140所示。接著,逐行逐點(diǎn)掃描,根據(jù)當(dāng)前點(diǎn)的位置和當(dāng)前點(diǎn)所被標(biāo)識(shí)的值來判斷是否為填充線段的端點(diǎn),如步驟150所示。最后,根據(jù)上面得到的填充線段的端點(diǎn)的值來填充此封閉區(qū)域,如步驟160所示。
以一個(gè)由100個(gè)頂點(diǎn)組成封閉路徑為例,這些頂點(diǎn)分布在長(zhǎng)寬為100×100(單位像素)的區(qū)域上。在舊算法的第3步中,在判斷一個(gè)點(diǎn)是否為封閉區(qū)域的內(nèi)部的點(diǎn)時(shí),需要將此點(diǎn)的坐標(biāo)(共100×100個(gè)點(diǎn))與路徑上的所有頂點(diǎn)(共100個(gè)頂點(diǎn))的坐標(biāo)相比較,看其是否是路徑的頂點(diǎn)。僅此一項(xiàng),就需要判斷約(100×100)×100次,即1000000次。大部分時(shí)間被消耗在這樣的運(yùn)算上。在步驟150中,判斷當(dāng)前點(diǎn)是否為填充線段的端點(diǎn)時(shí),需要對(duì)這100×100個(gè)點(diǎn)逐一進(jìn)行判斷,運(yùn)算量較大。
在步驟130中,需要在內(nèi)存中開辟一塊區(qū)域(100×100byte)與頂點(diǎn)所分布的長(zhǎng)寬為100×100(單位像素)的區(qū)域?qū)?yīng)。當(dāng)頂點(diǎn)分布的區(qū)域很大時(shí),將占用大量的內(nèi)存空間。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的就是在提供一種封閉區(qū)域的快速填充方法。
根據(jù)本發(fā)明的目的,提出一種封閉區(qū)域的填充方法。封閉區(qū)域是包圍在由多個(gè)頂點(diǎn)形成的封閉路徑。本方法包括以下步驟。首先,產(chǎn)生路徑鏈表。路徑鏈表包括多個(gè)節(jié)點(diǎn),各節(jié)點(diǎn)用以記錄封閉路徑上的頂點(diǎn)或封閉路徑上的各頂點(diǎn)之間的多個(gè)中介點(diǎn)。接著,依據(jù)路徑鏈表產(chǎn)生填充數(shù)組鏈表。填充數(shù)組鏈表用以記錄多個(gè)填充線段,各填充線段的兩端點(diǎn)位于封閉路徑上,且這些填充線段位于封閉區(qū)域內(nèi)。最后,依據(jù)這些填充線段填充此封閉區(qū)域。
根據(jù)本發(fā)明的填充方法,具有以下優(yōu)點(diǎn)1.降低運(yùn)算量a.不用如同傳統(tǒng)方法需對(duì)封閉區(qū)域內(nèi)的所有像素逐點(diǎn)判斷,而只對(duì)封閉路徑上的像素進(jìn)行判斷,因此可以降低運(yùn)算量。b.沒有復(fù)雜的乘除計(jì)算,大多為簡(jiǎn)單的數(shù)值比較,因此可以降低運(yùn)算量。2.降低內(nèi)存的需求傳統(tǒng)方法需要一塊內(nèi)存,與包圍所有頂點(diǎn)的最小矩形的所有像素對(duì)應(yīng),因此需要耗費(fèi)較多的內(nèi)存。而本方法只需路徑鏈表、填充數(shù)組鏈表等,需要占用的內(nèi)存較小。
為讓本發(fā)明的上述目的、特征、和優(yōu)點(diǎn)能更明顯易懂,下文特舉一較佳實(shí)施例,并配合所附圖式,作詳細(xì)說明如下圖1示出為傳統(tǒng)的封閉區(qū)域填充方法的流程圖。
圖2示出平面上的多個(gè)頂點(diǎn)分布圖。
圖3示出依照本發(fā)明的優(yōu)選實(shí)施例的一種封閉區(qū)域的填充方法的流程圖。
圖4A示出決定頂點(diǎn)的線標(biāo)志的流程圖。
圖4B示出決定頂點(diǎn)的點(diǎn)標(biāo)志的流程圖。
圖4C示出決定頂點(diǎn)的端點(diǎn)標(biāo)志的方法流程圖。
圖4D及4E示出產(chǎn)生路徑鏈表的方法流程圖。
圖5A為路徑鏈表P所鏈接的像素示意圖。
圖5B為路徑鏈表P中的內(nèi)容。
圖6A及6B示出產(chǎn)生填充數(shù)組鏈表的方法流程圖。
圖7為依照第6A及6B圖的流程所產(chǎn)生的填充數(shù)組鏈表的內(nèi)容。
圖8示出填充后的封閉區(qū)域示意圖。
具體實(shí)施例方式
圖2示出平面上的多個(gè)頂點(diǎn)分布圖。頂點(diǎn)(0)~頂點(diǎn)(10)的坐標(biāo)分別為(6,0)、(2,4)、(5,4)、(0,8)、(5,8)、(5,12)、(7,12)、(7,8)、(12,8)、(7,4)及(10,4)。最后一個(gè)頂點(diǎn)(11)也是頂點(diǎn)(0)。這些頂點(diǎn)圍成一封閉路徑,封閉路徑包圍一封閉區(qū)域。以下的說明將以第2圖的這些頂點(diǎn)為例作說明。圖3示出依照本發(fā)明的較佳實(shí)施例的一種封閉區(qū)域的填充方法的流程圖。首先接收這些頂點(diǎn),如步驟300所示。以頂點(diǎn)數(shù)組依序記錄這些頂點(diǎn)的坐標(biāo),且路徑的最后一個(gè)頂點(diǎn)即為第一個(gè)頂點(diǎn)。接著,依據(jù)這些頂點(diǎn)計(jì)算出封閉路徑上的所有介于頂點(diǎn)之間的中介點(diǎn),并將這些頂點(diǎn)及中介點(diǎn)依封閉路徑的順序存入路徑鏈表(linked list)P,如步驟400所示。然后,依據(jù)此路徑鏈表P求得填充數(shù)組鏈表G,如步驟500所示。填充數(shù)組鏈表G即記錄所需填充的水平線段的兩端的點(diǎn)。最后依據(jù)填充數(shù)組鏈表G填充此封閉區(qū)域,如步驟600所示。
在步驟400中,產(chǎn)生路徑鏈表P的方法說明如下。首先,決定各頂點(diǎn)的屬性,示于第4A圖至4C圖的流程圖。接著,計(jì)算出封閉路徑上的所有介于頂點(diǎn)之間的中介點(diǎn)并將這些頂點(diǎn)及中介點(diǎn)依封閉路徑的順序存入路徑鏈表P,示于第4D及4E圖的流程圖。
各頂點(diǎn)具有縱坐標(biāo)x、橫坐標(biāo)y,并且依據(jù)頂點(diǎn)與其它頂點(diǎn)的相對(duì)位置而有不同的屬性,以線標(biāo)志(flag)F1、點(diǎn)標(biāo)志Fp及端點(diǎn)標(biāo)志Fe表示。當(dāng)前頂點(diǎn)以頂點(diǎn)(r)表示,前一頂點(diǎn)以頂點(diǎn)(r-1)表示,后一頂點(diǎn)以頂點(diǎn)(r+1)表示。若當(dāng)前頂點(diǎn)(r)為第一個(gè),也就是頂點(diǎn)(0),則頂點(diǎn)(r-1)為頂點(diǎn)(10);同理,若當(dāng)前頂點(diǎn)(r)為頂點(diǎn)(11),則頂點(diǎn)(r+1)為頂點(diǎn)(1)。r為正整數(shù)。
圖4A示出決定頂點(diǎn)的線標(biāo)志的流程圖。線標(biāo)志F1是依據(jù)當(dāng)前頂點(diǎn)與前一頂點(diǎn)所形成的線段而決定為水平、垂直或傾斜。首先,檢查當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)是否相等,如步驟310所示。若是,表示當(dāng)前頂點(diǎn)(r)與前一頂點(diǎn)(r-1)的線段為水平,則將當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1標(biāo)示為水平,如步驟312所示,例如頂點(diǎn)(2)。否則檢查當(dāng)前頂點(diǎn)(r)的橫坐標(biāo)x(r)與前一頂點(diǎn)(r-1)的橫坐標(biāo)x(r-1)是否相等,如步驟314所示。若是,則當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1標(biāo)示為垂直,如步驟316所示,例如頂點(diǎn)(5)。若否,表示頂點(diǎn)(r)的橫坐標(biāo)x(r)與縱坐標(biāo)y(r)分別與前一頂點(diǎn)(r-1)的橫坐標(biāo)x(r-1)與縱坐標(biāo)y(r-1)不同,則將當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1標(biāo)示為傾斜,如步驟318所示,例如頂點(diǎn)(1)。
圖4B示出決定頂點(diǎn)的點(diǎn)標(biāo)志的流程圖。點(diǎn)標(biāo)志Fp是依據(jù)當(dāng)前頂點(diǎn)(r)與前一頂點(diǎn)(r-1)及后一頂點(diǎn)(r+1)的相對(duì)位置而決定為A型、C型、L1型或L2型。首先檢查當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否同時(shí)大于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)與后一頂點(diǎn)(r+1)的縱坐標(biāo)y(r+1),如步驟320所示。若是,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp是A型,例如頂點(diǎn)(0)。若否,檢查當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否同時(shí)小于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)與后一頂點(diǎn)(r+1)的縱坐標(biāo)y(r+1),如步驟324所示。若是,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp為A型,如步驟322所示。若否,檢查當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y是否介于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)與后一頂點(diǎn)(r+1)的縱坐標(biāo)y(r+1)之間,如步驟326所示。若是,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp為C型,如步驟328所示。若否,則表示當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)與前一頂點(diǎn)(r-1)或后一頂點(diǎn)(r+1)的縱坐標(biāo)相同。此時(shí),檢查當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)是否相同,如步驟330所示。若是則表示當(dāng)前頂點(diǎn)(r)與前一頂點(diǎn)(r-1)的線段為水平,進(jìn)行步驟332;否則表示當(dāng)前頂點(diǎn)(r)與后一頂點(diǎn)(r+1)的線段是水平,進(jìn)行步驟334。在步驟332中,檢查當(dāng)前頂點(diǎn)(r)的橫坐標(biāo)x是否大于前一頂點(diǎn)(r-1)的橫坐標(biāo)x。若是,則頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp是L2型,如步驟338所示,例如頂點(diǎn)(2);若否,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp是L1型,如步驟336所示。在步驟334中,檢查當(dāng)前頂點(diǎn)(r)的橫坐標(biāo)x(r)是否大于后一頂點(diǎn)(r+1)的橫坐標(biāo)x(r+1)。若是,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp是L2型,如步驟338所示;若否,則當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp是L1型,如步驟336所示。
圖4C示出決定頂點(diǎn)的端點(diǎn)標(biāo)志的方法流程圖。在步驟340中,檢查三個(gè)條件,若此三個(gè)條件之一成立,則表示頂點(diǎn)(r)的端點(diǎn)標(biāo)志Fe為真(步驟342),否則表示頂點(diǎn)(r)的端點(diǎn)標(biāo)志Fe為偽(步驟344)。第一條件為當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)小于后一頂點(diǎn)(r+1)的縱坐標(biāo)y(r+1),且大于等于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)。第二條件為當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)小于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1),且大于等于后一頂點(diǎn)(r+1)的縱坐標(biāo)y(r+1)。第三條件為當(dāng)前頂點(diǎn)(r)的點(diǎn)標(biāo)志Fp為A型或C型。若端點(diǎn)標(biāo)志Fe為真,表示頂點(diǎn)(r)是填充線段的端點(diǎn)。重復(fù)圖4A至4C所示的流程,直到所有的頂點(diǎn)皆已求得其線標(biāo)志F1、點(diǎn)標(biāo)志Fp及端點(diǎn)標(biāo)志Fe。
接下來要計(jì)算出封閉路徑上的所有介于頂點(diǎn)之間的中介點(diǎn),并將這些頂點(diǎn)及中介點(diǎn)依封閉路徑的順序存入路徑鏈表P。圖4D及4E示出產(chǎn)生路徑鏈表的方法流程圖。依據(jù)當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1而決定求得中介點(diǎn)的方法及插入路徑鏈表P的順序。在步驟350中,判斷當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1是否為水平,若是則執(zhí)行步驟352。在步驟354中,判斷當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1是否為垂直,若是則執(zhí)行步驟356~362。若步驟350與354的判斷結(jié)果皆否,則當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1為傾斜,執(zhí)行步驟363~368。
若當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1為水平,則將當(dāng)前頂點(diǎn)(r)插入路徑鏈表P的末尾(步驟352),并執(zhí)行步驟370以判斷當(dāng)前頂點(diǎn)(r)是否插入路徑鏈表P。也就是說,頂點(diǎn)(r)與頂點(diǎn)(r-1)的線段若為水平,則不將其中介點(diǎn)記錄在路徑鏈表P。
若當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1為垂直,首先在步驟356中判斷當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否大于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1),也就是頂點(diǎn)(r)在頂點(diǎn)(r-1)的下方,且當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)之差大于2,也就是頂點(diǎn)(r)與頂點(diǎn)(r-1)之間有中介點(diǎn)。若是,則依序?qū)㈨旤c(diǎn)(r-1)至頂點(diǎn)(r)之間的中介點(diǎn)插入路徑鏈表P,也就是依縱坐標(biāo)遞增的順序(步驟358);否則進(jìn)入步驟360。在步驟360中判斷當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否小于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1),也就是頂點(diǎn)(r)在頂點(diǎn)(r-1)的上方,且當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)之差大于2,也就是頂點(diǎn)(r)與頂點(diǎn)(r-1)之間有中介點(diǎn)。若是則依序?qū)㈨旤c(diǎn)(r-1)至頂點(diǎn)(r)之間的中介點(diǎn)插入路徑鏈表P,也就是依縱坐標(biāo)遞減的順序(步驟358);否則進(jìn)入步驟370。
若當(dāng)前頂點(diǎn)(r)的線標(biāo)志F1為傾斜,首先在步驟363中判斷當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否大于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1),也就是頂點(diǎn)(r)在頂點(diǎn)(r-1)的下方,且當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)之差大于2,也就是頂點(diǎn)(r)與頂點(diǎn)(r-1)之間有中介點(diǎn)。若是則依序?qū)㈨旤c(diǎn)(r-1)至頂點(diǎn)(r)之間的中介點(diǎn)插入路徑鏈表P,也就是依縱坐標(biāo)遞增的順序(步驟364);否則進(jìn)入步驟366。這些中介點(diǎn)是依據(jù)頂點(diǎn)(r)與頂點(diǎn)(r-1)的直線方程式求得。在步驟366中判斷當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)是否小于前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1),也就是頂點(diǎn)(r)在頂點(diǎn)(r-1)的上方,且當(dāng)前頂點(diǎn)(r)的縱坐標(biāo)y(r)與前一頂點(diǎn)(r-1)的縱坐標(biāo)y(r-1)之差大于2,也就是頂點(diǎn)(r)與頂點(diǎn)(r-1)之間有中介點(diǎn)。若是則依序?qū)㈨旤c(diǎn)(r-1)至頂點(diǎn)(r)之間的中介點(diǎn)插入路徑鏈表P,也就是依縱坐標(biāo)遞減的順序(步驟368);否則進(jìn)入步驟370。這些中介點(diǎn)是依據(jù)頂點(diǎn)(r)與頂點(diǎn)(r-1)的直線方程式求得。在步驟370中,若當(dāng)前頂點(diǎn)(r)并非路徑最后的頂點(diǎn),則將頂點(diǎn)(r)插入路徑鏈表P的末端。重復(fù)第4D及4E圖所示的方法,直到所有頂點(diǎn)及中介點(diǎn)皆已按照封閉路徑的順序存入路徑鏈表P。
圖5A為路徑鏈表P所鏈接的像素示意圖。除了頂點(diǎn),頂點(diǎn)之間的中介點(diǎn)亦被求出,且水平線上的兩頂點(diǎn)是不記錄其間的中介點(diǎn),例如頂點(diǎn)(1)與頂點(diǎn)(2)之間是沒有記錄中介點(diǎn)。圖5B為路徑鏈表P中的內(nèi)容。路徑鏈表P中的每個(gè)元素即對(duì)應(yīng)到一個(gè)頂點(diǎn)或一個(gè)中介點(diǎn),每個(gè)元素包括有橫坐標(biāo)x、縱坐標(biāo)y、索引index、點(diǎn)標(biāo)志Fp、端點(diǎn)標(biāo)志Fe及指標(biāo)next。索引index用以記錄每個(gè)頂點(diǎn)的順序,中介點(diǎn)的索引index則均為-1,例如頂點(diǎn)(0)的索引index即為0。中介點(diǎn)的點(diǎn)標(biāo)志Fp皆為C型。端點(diǎn)標(biāo)志Fe若為真,則在路徑鏈表P中以1表示,否則以0表示。指標(biāo)next用以指向下一個(gè)節(jié)點(diǎn)。各元素即依封閉路徑的順序依序鏈接。
再來將對(duì)步驟500中產(chǎn)生填充數(shù)組鏈表的方法作詳細(xì)說明。首先依據(jù)封閉路徑的高度h申請(qǐng)一塊填充數(shù)組鏈表G。在本例中,h是13。填充數(shù)組鏈表G的每一個(gè)數(shù)組是對(duì)應(yīng)一個(gè)鏈表,一個(gè)鏈表是對(duì)應(yīng)至同一列的像素。例如G
是對(duì)應(yīng)縱坐標(biāo)y=0的像素,G[1]是對(duì)應(yīng)縱坐標(biāo)y=1的像素,...,G[12]是對(duì)應(yīng)縱坐標(biāo)y=12的像素。另外,G[13]所指向的鏈表則用來記錄封閉路徑上所有的水平線。每個(gè)G[]所指向的鏈表包括填充線段的兩個(gè)端點(diǎn)。依據(jù)填充線段即可填充這些頂點(diǎn)所包圍的封閉區(qū)域。圖6A及6B示出產(chǎn)生填充數(shù)組鏈表G的方法流程圖。封閉路徑上的所有頂點(diǎn)及中介點(diǎn),也就是路徑鏈表P的各節(jié)點(diǎn),都依序依此方法填入填充數(shù)組鏈表G。首先檢查節(jié)點(diǎn)是否為中介點(diǎn)(步驟512),若是則將此節(jié)點(diǎn)依其縱坐標(biāo)y寫入對(duì)應(yīng)的填充數(shù)組鏈表G[y](步驟514),若否表示此節(jié)點(diǎn)為頂點(diǎn)。在步驟520中,檢查此頂點(diǎn)的點(diǎn)標(biāo)志Fp是否為A型,若是則依其縱坐標(biāo)y寫入對(duì)應(yīng)的填充數(shù)組鏈表G[y]兩次。因點(diǎn)標(biāo)志Fp若為A型,例如是第2圖中的頂點(diǎn)A,表示同一條水平線只有這一點(diǎn),所以寫入兩次表示此填充線段的起點(diǎn)與終點(diǎn)是同一點(diǎn)。再來則檢查頂點(diǎn)的點(diǎn)標(biāo)志Fp是否為L(zhǎng)1或L2型(步驟530)若是,表示此頂點(diǎn)是位于封閉路徑的水平線段上,進(jìn)行步驟532,否則進(jìn)行步驟540。在步驟532中,將此頂點(diǎn)寫入填充數(shù)組鏈表G[h],接著將填充數(shù)組鏈表G[h]中的此頂點(diǎn)的端點(diǎn)標(biāo)志Fe改成真(步驟534)。然后檢查路徑鏈表P中的此頂點(diǎn)的端點(diǎn)標(biāo)志Fe是否為真(步驟536),若是則將此頂點(diǎn)依其縱坐標(biāo)y寫入對(duì)應(yīng)的填充數(shù)組鏈表G[y](步驟538)。若頂點(diǎn)的點(diǎn)標(biāo)志Fp為C型,則將此頂點(diǎn)依其縱坐標(biāo)y寫入對(duì)應(yīng)的填充數(shù)組鏈表G[y](步驟540)。
圖7示出依照?qǐng)D6A及6B的流程所產(chǎn)生的填充數(shù)組鏈表的內(nèi)容。填充數(shù)組鏈表G
是對(duì)應(yīng)至y=0的填充線段(6,0)(6,0),填充數(shù)組鏈表G[1]是對(duì)應(yīng)至y=1的填充線段(5,1)(7,1),填充數(shù)組鏈表G[2]是對(duì)應(yīng)至y=2的填充線段(4,2)(8,2),填充數(shù)組鏈表G[3]是對(duì)應(yīng)至y=3的填充線段(3,3)(9,3),...,填充數(shù)組鏈表G[11]是對(duì)應(yīng)至y=11的填充線段(5,11)(7,11)。填充數(shù)組鏈表G[12]是對(duì)應(yīng)至y=12的填充線段,此處并無填充線段。填充數(shù)組鏈表G[h],也就是G[13],是水平鏈表,用來記錄封閉路徑上所有的水平線(2,4)(5,4)、(0,8)(5,8)、(5,12)(7,12)(7,8)(12,8)及(7,4)(10,4)。
最后依據(jù)填充數(shù)組鏈表G填充封閉區(qū)域。請(qǐng)參照?qǐng)D8,其示出為填充后的封閉區(qū)域示意圖。依據(jù)填充數(shù)組鏈表G可以得到填充線段的端點(diǎn)坐標(biāo),將各填充線段的端點(diǎn)以特定的顏色連接,將所有的填充線段及封閉路徑上的水平線段著色完畢,也就完成了封閉區(qū)域的填充。
本發(fā)明上述實(shí)施例所公開的封閉區(qū)域的填充方法,具有以下優(yōu)點(diǎn)1.降低運(yùn)算量a.不用如同傳統(tǒng)方法需對(duì)封閉區(qū)域內(nèi)的所有像素逐點(diǎn)判斷,而只對(duì)封閉路徑上的像素進(jìn)行判斷,因此可以降低運(yùn)算量。
b.沒有復(fù)雜的乘除計(jì)算,大多為簡(jiǎn)單的數(shù)值比較,因此可以降低運(yùn)算量。
2.降低內(nèi)存的需求傳統(tǒng)方法需要一塊內(nèi)存,與包圍所有頂點(diǎn)的最小矩形的所有像素對(duì)應(yīng),因此需要耗費(fèi)較多的內(nèi)存。而本方法只需路徑鏈表、填充數(shù)組鏈表等,需要占用的內(nèi)存較小。
綜上所述,雖然本發(fā)明按照上述優(yōu)選實(shí)施例公開,然而并非用以限定本發(fā)明,任何本領(lǐng)域的技術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),可改變或者改進(jìn),因此本發(fā)明的保護(hù)范圍以權(quán)利要求書所述為準(zhǔn)。
權(quán)利要求
1.一種封閉區(qū)域的填充方法,該封閉區(qū)域是包圍在由多個(gè)頂點(diǎn)形成的封閉路徑,依據(jù)位于封閉路徑上的順序,各該頂點(diǎn)具有前一頂點(diǎn)與后一頂點(diǎn),該方法包括產(chǎn)生路徑鏈表,該路徑鏈表包括多個(gè)節(jié)點(diǎn),各該節(jié)點(diǎn)用以記錄該封閉路徑上的這些頂點(diǎn)與該封閉路徑上的各這些頂點(diǎn)之間的多個(gè)中介點(diǎn)之一;依據(jù)該路徑鏈表產(chǎn)生填充數(shù)組鏈表,用以記錄多個(gè)填充線段,各這些填充線段的兩端點(diǎn)是位于該封閉路徑上,且這些填充線段位于該封閉區(qū)域內(nèi);以及依據(jù)這些填充線段填充該封閉區(qū)域。
2.如權(quán)利要求1所述的填充方法,其中產(chǎn)生該路徑鏈表的步驟包括a1.依據(jù)該前一頂點(diǎn)與該頂點(diǎn)的相對(duì)位置決定該頂點(diǎn)的線標(biāo)志為水平、垂直及傾斜之一;a2.若該頂點(diǎn)與該前一頂點(diǎn)之間存在有中介點(diǎn),則依據(jù)該頂點(diǎn)的該線標(biāo)志將該頂點(diǎn)與該前一頂點(diǎn)之間的中介點(diǎn)插入該路徑鏈表;以及a3.若該頂點(diǎn)并非該封閉路徑上的最后的該頂點(diǎn),則將該頂點(diǎn)插入該路徑鏈表的末端。
3.如權(quán)利要求2所述的填充方法,其中在步驟a2中,若該頂點(diǎn)的該線標(biāo)志為水平,則不記錄該頂點(diǎn)與該前一頂點(diǎn)之間的這些中介點(diǎn)。
4.如權(quán)利要求2所述的填充方法,其中在步驟a2中,若該頂點(diǎn)的該線標(biāo)志為垂直,且該頂點(diǎn)的縱坐標(biāo)大于該前一頂點(diǎn)的縱坐標(biāo),將該前一頂點(diǎn)與該頂點(diǎn)之間的這些中介點(diǎn)依其縱坐標(biāo)遞增的順序插入該路徑鏈表的尾。
5.如權(quán)利要求2所述的填充方法,其中在步驟a2中,若該頂點(diǎn)的該線標(biāo)志為垂直,且該頂點(diǎn)的該縱坐標(biāo)小于該前一頂點(diǎn)的縱坐標(biāo),且該頂點(diǎn)與該前一頂點(diǎn)之間有中介點(diǎn),將該前一頂點(diǎn)與該頂點(diǎn)之間的這些中介點(diǎn)依其縱坐標(biāo)遞減的順序插入該路徑鏈表的尾。
6.如權(quán)利要求2所述的填充方法,其中在步驟a2中,若該頂點(diǎn)的該線標(biāo)志為傾斜,且該頂點(diǎn)的縱坐標(biāo)大于該前一頂點(diǎn)的縱坐標(biāo),則將該前一頂點(diǎn)與該頂點(diǎn)之間的這些中介點(diǎn)依其縱坐標(biāo)遞增的順序插入該路徑鏈表的尾。
7.如權(quán)利要求2所述的填充方法,其中在步驟a2中,若該頂點(diǎn)的該線標(biāo)志為傾斜,且該頂點(diǎn)的縱坐標(biāo)小于該前一頂點(diǎn)的縱坐標(biāo),則將該前一頂點(diǎn)與該頂點(diǎn)之間的這些中介點(diǎn)依其縱坐標(biāo)遞減的順序插入該路徑鏈表的尾。
8.如權(quán)利要求7所述的填充方法,其中在步驟a2中,這些中介點(diǎn)依序通過該頂點(diǎn)與該前一頂點(diǎn)的線性方程式而得。
9.如權(quán)利要求2所述的填充方法,其中在步驟a1中,若該頂點(diǎn)的該橫坐標(biāo)與前一該頂點(diǎn)的該橫坐標(biāo)相等,則該頂點(diǎn)的該線標(biāo)志為水平。
10.如權(quán)利要求2所述的填充方法,其中在步驟a1中,若該頂點(diǎn)的該縱坐標(biāo)與該前一頂點(diǎn)的該縱坐標(biāo)相等,則該該頂點(diǎn)的該線標(biāo)志為垂直。
11.如權(quán)利要求2所述的填充方法,其中在步驟a1中,若該頂點(diǎn)的該橫坐標(biāo)與前一該頂點(diǎn)的該橫坐標(biāo)不等,且該頂點(diǎn)的該縱坐標(biāo)與該前一頂點(diǎn)的該縱坐標(biāo)不等,則該頂點(diǎn)的該線標(biāo)志是傾斜。
12.如權(quán)利要求1所述的填充方法,其中該填充數(shù)組鏈表具有多個(gè)線段鏈表,各該線段鏈表用以記錄這些填充線段之一。
13.如權(quán)利要求12所述的填充方法,其中這些填充線段是水平。
14.如權(quán)利要求13所述的填充方法,其中在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該中介點(diǎn),則依該中介點(diǎn)的縱坐標(biāo)將該中介點(diǎn)記錄至對(duì)應(yīng)的該線段鏈表。
15.如權(quán)利要求13所述的填充方法,其中在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該頂點(diǎn),且該頂點(diǎn)的該縱坐標(biāo)大于該前一頂點(diǎn)的該縱坐標(biāo)與該后一頂點(diǎn)的該縱坐標(biāo),則依該頂點(diǎn)的縱坐標(biāo)將該頂點(diǎn)記錄于對(duì)應(yīng)的該線段鏈表兩次。
16.如權(quán)利要求13所述的填充方法,其中在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該頂點(diǎn),且該頂點(diǎn)的該縱坐標(biāo)小于該前一頂點(diǎn)的該縱坐標(biāo)與該后一頂點(diǎn)的該縱坐標(biāo),則依該頂點(diǎn)的縱坐標(biāo)將該頂點(diǎn)記錄在對(duì)應(yīng)的該線段鏈表兩次。
17.如權(quán)利要求13所述的填充方法,其中該填充數(shù)組鏈表更包括水平鏈表,用以記錄該封閉路徑上的至少一個(gè)水平線段。
18.如權(quán)利要求17所述的填充方法,其中在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該頂點(diǎn),且該頂點(diǎn)與該前一頂點(diǎn)和該后一頂點(diǎn)之一形成該水平線段,則將該頂點(diǎn)記錄至該填充數(shù)組鏈表的該水平鏈表。
19.如權(quán)利要求17所述的填充方法,在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該頂點(diǎn),且該頂點(diǎn)與該前一頂點(diǎn)形成該水平線段,則依據(jù)該頂點(diǎn)的縱坐標(biāo)將該頂點(diǎn)記錄至對(duì)應(yīng)的該線段鏈表。
20.如權(quán)利要求13所述的填充方法,在產(chǎn)生該填充數(shù)組鏈表的步驟中,若該路徑鏈表的該節(jié)點(diǎn)是該頂點(diǎn),且該頂點(diǎn)的該縱坐標(biāo)介于該前一頂點(diǎn)(r-1)的縱坐標(biāo)與該后一頂點(diǎn)的縱坐標(biāo)之間,則依該頂點(diǎn)的縱坐標(biāo)將該頂點(diǎn)記錄至對(duì)應(yīng)的該線段鏈表。
21.如權(quán)利要求13所述的填充方法,其中在填充該封閉區(qū)域的步驟中,是各別填充這些線段鏈表所記錄的這些填充線段。
22.如權(quán)利要求17所述的填充方法,其中在填充該封閉區(qū)域的步驟中,是各別填充這些線段鏈表所記錄的這些填充線段,及該水平鏈表所記錄的該至少一個(gè)水平線段。
全文摘要
一種封閉區(qū)域的填充方法。封閉區(qū)域系包圍于由多個(gè)頂點(diǎn)形成的封閉路徑。本方法包括以下步驟。首先,產(chǎn)生路徑鏈表。路徑鏈表包括多個(gè)節(jié)點(diǎn),各節(jié)點(diǎn)用以記錄封閉路徑上的頂點(diǎn)或封閉路徑上的各頂點(diǎn)之間的多個(gè)中介點(diǎn)。接著,依據(jù)路徑鏈表產(chǎn)生填充數(shù)組鏈表。填充數(shù)組鏈表用以記錄多個(gè)填充線段,各填充線段的兩端點(diǎn)是位于封閉路徑上,且這些填充線段位于封閉區(qū)域內(nèi)。最后,依據(jù)這些填充線段填充此封閉區(qū)域。
文檔編號(hào)G06T11/20GK1549207SQ03136709
公開日2004年11月24日 申請(qǐng)日期2003年5月21日 優(yōu)先權(quán)日2003年5月21日
發(fā)明者李漢洲 申請(qǐng)人:明基電通股份有限公司