本發(fā)明涉及圖形處理技術(shù)領(lǐng)域,特別涉及一種弧段多邊形二維布爾運(yùn)算方法。
背景技術(shù):
二維布爾運(yùn)算是計算幾何和計算機(jī)圖形學(xué)的重要內(nèi)容之一,它的主要功能與結(jié)果是簡單的圖形經(jīng)布爾運(yùn)算后可以得到復(fù)雜圖形,在機(jī)械零件設(shè)計、建筑平面設(shè)計、船舶制造等很多領(lǐng)域都有廣泛的應(yīng)用。作為一種最常用、最基礎(chǔ)的算法工具,二維布爾運(yùn)算在PCB電路板制造行業(yè)也有著廣泛應(yīng)用。
現(xiàn)有的二維布爾運(yùn)算算法一般用“環(huán)”的形式描述圖形邊界,例如目前被廣泛應(yīng)用的二維布爾運(yùn)算開源庫Clipper,是一個非常精致的二維布爾運(yùn)算的庫,但是它和其它同類二維布爾運(yùn)算庫都有共同的缺點,就是不能處理曲線,需要將曲線切割成近似的多段直線段后才能處理。這樣既增加了數(shù)據(jù)量,又改變了數(shù)據(jù)類型,處理過程復(fù)雜?,F(xiàn)有技術(shù)也有采用三維布爾運(yùn)算庫來實現(xiàn)二維布爾運(yùn)算需求,但是三維庫容量大、成本高、價格昂貴。
技術(shù)實現(xiàn)要素:
針對以上問題,本發(fā)明專利目的在于設(shè)計了一種弧段多邊形二維布爾運(yùn)算方法,能有效解決曲線類二維圖形布爾運(yùn)算,成本低、運(yùn)算快。
本發(fā)明具體的技術(shù)方案如下:
一種弧段多邊形二維布爾運(yùn)算方法,包括:
步驟S101,依次讀入主體A和主體B的數(shù)據(jù),剔除主體A和主體B多余的共線點;
步驟S102,計算主體A和主體B的島、洞,以及每個島、洞對應(yīng)的交點和子邊的數(shù)據(jù),并計算島的最低子邊;
步驟S103,創(chuàng)建島和洞與自身對應(yīng)的交點的哈希映射關(guān)系,為每個交點建立其與子邊的映射關(guān)系;
步驟S104,通過迭代算法計算每個島和洞的子邊的繞數(shù)值;
步驟S105,通過所述繞數(shù)值進(jìn)行主體A和主體B的并集、差集、交集布爾運(yùn)算。
具體的,本發(fā)明所述島為封閉逆時針方向走向多邊形;所述洞為所述島內(nèi)的順順時針方向多邊形;所述交點為所述多邊形兩兩邊段的銜接點或相交點;所述子邊為兩個所述交點間的邊段。
具體的,本發(fā)明所述創(chuàng)建島和洞與自身對應(yīng)的交點的哈希映射關(guān)系,為每個交點建立其與子邊的映射關(guān)系,具體包括:
使用迭代法建立每個交點與子邊的映射關(guān)系。
具體的,本發(fā)明所述通過迭代算法計算每個島和洞的子邊的繞數(shù)值,具體包括:
定義繞數(shù)值為子邊被多邊形環(huán)繞的次數(shù);
子邊的繞數(shù)初始值為0,若子邊被某多邊形環(huán)繞,如果所述多邊形是逆時針,那么子邊的繞數(shù)值加1;如果所述多邊形是順時針,那么子邊的繞數(shù)值減1。
本發(fā)明提供的弧段多邊形二維布爾運(yùn)算方法與現(xiàn)有技術(shù)相比,能解決曲線類二維圖形布爾運(yùn)算,且精小成本低,運(yùn)算強(qiáng)大高效。
附圖說明
以下參照附圖對本發(fā)明實施例作進(jìn)一步說明,其中:
圖1是本發(fā)明的拓?fù)涠x圖;
圖2是本發(fā)明的布爾運(yùn)算圖;
圖3是本發(fā)明的流程圖;
圖4是本發(fā)明的數(shù)據(jù)計算處理流程圖;
圖5是本發(fā)明的建立映射關(guān)系流程圖;
圖6是本發(fā)明的子邊繞數(shù)值計算流程圖;
圖7是本發(fā)明的計算結(jié)果流程圖。
具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進(jìn)一步的詳細(xì)說明。
本發(fā)明提出了一種弧段多邊形二維布爾運(yùn)算方法,能解決曲線類二維圖形布爾運(yùn)算。
請參閱圖1,相關(guān)的拓?fù)涠x如下:
島Island:封閉逆時針方向走向多邊形;
洞Hole:島內(nèi)的順順時針方向多邊形;
交點Interaction:多邊形兩兩邊段的銜接點及兩兩邊段的相交點統(tǒng)稱交點;
子邊Edge:兩交點間的邊段。
每個二維實體必須有僅有一個島,島內(nèi)可包含多個洞。
請參閱圖2,本發(fā)可實現(xiàn)三種布爾運(yùn)算操作,并集操作(A∪B),差集操作(A-B),交集操作(A∩B)。
請參閱圖3,具體包括如下步驟:
步驟S101,依次讀入主體A和主體B的數(shù)據(jù),剔除主體A和主體B多余的共線點。
步驟S102,計算主體A和主體B的島、洞,以及每個島、洞對應(yīng)的交點和子邊的數(shù)據(jù),并計算島的最低子邊。
具體的,請參見圖4,按照上述島、洞,以及每個島、洞對應(yīng)的交點和子邊的定義方法,統(tǒng)計出主體A和主體B的各個數(shù)據(jù)。同時要剔除主體A和主體B多余的共線點。
步驟S103,創(chuàng)建島和洞與自身對應(yīng)的交點的哈希映射關(guān)系,為每個交點建立其與子邊的映射關(guān)系。
具體的,使用迭代法建立每個交點與子邊的映射關(guān)系,具體處理方式請參閱圖5。
步驟S104,通過迭代算法計算每個島和洞的子邊的繞數(shù)值。
具體的,繞數(shù)值為各子邊被多少個多邊形環(huán)繞的次數(shù)。子邊的繞數(shù)初始值為0,繞數(shù)是個矢量,假如子邊Edge被一個多邊形Poly環(huán)繞,如果Poly是逆時針,那么Edge的繞數(shù)+1;如果Poly是順時針,那么Edge的繞數(shù)-1。因為每個島的子邊都被自身環(huán)繞,所以獨(dú)立島的子邊的繞數(shù)都等于1。而如果獨(dú)立島中包含洞的話,那么其洞的子邊既被島環(huán)繞又被洞環(huán)繞,所以洞的字邊繞數(shù)為0。具體的繞數(shù)值計算流程請參閱圖6。
步驟S105,通過所述繞數(shù)值進(jìn)行主體A和主體B的并集、差集、交集布爾運(yùn)算。
具體的,本發(fā)明實現(xiàn)了三種布爾運(yùn)算操作,并集操作(A∪B),差集操作(A-B),交集操作(A∩B)。
請參閱圖7,通過所述繞數(shù)值進(jìn)行主體A和主體B的并集、差集、交集布爾運(yùn)算策略是可以各子邊繞數(shù)值很容易總結(jié)出來的,其本身是布爾運(yùn)算幾何規(guī)則轉(zhuǎn)化為繞數(shù)代數(shù)的表現(xiàn)形式。
拾取結(jié)果邊的尋路:迭代每個島、洞,從該島,洞最低邊開始尋路,只走滿足布爾運(yùn)算拾取條件的子邊,走過并設(shè)置經(jīng)過標(biāo)記防止重復(fù)遍歷,當(dāng)發(fā)現(xiàn)下一條路是走過了的,意味著拾取結(jié)果生成一個閉環(huán),接著尋找未走過得符合條件子邊,循環(huán)迭代所有的子邊都迭代過才結(jié)束。
所有得出的新的洞(順時針多邊形)需要重新尋找其歸屬島。對新的島洞做規(guī)范化。
以上所述本發(fā)明的具體實施方式,并不構(gòu)成對本發(fā)明保護(hù)范圍的限定。任何根據(jù)本發(fā)明的技術(shù)構(gòu)思所做出的各種其他相應(yīng)的改變與變形,均應(yīng)包含在本發(fā)明權(quán)利要求的保護(hù)范圍內(nèi)。