多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法
【專(zhuān)利摘要】本發(fā)明公開(kāi)一種多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,在裁剪多邊形C與實(shí)體多邊形S之間交點(diǎn)求解,且在交點(diǎn)的進(jìn)出性預(yù)判別之后,計(jì)算交點(diǎn)集合中具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù),并針對(duì)交點(diǎn)中存在重點(diǎn)現(xiàn)象,分為存在兩個(gè)相同坐標(biāo)的交點(diǎn)情況和存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)情況的不同情況分別進(jìn)行闡述,進(jìn)而確定交點(diǎn)的進(jìn)出性,最終可得到精準(zhǔn)的裁剪結(jié)果。本發(fā)明步驟簡(jiǎn)單易實(shí)現(xiàn),準(zhǔn)確度高。
【專(zhuān)利說(shuō)明】多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種計(jì)算機(jī)圖形學(xué)領(lǐng)域,具體涉及一種多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法。
【背景技術(shù)】
[0002]多邊形的裁剪是圖形學(xué)中的基本操作,一般多邊形之間的裁剪過(guò)程為裁剪多邊形與實(shí)體多邊形定點(diǎn)的順序存儲(chǔ)、裁剪多邊形與實(shí)體多邊形之間交點(diǎn)求解、多邊形交點(diǎn)的進(jìn)出性判別、多邊形交點(diǎn)分別插入裁剪多邊形與實(shí)體多邊形的頂點(diǎn)集合,通過(guò)交點(diǎn)的進(jìn)出性交替便利裁剪多邊形和實(shí)體多邊形得到裁剪結(jié)果。
[0003]現(xiàn)有技術(shù)中存在的問(wèn)題是:當(dāng)裁剪多邊形與實(shí)體多邊形存在頂點(diǎn)或邊合的情況時(shí),在求解裁剪多邊形與主多邊形的交點(diǎn)時(shí)存在多個(gè)相同的交點(diǎn),并且交點(diǎn)的進(jìn)出性判定不一致,從而無(wú)法準(zhǔn)確的插入裁剪多邊形和實(shí)體多邊形的頂點(diǎn)集合中,同時(shí)無(wú)法根據(jù)交點(diǎn)的進(jìn)出性得到準(zhǔn)確的裁剪結(jié)果。
【發(fā)明內(nèi)容】
[0004]發(fā)明目的:本發(fā)明的目的在于解決現(xiàn)有技術(shù)中存在的不足,提供一種多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法。
[0005]技術(shù)方案:本 發(fā)明的一種多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,包括以下具體步驟:
[0006](I)在裁剪多邊形C與實(shí)體多邊形S之間交點(diǎn)求解,且在交點(diǎn)的進(jìn)出性預(yù)判別之后,計(jì)算交點(diǎn)集合中具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù);其中,用Ci代表裁剪多邊形的第i個(gè)頂點(diǎn),用S」代表實(shí)體多邊形的第j個(gè)頂點(diǎn),T表示裁剪多邊形和實(shí)體多邊形求交后的交點(diǎn)集合,Tk代表添加到裁剪多邊形中交點(diǎn)集合T中第k個(gè)交點(diǎn),Q1代表添加到實(shí)體多邊形頂點(diǎn)序列中交點(diǎn)集合Q的第I個(gè)點(diǎn),其中i,j, k, I e [I, 2…,η],NT為新添加到裁剪多邊形頂點(diǎn)序列新添加到Tk中的交點(diǎn),NQ為新添加到Q1中的交點(diǎn);
[0007](2)當(dāng)具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù)N等于2時(shí),說(shuō)明裁剪多邊形與實(shí)體多邊形存在相同的頂點(diǎn),且頂點(diǎn)坐標(biāo)等于交點(diǎn)坐標(biāo),假設(shè)這兩個(gè)交點(diǎn)分別表示為T(mén)k與Tk+1,Q中與Tk與Tk+1坐標(biāo)相同的兩個(gè)交點(diǎn)分別為Q1與Q1+1,則該頂點(diǎn)進(jìn)出性的判別步驟如下:
[0008](21)如果Tk與Tk+1的進(jìn)出性相同:
[0009]①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中的需要添加的交點(diǎn),添加一個(gè)交點(diǎn)NT,該交點(diǎn)坐標(biāo)及進(jìn)出性均與Tk相同,且交點(diǎn)Q1與Q1+1是裁剪過(guò)程中的頂點(diǎn)坐標(biāo),設(shè)置Sj的進(jìn)出性與頂點(diǎn)Ci的進(jìn)出性相異;
[0010]②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中頂點(diǎn),設(shè)置頂點(diǎn)Ci的進(jìn)出性等于交點(diǎn)Tk與Tk+1的進(jìn)出性,交點(diǎn)Q1與Q1+1是裁剪過(guò)程中需要添加的交點(diǎn),添加一個(gè)新點(diǎn)NQ,該交點(diǎn)坐標(biāo)及其進(jìn)出性與Q1相同;
[0011]③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1。
[0012](22)如果Tk與Tk+1的進(jìn)出性不相同:
[0013]①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序以及后一個(gè)交點(diǎn)的進(jìn)出性,進(jìn)而判別頂點(diǎn)Sj的進(jìn)出性,并向T中添加新交點(diǎn)NT,其中NT的坐標(biāo)及進(jìn)出性與Sj相同;
[0014]②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序,依據(jù)得到交點(diǎn)Tk與Tk+1裁剪多邊形線段的先后順序,進(jìn)而得到頂點(diǎn)Ci的進(jìn)出性,向Q中添加新較低那NQ,其中NQ的坐標(biāo)與頂點(diǎn)Ci的坐標(biāo)相同,進(jìn)出性相異。
[0015]③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1。
[0016](23)完成對(duì)交點(diǎn)集合T和Q中所有存在兩個(gè)相同坐標(biāo)的交點(diǎn)的處理,設(shè)置相應(yīng)多邊形頂點(diǎn)的進(jìn)出性,更新交點(diǎn)集合T中的交點(diǎn);
[0017](3)當(dāng)具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù)N大于2時(shí),則頂點(diǎn)進(jìn)出性的判別步驟如下: [0018](31)該交點(diǎn)坐標(biāo)與裁剪多邊形的頂點(diǎn)Ci坐標(biāo)相同,同時(shí)該交點(diǎn)坐標(biāo)與實(shí)體多邊形的頂點(diǎn)Sj坐標(biāo)相同;
[0019](32)判斷以頂點(diǎn)Ci為起點(diǎn)的邊CiCw與實(shí)體多邊形的邊Sp1Sj與邊S」Sj+1是否共線.-^4 ,
[0020](33)如果不存在共線,邊CiCw與頂點(diǎn)Sp Sj和Sj+1構(gòu)成的內(nèi)角Z Sp1SjSp1的關(guān)系,如果邊CiCw在內(nèi)角Z Sp1SjSp1內(nèi)部,則頂點(diǎn)Ci為進(jìn)點(diǎn),在內(nèi)角Z Sp1SjSp1的外部,則頂點(diǎn)Ci為出點(diǎn),頂點(diǎn)Sj為進(jìn)點(diǎn);
[0021](34)如果存在共線,判斷邊CwCi與頂點(diǎn)Sj_1、Sj和Sj+1構(gòu)成的內(nèi)角Z Sp1SjSp1的關(guān)系,如果邊Cp1Ci在內(nèi)角Z Sj^1SjSjtl的內(nèi)部,則頂點(diǎn)Ci為出點(diǎn);如果邊Cp1Ci在內(nèi)角Z Sj^1SjSjtl的外部,則頂點(diǎn)Ci為進(jìn)點(diǎn),頂點(diǎn)Sj為出點(diǎn);
[0022](35)刪除交點(diǎn)集合T和Q中存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)。
[0023]進(jìn)一步的,所述步驟⑴的具體步驟如下:
[0024](11)分別將裁剪多邊形C和實(shí)體多邊形S的頂點(diǎn)坐標(biāo)按順時(shí)針存儲(chǔ)成序列,其中用Ci代表裁剪多邊形的第i個(gè)頂點(diǎn),用S」代表實(shí)體多邊形中第j個(gè)頂點(diǎn);
[0025](12)按順序?qū)Σ眉舳噙呅蜟的邊和實(shí)體多邊形S的邊進(jìn)行求交運(yùn)算,求出可能存在交點(diǎn)的邊;
[0026](13)對(duì)多邊形求交的交點(diǎn)集合進(jìn)行統(tǒng)計(jì),獲得存在相同坐標(biāo)的交點(diǎn)的數(shù)量,判斷交點(diǎn)坐標(biāo)與多邊形頂點(diǎn)是否相同,進(jìn)而判斷交點(diǎn)是否為添加到多邊形頂點(diǎn)序列中的交點(diǎn);
[0027](14)以實(shí)體多邊形S為參考對(duì)象,判斷出將添加到裁剪多邊形C頂點(diǎn)序列中的交點(diǎn)的進(jìn)出性以及添加到實(shí)體多邊形S頂點(diǎn)序列中的交點(diǎn)的進(jìn)出性。
[0028]進(jìn)一步的,若所述步驟(14)中的交點(diǎn)坐標(biāo)唯一,則該交點(diǎn)為多邊形線段間的交點(diǎn)。
[0029]進(jìn)一步的,當(dāng)判斷存在交點(diǎn)的多邊形頂點(diǎn)的進(jìn)出性后,保留坐標(biāo)唯一的交點(diǎn);然后按順序?qū)⒔稽c(diǎn)添加到多邊形頂點(diǎn)序列中,并更新頂點(diǎn)序列表;接著交替遍歷更新后裁剪多邊形和實(shí)體多邊形頂點(diǎn)序列,通過(guò)頂點(diǎn)的進(jìn)出性和添加的交點(diǎn)的進(jìn)出性得到裁剪結(jié)果多邊形。
[0030]有益效果:本發(fā)明能夠去除線段求交過(guò)程中所有冗余的交點(diǎn),提高裁剪過(guò)程的效率;同時(shí)擴(kuò)展多邊形裁剪方法的適用范圍,可以提高實(shí)現(xiàn)裁剪多邊形與實(shí)體多變形之間的求交運(yùn)算的準(zhǔn)確性,通過(guò)本發(fā)明中快速準(zhǔn)確的判別交點(diǎn)的進(jìn)出性,最終能夠得到準(zhǔn)確的裁剪圖形。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0031]圖1為本發(fā)明中存在頂點(diǎn)為交點(diǎn)時(shí)的多邊形裁剪流程示意圖;
[0032]圖2為本發(fā)明中存在兩個(gè)相同交點(diǎn)的示意圖;
[0033]圖3為本發(fā)明中存在兩個(gè)相同交點(diǎn)時(shí)的流程示意圖;
[0034]圖4為本發(fā)明中存在兩個(gè)以上相同交點(diǎn)的示意圖;
[0035]圖5為本發(fā)明中存在兩個(gè)以上相同交點(diǎn)時(shí)的流程示意圖。
【具體實(shí)施方式】
[0036]下面對(duì)本發(fā)明技術(shù)方案結(jié)合附圖進(jìn)行詳細(xì)說(shuō)明。
[0037]如圖1所示,當(dāng)裁剪多邊形C與實(shí)體多邊形S的交點(diǎn)為多邊形頂點(diǎn)時(shí)的多邊形裁剪步驟如下:
[0038](I)將裁剪多邊形C和實(shí)體多邊形S的頂點(diǎn)坐標(biāo)按順時(shí)針存儲(chǔ)成點(diǎn)序列;
[0039](2)按順序?qū)Σ眉舳噙呅蜟的邊與實(shí)體多邊形S的邊進(jìn)行求交運(yùn)算,求出可能存在交點(diǎn)的邊;
[0040](3)以實(shí)體多邊形S為參考對(duì)象,判斷出將要插入到裁剪多邊形C中的交點(diǎn)的進(jìn)出性,插入實(shí)體多邊形S的交點(diǎn)的進(jìn)出性相異;
[0041](4)對(duì)兩個(gè)多邊形求出的交點(diǎn)進(jìn)行統(tǒng)計(jì),獲得存在相同坐標(biāo)的交點(diǎn)的數(shù)量;
[0042](4.1)如果交點(diǎn)存在重點(diǎn)現(xiàn)象,則需要進(jìn)行兩種情況:一種交點(diǎn)坐標(biāo)與多邊形頂點(diǎn)坐標(biāo)相同;另一種情況交點(diǎn)坐標(biāo)與一個(gè)多邊形頂點(diǎn)坐標(biāo)相同,同時(shí)是另一多邊形的交
占.[0043](4.2)如果交點(diǎn)坐標(biāo)唯一,則為多邊形線段間的交點(diǎn);
[0044](5)判斷存在交點(diǎn)的多邊形頂點(diǎn)的進(jìn)出性,保留坐標(biāo)唯一的交點(diǎn);
[0045](6)按順序?qū)⒔稽c(diǎn)添加到多邊形頂點(diǎn)序列中,更新頂點(diǎn)序列表;
[0046](7)交替遍歷更新后裁剪多邊形和實(shí)體多邊形頂點(diǎn)序列,通過(guò)頂點(diǎn)的進(jìn)出性和添加的交點(diǎn)的進(jìn)出性得到裁剪結(jié)果多邊形。
[0047]下面針對(duì)交點(diǎn)中存在重點(diǎn)現(xiàn)象,分為存在兩個(gè)相同坐標(biāo)的交點(diǎn)情況和存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)情況的不同情況進(jìn)行闡述。
[0048]如圖2所示,當(dāng)存在兩個(gè)相同坐標(biāo)的交點(diǎn)情況時(shí)的實(shí)施例為:由頂點(diǎn)仏、(:2、(:3、(;、C5> C6, C7構(gòu)成裁剪多邊形,由頂點(diǎn)S1、S2, S3、S4、S5、S6、S7、S8、S9、S10, S11構(gòu)成實(shí)體多邊形。圖中的裁剪多邊形C與實(shí)體多邊形S完成線段求交后,由于頂點(diǎn)S2、S8以及S11的坐標(biāo)在線段C3C4X5C6和C1C2上,同時(shí)頂點(diǎn)C4與S5坐標(biāo)相同且線段C3C4與S4S5X4C5與S5S6共線,則交點(diǎn)集合T中存在兩個(gè)與頂點(diǎn)C4、S2、S8& S11坐標(biāo)相同的交點(diǎn),由于待插入多邊形頂點(diǎn)中的交點(diǎn)集合需要其坐標(biāo)唯一,因此需要對(duì)存在兩個(gè)相同坐標(biāo)的交點(diǎn)情況進(jìn)行相應(yīng)處理。[0049]如圖3所示,當(dāng)存在兩個(gè)相同坐標(biāo)的交點(diǎn)情況時(shí)的處理步驟如下:
[0050](I)在交點(diǎn)集合T中存在出相同坐標(biāo)的交點(diǎn)的數(shù)量為N = 2,分別為交點(diǎn)Tk和Tk+1 ;[0051 ] (2)通過(guò)交點(diǎn)Tk與Tk+1和交點(diǎn)Q1與Q1+1的進(jìn)出性以及交點(diǎn)Tk與Tk+1和交點(diǎn)Q1與Q1+1坐標(biāo)是否是裁剪多邊形和實(shí)體多邊形的頂點(diǎn)坐標(biāo),從而判別裁剪多邊形與實(shí)體多邊形的裁剪轉(zhuǎn)折點(diǎn)是多邊形的頂點(diǎn)還是交點(diǎn);
[0052](2.1)如果Tk與Tk+1的進(jìn)出性相同
[0053]①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中的一個(gè)需要添加的交點(diǎn),添加一個(gè)交點(diǎn)NT,該交點(diǎn)坐標(biāo)及進(jìn)出性與Tk相同;交點(diǎn)Q1與Q1+1是裁剪過(guò)程中的頂點(diǎn)坐標(biāo),設(shè)置Sj的進(jìn)出性與交點(diǎn)Ci的進(jìn)出性相異;
[0054]②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中頂點(diǎn)坐標(biāo),設(shè)置頂點(diǎn)Ci的進(jìn)出性等于交點(diǎn)T1與T2的進(jìn)出性,交點(diǎn)Q1與Q1+1是裁剪過(guò)程中需要添加的交點(diǎn),添加一個(gè)新交點(diǎn)NQ,該交點(diǎn)坐標(biāo)及其進(jìn)出性與Q1相同;
[0055]③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1。
[0056](2.2)如果Tk與Tk+1的進(jìn)出性不相同
[0057]①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序,依據(jù)得到交點(diǎn)Tk與Tk+1實(shí)體多邊形線段的先后順序,依據(jù)后一個(gè)交點(diǎn)的進(jìn)出性可以判別頂點(diǎn)Sj的進(jìn)出性,并向T中添加新交點(diǎn)NT,其中NT的坐標(biāo)及進(jìn)出性與Sj相同;
[0058]②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序,依據(jù)得到交點(diǎn)Tk與Tk+1裁剪多邊形線段的先后順序,得到頂點(diǎn)Ci的進(jìn)出性向Q中添加新交點(diǎn)NQ,其中NQ的坐標(biāo)與頂點(diǎn)Ci的坐標(biāo)相同,進(jìn)出性相異;
[0059]③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1 ;
[0060](3)完成對(duì)交點(diǎn)集合T和Q中所有存在兩個(gè)相同坐標(biāo)的交點(diǎn)的處理,設(shè)置相應(yīng)多邊形頂點(diǎn)的進(jìn)出性,更新交點(diǎn)集合T中的交點(diǎn)。
[0061]如圖4所示,當(dāng)存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)情況時(shí)的實(shí)施例為:由頂點(diǎn)Cp C2,C3> C4, C5, C6構(gòu)成裁剪多邊形,由頂點(diǎn)S1、S2、S3> S4、S5、S6、S7、S8構(gòu)成實(shí)體多邊形。在完成裁剪多邊形與實(shí)體多邊形線段求交后,由于頂點(diǎn)C1與S1X2與S3、C4與S7坐標(biāo)相同,所以在交點(diǎn)集合T中存在兩個(gè)以上與頂點(diǎn)C1 (頂點(diǎn)S1)、頂點(diǎn)C2 (頂點(diǎn)S3)以及頂點(diǎn)C4 (頂點(diǎn)S7)坐標(biāo)相同的交點(diǎn),由于待插入多邊形頂點(diǎn)中的交點(diǎn)集合需要其坐標(biāo)唯一,因此需要對(duì)存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)情況進(jìn)行相應(yīng)處理。
[0062]如圖5所示,當(dāng)存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)情況時(shí)的處理步驟如下:
[0063](I)在交點(diǎn)集合T中存在相同坐標(biāo)交點(diǎn)數(shù)量N>2 ;
[0064](2)該交點(diǎn)坐標(biāo)與裁剪多邊形的頂點(diǎn)Ci坐標(biāo)相同,同時(shí)該交點(diǎn)坐標(biāo)與實(shí)體多邊形的頂點(diǎn)Sj坐標(biāo)相同;
[0065](3)判斷以以頂點(diǎn)Ci為起點(diǎn)的邊CiCw與實(shí)體多邊形的邊Sp1Sj與邊SjSj+1是否共線.一,.[0066](4)不存在共線,邊CiCw與頂點(diǎn)Sp Sj和Sj+1構(gòu)成的內(nèi)角Z SjmSjSj^1的關(guān)系,如果邊CiCw在內(nèi)角Z Sp1SjSp1內(nèi)部,則頂點(diǎn)Ci為進(jìn)點(diǎn),在內(nèi)角Z Sj^1SjSjtl的外部,則頂點(diǎn)Ci為出點(diǎn),頂點(diǎn)Sj為進(jìn)點(diǎn);
[0067](5)如果存在共線,判斷邊CwCi與頂點(diǎn)Sp1、Sj和Sj+1構(gòu)成的內(nèi)角Z Sj^1SjSjtl的關(guān)系,如果邊Cp1Ci在內(nèi)角Z Sj^1SjSjtl的內(nèi)部,則頂點(diǎn)Ci為出點(diǎn);如果邊Cp1Ci在內(nèi)角Z Sj^1SjSjtl的外部,則頂點(diǎn)Ci為進(jìn)點(diǎn),頂點(diǎn)Sj為出點(diǎn);
[0068](6)刪除交點(diǎn)集合T和Q中存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)。
[0069]通過(guò)上述兩個(gè)實(shí)施例可以看出,本發(fā)明的多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,步驟簡(jiǎn)單易實(shí)現(xiàn)并且準(zhǔn)確度高,可以精準(zhǔn)的根據(jù)交點(diǎn)的進(jìn)出性得到準(zhǔn)確的裁剪結(jié) 果。
【權(quán)利要求】
1.一種多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,其特征在于包括以下具體步驟: (1)在裁剪多邊形C與實(shí)體多邊形S之間交點(diǎn)求解,且在交點(diǎn)的進(jìn)出性預(yù)判別之后,計(jì)算交點(diǎn)集合中具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù);其中,用Ci代表裁剪多邊形的第i個(gè)頂點(diǎn),用SjK表實(shí)體多邊形的第j個(gè)頂點(diǎn),T表示裁剪多邊形和實(shí)體多邊形求交后的交點(diǎn)集合,Tk代表添加到裁剪多邊形中交點(diǎn)集合T中第k個(gè)交點(diǎn),Q1代表添加到實(shí)體多邊形頂點(diǎn)序列中的交點(diǎn)集合Q的第I個(gè)點(diǎn),其中i,j,k,I e [1,2…,η],NT為新添加到裁剪多邊形頂點(diǎn)序列新添加到Tk中的交點(diǎn),NQ為新添加到Q1中的交點(diǎn); (2)當(dāng)具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù)N等于2時(shí),說(shuō)明裁剪多邊形與實(shí)體多邊形存在相同的頂點(diǎn),且頂點(diǎn)坐標(biāo)等于交點(diǎn)坐標(biāo),假設(shè)這兩個(gè)交點(diǎn)分別表示為T(mén)k與Tk+1, Q中與Tk與Tk+1坐標(biāo)相同的兩個(gè)交點(diǎn)分別為Q1與Q1+1,則該頂點(diǎn)進(jìn)出性的判別步驟如下: (21)如果Tk與Tk+1的進(jìn)出性相同: ①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中的需要添加的交點(diǎn),添加一個(gè)交點(diǎn)NT,其中該交點(diǎn)坐標(biāo)及進(jìn)出性均與Tk相同,且交點(diǎn)Q1與Q1+1是裁剪過(guò)程中的頂點(diǎn)坐標(biāo),設(shè)置Sj的進(jìn)出性與頂點(diǎn)Ci的進(jìn)出性相異; ②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相同,則交點(diǎn)Tk與Tk+1是裁剪過(guò)程中頂點(diǎn),設(shè)置頂點(diǎn)Ci的進(jìn)出性等于交點(diǎn)Tk與Tk+1的進(jìn)出性,;交點(diǎn)Q1與Q1+1是裁剪過(guò)程中需要添加的交點(diǎn),添加一個(gè)新點(diǎn)NQ,該交點(diǎn)坐標(biāo)及其進(jìn)出性與Q1相同; ③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1; (22)如果Tk與Tk+1的進(jìn)出性不相同: ①若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)不等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序以及后一個(gè)交點(diǎn)的進(jìn)出性,進(jìn)而判別頂點(diǎn)Sj的進(jìn)出性,并向T中添加新交點(diǎn)NT,其中NT的坐標(biāo)及進(jìn)出性與Sj相同; ②若交點(diǎn)Tk與Tk+1的坐標(biāo)與頂點(diǎn)Ci坐標(biāo)相等,交點(diǎn)Q1與Q1+1的坐標(biāo)與頂點(diǎn)Sj坐標(biāo)相等,判別交點(diǎn)Tk與Tk+1的先后順序,依據(jù)得到交點(diǎn)Tk與Tk+1裁剪多邊形線段的先后順序,進(jìn)而得到頂點(diǎn)Ci的進(jìn)出性,向Q中添加新較低那NQ,其中NQ的坐標(biāo)與頂點(diǎn)Ci的坐標(biāo)相同,進(jìn)出性相異; ③從交點(diǎn)集合T中刪除交點(diǎn)Tk與Tk+1,交點(diǎn)集合Q中刪除交點(diǎn)Q1與Q1+1; (23)完成對(duì)交點(diǎn)集合T和Q中所有存在兩個(gè)相同坐標(biāo)的交點(diǎn)的處理,設(shè)置相應(yīng)多邊形頂點(diǎn)的進(jìn)出性,更新交點(diǎn)集合T中的交點(diǎn); (3)當(dāng)具有相同坐標(biāo)交點(diǎn)的個(gè)數(shù)N大于2時(shí),則頂點(diǎn)進(jìn)出性的判別步驟如下: (31)該交點(diǎn)坐標(biāo)與裁剪多邊形的頂點(diǎn)Ci坐標(biāo)相同,同時(shí)該交點(diǎn)坐標(biāo)與實(shí)體多邊形的頂點(diǎn)Sj坐標(biāo)相同; (32)判斷以頂點(diǎn)Ci為起點(diǎn)的邊CiCw與實(shí)體多邊形的邊Sp1Sj與邊SjSj+1是否共線; (33)如果不存在共線,邊CiCw與頂點(diǎn)SpSj和Sj+1構(gòu)成的內(nèi)角ZSp1SjSp1的關(guān)系,如果邊CiCw在內(nèi)角Z Sp1SjSp1內(nèi)部,則頂點(diǎn)Ci為進(jìn)點(diǎn),在內(nèi)角Z Sj^1SjSjtl的外部,則頂點(diǎn)Ci為出點(diǎn),頂點(diǎn)Sj為進(jìn)點(diǎn);(34)如果存在共線,判斷邊CwCi與頂點(diǎn)Sp1及和Sp1構(gòu)成的內(nèi)角ZShSA+1的關(guān)系,如果邊Cp1Ci在內(nèi)角Z Sj^1SjSjtl的內(nèi)部,則頂點(diǎn)Ci為出點(diǎn);如果邊Cp1Ci在內(nèi)角Z Sp1SjSp1的外部,則頂點(diǎn)Ci為進(jìn)點(diǎn),頂點(diǎn)Sj為出點(diǎn); (35)刪除交點(diǎn)集合T和Q中存在兩個(gè)以上相同坐標(biāo)的交點(diǎn)。
2.根據(jù)權(quán)利要求1所述的多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,其特征在于所述步驟(1)的具體步驟如下: (11)分別將裁剪多邊形C和實(shí)體多邊形S的頂點(diǎn)坐標(biāo)按順時(shí)針存儲(chǔ)成序列,其中用Ci代表裁剪多邊形的第i個(gè)頂點(diǎn),用S」代表實(shí)體多邊形中第j個(gè)頂點(diǎn); (12)按順序?qū)Σ眉舳噙呅蜟的邊和實(shí)體多邊形S的邊進(jìn)行求交運(yùn)算,求出存在交點(diǎn)的邊; (13)對(duì)多邊形求交的交點(diǎn)集合進(jìn)行統(tǒng)計(jì),獲得存在相同坐標(biāo)的交點(diǎn)的數(shù)量,判斷交點(diǎn)坐標(biāo)與多邊形頂點(diǎn)是否相同,進(jìn)而判斷交點(diǎn)是否為添加到多邊形頂點(diǎn)序列中的交點(diǎn); (14)以實(shí)體多邊形S為參考對(duì)象,判斷出將添加到裁剪多邊形C頂點(diǎn)序列中的交點(diǎn)的進(jìn)出性以及添加到實(shí)體多邊形S頂點(diǎn)序列中的交點(diǎn)的進(jìn)出性。
3.根據(jù)權(quán)利要求2所述的多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,其特征在于:若所述步驟(14)中的交點(diǎn)坐標(biāo)唯一,則該交點(diǎn)為多邊形線段間的交點(diǎn)。
4.根據(jù)權(quán)利要求 2所述的多邊形裁剪中交點(diǎn)為多邊形頂點(diǎn)的進(jìn)出性判別方法,其特征在于:當(dāng)判斷存在交點(diǎn)的多邊形頂點(diǎn)的進(jìn)出性后,保留坐標(biāo)唯一的交點(diǎn);然后按順序?qū)⒔稽c(diǎn)添加到多邊形頂點(diǎn)序列中,并更新頂點(diǎn)序列表;接著交替遍歷更新后裁剪多邊形和實(shí)體多邊形頂點(diǎn)序列,通過(guò)頂點(diǎn)的進(jìn)出性和添加的交點(diǎn)的進(jìn)出性得到裁剪結(jié)果多邊形。
【文檔編號(hào)】G06T11/00GK104036533SQ201410251976
【公開(kāi)日】2014年9月10日 申請(qǐng)日期:2014年6月9日 優(yōu)先權(quán)日:2014年6月9日
【發(fā)明者】王慧青, 崇素文, 王慶, 李玲 申請(qǐng)人:東南大學(xué)