欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種三維平面實(shí)體的布爾運(yùn)算方法

文檔序號(hào):6621948閱讀:2188來(lái)源:國(guó)知局
一種三維平面實(shí)體的布爾運(yùn)算方法
【專利摘要】本發(fā)明涉及一種三維平面實(shí)體的布爾運(yùn)算方法,其基本思想是認(rèn)為兩個(gè)三維平面實(shí)體A和B布爾運(yùn)算的結(jié)果是由保留面和修改面組成的,先通過(guò)給定的方法產(chǎn)生兩個(gè)實(shí)體布爾運(yùn)算所用的四個(gè)共享信息鏈表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布爾運(yùn)算類型由共享信息鏈表形成布爾運(yùn)算結(jié)果。本發(fā)明具有簡(jiǎn)單易行、算法邏輯嚴(yán)密和幾何完備性好、算法運(yùn)算量小等優(yōu)點(diǎn),可用于CAD、CAM、CAE、計(jì)算機(jī)動(dòng)畫(huà)、虛擬現(xiàn)實(shí)等領(lǐng)域的三維實(shí)體建模。
【專利說(shuō)明】一種三維平面實(shí)體的布爾運(yùn)算方法

【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)圖形學(xué)【技術(shù)領(lǐng)域】,涉及一種三維平面實(shí)體的布爾運(yùn)算方法,具體地說(shuō)是兩個(gè)三維平面實(shí)體通過(guò)并、交、差布爾運(yùn)算以得到新的三維實(shí)體的方法,可用于CAD、CAM、CAE、計(jì)算機(jī)動(dòng)畫(huà)、虛擬現(xiàn)實(shí)等領(lǐng)域的三維實(shí)體建模。

【背景技術(shù)】
[0002]隨著現(xiàn)代科學(xué)技術(shù)的飛速發(fā)展,尤其是計(jì)算機(jī)虛擬現(xiàn)實(shí)、動(dòng)畫(huà)仿真等技術(shù)的日益成熟,人們迫切希望能對(duì)現(xiàn)實(shí)世界進(jìn)行真實(shí)模擬,而布爾運(yùn)算成為了至關(guān)重要的技術(shù)之一。目前,三維幾何模型越來(lái)越復(fù)雜,虛擬環(huán)境規(guī)模越來(lái)越大,同時(shí),人們對(duì)實(shí)時(shí)交互和真實(shí)場(chǎng)景的需求越來(lái)越高,因此向研究人員提出了巨大的挑戰(zhàn),并再次讓布爾運(yùn)算成為了研究的熱點(diǎn)。在三維幾何建模(即幾何造型)過(guò)程中一方面需要組合簡(jiǎn)單實(shí)體(如多面體、圓柱體、圓錐體、圓球體等)為復(fù)雜實(shí)體,另一方面需要把復(fù)雜實(shí)體解析為簡(jiǎn)單實(shí)體的組合,這兩個(gè)過(guò)程都可以歸結(jié)為幾何實(shí)體的布爾運(yùn)算問(wèn)題。在幾何建模領(lǐng)域中,比起其它專門(mén)算法,實(shí)體布爾運(yùn)算具有較大的通用性和基礎(chǔ)性,成為計(jì)算機(jī)幾何造型和CAD、CAM、CAE、虛擬現(xiàn)實(shí)等領(lǐng)域必不可少的工具。因此,對(duì)三維實(shí)體布爾運(yùn)算技術(shù)的研究,具有重要的學(xué)術(shù)意義和應(yīng)用價(jià)值。
[0003]三維實(shí)體布爾運(yùn)算在商用軟件中已很成熟,但其實(shí)現(xiàn)方法在公開(kāi)文獻(xiàn)上尚未見(jiàn)至IJ。在計(jì)算機(jī)圖形學(xué)領(lǐng)域,三維布爾運(yùn)算的主要實(shí)現(xiàn)方式有半空間法、八叉樹(shù)法、BR印(邊界表示)法等,半空間法和八叉樹(shù)法目前已基本不采用,BRep法是目前三維實(shí)體布爾運(yùn)算的主要實(shí)現(xiàn)方式。BRep方法是用點(diǎn)、邊、面、環(huán)以及它們之間相互的鄰接關(guān)系定義三維實(shí)體,實(shí)體表面、邊界線、交線等都顯式給出,參與布爾運(yùn)算的實(shí)體、運(yùn)算中幾何元素處理以及運(yùn)算得到的實(shí)體都采用BRep形式。由于曲面可以由平面片逼近,因此多面體之間的布爾運(yùn)算是實(shí)現(xiàn)包括曲面在內(nèi)的復(fù)雜實(shí)體建模的基礎(chǔ)。
[0004]目前研究基于BRep形式的三維實(shí)體布爾運(yùn)算的公開(kāi)文獻(xiàn)并不是很多。論文“基于降維的三維布爾運(yùn)算算法與實(shí)現(xiàn)”(上海交通大學(xué)碩士學(xué)位論文,2008年2月,作者:周志超)提出三維布爾運(yùn)算的結(jié)果由保留面和修改面組成,其修改面由截切平面與剖面通過(guò)傳統(tǒng)的二維布爾運(yùn)算得到,且保留面和修改面的獲取方法依三維布爾運(yùn)算的類型(并、交、差)不同而不同,該文的三維布爾運(yùn)算、二維布爾運(yùn)算都是一種運(yùn)算類型對(duì)應(yīng)一種算法;文獻(xiàn)“計(jì)算機(jī)圖形學(xué)”(清華大學(xué)出版社,1995年8月,作者:孫家廣)介紹了 Muuss和Butler于1991年提出的“求交共享、分類、歸并”的非正則三維形體布爾運(yùn)算方法,“求交共享”是先將一個(gè)形體中的邊、環(huán)、面所有幾何元素與另一個(gè)形體的所有幾何元素進(jìn)行求交,然后通過(guò)一定的拓?fù)渌阕訉⒔稽c(diǎn)、交線插入形體中而被兩個(gè)形體所共享;“分類”是把每個(gè)形體經(jīng)求交后被適當(dāng)分割的幾何元素與另一形體進(jìn)行比較,以決定這些元素是包含于(in)另一形體,還是在另一形體之外(out),還是在另一形體邊界上(on),分類包括點(diǎn)的分類、邊的分類和環(huán)的分類;“歸并”是根據(jù)并、交、差運(yùn)算類型對(duì)幾何元素分類結(jié)果進(jìn)行取舍,以決定哪些元素作為結(jié)果保留,哪些元素被丟棄??梢钥闯觯延醒芯砍晒嬖谝韵聠?wèn)題:(I)算法復(fù)雜,實(shí)現(xiàn)難度較大;(2)算法完備性缺乏強(qiáng)有力的理論支撐;(3)算法運(yùn)算量較大。


【發(fā)明內(nèi)容】

[0005]本發(fā)明的目的在于克服上述已有技術(shù)的不足,提供一種算法簡(jiǎn)單、算法運(yùn)算量小的三維平面實(shí)體的布爾運(yùn)算方法。
[0006]本發(fā)明的目的是這樣實(shí)現(xiàn)的:一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:至少包括如下步驟:
[0007]步驟101:依次讀入實(shí)體A和實(shí)體B的數(shù)據(jù),將實(shí)體A的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 鏈表中,實(shí)體B 的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 B_Point_list、B_Line_list、B_Loop_list、B_Face_list鏈表中;
[0008]步驟102:遍歷鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 求取實(shí)體 A 的包圍盒值 A.min.X.、A.min.Y、A.min.Z、A.max.X、A.max.Y、A.max.Z ;遍歷鏈表 B_Point_list、B_Line_list、B_Loop_list、B_Face_list 求取實(shí)體 B 的包圍盒值 B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z ;
[0009]步驟103:判斷實(shí)體A的包圍盒與實(shí)體B的包圍盒是否相交,若相交則轉(zhuǎn)至步驟107,若不相交則轉(zhuǎn)至步驟104 ;
[0010]步驟104:判斷實(shí)體A和實(shí)體B相離還是內(nèi)含,若相離轉(zhuǎn)至步驟106,若內(nèi)含轉(zhuǎn)至步驟 105 ;
[0011]步驟105:若實(shí)體 B 內(nèi)含于實(shí)體 A,令 A_out_B = A, B_out_A = null, A_in_B =null,B_in_A = B,轉(zhuǎn)至步驟 121 ;若實(shí)體A 內(nèi)含于實(shí)體B,令B_out_A = B,A_out_B = null,B_in_A = null,A_in_B = A,轉(zhuǎn)至步驟121 ;這里鏈表A_out_B用于存儲(chǔ)實(shí)體A中不與實(shí)體B相交的保留面和實(shí)體A中與實(shí)體B相交的修改面,鏈表B_out_A#儲(chǔ)實(shí)體B中不與實(shí)體A相交的保留面和實(shí)體B中與實(shí)體A相交的修改面,鏈表A_in_B存儲(chǔ)實(shí)體A中與實(shí)體B相交所產(chǎn)生的修改面,鏈表B_in_A存儲(chǔ)實(shí)體B中與實(shí)體A相交所產(chǎn)生的修改面;保留面是實(shí)體的原有面,經(jīng)過(guò)布爾運(yùn)算未發(fā)生變化而被保留下來(lái)的面,修改面是經(jīng)過(guò)布爾運(yùn)算將原有面進(jìn)行了修改并用于組成布爾運(yùn)算所得實(shí)體的面;
[0012]步驟106:實(shí)體A與實(shí)體B相離,則將實(shí)體A的所有面存入A_out_B,實(shí)體B的所有面存入 B_out_A,并令 A_in_B = null、B_in_A = null,轉(zhuǎn)至步驟 121 ;
[0013]步驟107:遍歷實(shí)體 A 的鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取實(shí)體A的一個(gè)面Fa ;
[0014]步驟108:判斷面Fa是否與實(shí)體B相交,若不相交,轉(zhuǎn)至步驟109,如果相交,轉(zhuǎn)至步驟110 ;
[0015]步驟109:將實(shí)體A的面Fa存入鏈表A_out_B,轉(zhuǎn)至步驟113 ;
[0016]步驟110:用面Fa截切實(shí)體B,得到剖面多邊形,記該多邊形為F1 ;
[0017]步驟111:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存AA_in_B中;
[0018]步驟112:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton外裁剪運(yùn)算,夕卜裁剪結(jié)果存入A_out_B中;
[0019]步驟113:判斷實(shí)體A的面是否全部處理完,若未處理完轉(zhuǎn)至步驟107,若處理完,則轉(zhuǎn)至步驟114;
[0020]步驟114:遍歷實(shí)體 B 的鏈表 B_Point_list、B_Line_list、B_Loop_list、B_Face_list,取實(shí)體B的一個(gè)面Fb ;
[0021]步驟115:判斷面Fb是否與實(shí)體A相交,若不相交,轉(zhuǎn)至步驟116,如果相交,轉(zhuǎn)至步驟117 ;
[0022]步驟116:將實(shí)體B的面Fb存入鏈表B_out_A,轉(zhuǎn)至步驟120 ;
[0023]步驟117:用面Fb截切實(shí)體A,得到剖面多邊形,記該多邊形為F2 ;
[0024]步驟118:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存AB_in_A中;
[0025]步驟119:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Weiler—Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入B_out_A中;
[0026]步驟120:判斷實(shí)體B的面是否全部處理完,若未處理完轉(zhuǎn)至步驟114,若處理完,則轉(zhuǎn)至步驟121 ;
[0027]步驟121:判斷實(shí)體A和實(shí)體B的布爾運(yùn)算類型,若為并運(yùn)算A U B,則轉(zhuǎn)至步驟122 ;若為交運(yùn)算A Π B,則轉(zhuǎn)至步驟123 ;若為差運(yùn)算Α-Β,則轉(zhuǎn)至步驟124,若為差運(yùn)算Β-Α,則轉(zhuǎn)至步驟125 ;
[0028]步驟122:結(jié)果為鏈表A_out_B和B_out_A的合并;
[0029]步驟123:結(jié)果為鏈表A_in_B和B_in_A的合并;
[0030]步驟124:結(jié)果為將B_in_A中面的頂點(diǎn)順序反向后得到的鏈表和A_out_B鏈表的合并;
[0031]步驟125:結(jié)果為將A_in_B中面的頂點(diǎn)順序反向后得到的鏈表和B_out_A鏈表的
I=I TT O
[0032]所示的步驟103中判斷實(shí)體A的包圍盒和實(shí)體B的包圍盒是否相交,包括以下步驟:
[0033]步驟201:如果包圍盒A的A.max.X小于包圍盒B的B.min.X或者包圍盒A的A.min.X大于包圍盒B的B.max.X,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟202 ;
[0034]步驟202:如果包圍盒A的A.max.Y小于包圍盒B的B.min.Y或者包圍盒A的A.min.Y大于包圍盒B的B.max.Y,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟203 ;
[0035]步驟203:如果包圍盒A的A.max.Z小于包圍盒B的B.min.Z或者包圍盒A的
A.min.Z大于包圍盒B的B.max.Z,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟205 ;
[0036]步驟204:結(jié)果為兩個(gè)包圍盒不相交;
[0037]步驟205:結(jié)果為兩個(gè)包圍盒相交。
[0038]所示的步驟108中判斷面Fa是否與實(shí)體B相交,包括以下步驟:
[0039]步驟301:讀取面Fa與實(shí)體B的所有面的信息;
[0040]步驟302:求面Fa的包圍盒;
[0041]步驟303:判斷面Fa的包圍盒與實(shí)體B的包圍盒是否相交,若不相交,則轉(zhuǎn)至步驟304,若相交,則轉(zhuǎn)至步驟305 ;
[0042]步驟304:結(jié)果為面Fa與實(shí)體B不相交;
[0043]步驟305:實(shí)體B的面是否全部判斷完,若判斷完,則轉(zhuǎn)至步驟304,若未判斷完,則轉(zhuǎn)至步驟306 ;
[0044]步驟306:取出實(shí)體B的一個(gè)面Fb ;
[0045]步驟307:把面Fa的所有邊與面Fb求交,得到理論交點(diǎn)集U ;
[0046]步驟308:把面Fb的所有邊與面Fa求交,得到理論交點(diǎn)集V ;
[0047]步驟309:判斷交點(diǎn)集U或V是否存在有效交點(diǎn),若不存在,則轉(zhuǎn)至步驟305,否則轉(zhuǎn)至步驟310 ;
[0048]步驟310:結(jié)果為面Fa與實(shí)體B相交。
[0049]所示的步驟110中用面Fa截切實(shí)體B,得到剖面多邊形F1,包括以下步驟:
[0050]步驟401:讀取面Fa與實(shí)體B的所有面的信息;
[0051]步驟402:取出實(shí)體B的一個(gè)面F ;
[0052]步驟403:判斷面Fa與面F是否相交,若不相交,則轉(zhuǎn)至步驟405,若相交,則轉(zhuǎn)至步驟404 ;
[0053]步驟404:求面Fa與面F的交線段,將其保存在相交線段鏈表IntersLine_list中;
[0054]步驟405:判斷實(shí)體B的面是否遍歷完,若未遍歷完,則轉(zhuǎn)至步驟402,若遍歷完,則轉(zhuǎn)至步驟406 ;
[0055]步驟406:搜索鏈表IntersLine_list中的交線段,按相鄰線段端點(diǎn)重合的規(guī)則構(gòu)造環(huán),將構(gòu)造的環(huán)存入鏈表Loop_list ;
[0056]步驟407:求取面Fa的外法線矢量;
[0057]步驟408:求取鏈表Loop_list中各環(huán)所在平面的法向量;
[0058]步驟409:判斷各環(huán)法向量是否與Fa的外法線矢量方向相同,若方向相同則環(huán)的頂點(diǎn)順序不變,若方向相反則將環(huán)的頂點(diǎn)順序逆序排列,經(jīng)過(guò)方向處理后的各環(huán)仍保存在鏈表 Loop_list 中;
[0059]步驟410:在環(huán)鏈表Loop_list中找出內(nèi)環(huán),將內(nèi)環(huán)的頂點(diǎn)順序逆序排列,最終得到的環(huán)鏈表LoopJist即為剖面多邊形F1的數(shù)據(jù)。
[0060]所示的步驟111中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入A_in_B中,包括以下步驟:
[0061 ] 步驟501:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形;
[0062]步驟502:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_P中;
[0063]步驟503:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_Q中;
[0064]步驟504:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組intersect1n_Point中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形;
[0065]步驟505:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_P,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_M ;
[0066]步驟506:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_Q,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_C ;
[0067]步驟507:建立空的裁剪結(jié)果多邊形頂點(diǎn)表10pTmp.Point_list ;
[0068]步驟508:在主多邊形頂點(diǎn)表數(shù)組data_M中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表10pTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò);
[0069]步驟509:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟510 ;若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟511 ;
[0070]步驟510:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_M中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表10pTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ;
[0071]步驟511:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_C中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表10pTmp.Point_list中,在data_C中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ;
[0072]步驟512:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟509,若相同,則轉(zhuǎn)至步驟513 ;
[0073]步驟513:判斷主多邊形頂點(diǎn)表數(shù)組data_M中交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟508,若遍歷完,則轉(zhuǎn)至步驟514 ;
[0074]步驟514:將頂點(diǎn)表10pTmp.Point_list中的頂點(diǎn)按順序存入鏈表A_in_B。
[0075]所示的步驟112中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入A_out_B中,包括以下步驟:
[0076]步驟601:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形;
[0077]步驟602:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_I中;
[0078]步驟603:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)順時(shí)針順序、內(nèi)環(huán)逆時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_J中;
[0079]步驟604:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組inters_P中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形;
[0080]步驟605:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_I,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_MM ;
[0081]步驟606:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_J,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_CC ;
[0082]步驟607:建立空的裁剪結(jié)果多邊形頂點(diǎn)表loopTmp.P_list ;
[0083]步驟608:在主多邊形頂點(diǎn)表數(shù)組data_MM中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表loopTmp.P_list中,在data_麗中標(biāo)記該交點(diǎn)已遍歷過(guò);
[0084]步驟609:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟610 ;若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟611 ;
[0085]步驟610:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_MM中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_MM中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ;
[0086]步驟611:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_CC中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_CC中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ;
[0087]步驟612:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟609,若相同,則轉(zhuǎn)至步驟613 ;
[0088]步驟613:判斷主多邊形頂點(diǎn)表數(shù)組data_MM中交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟608,若遍歷完,則轉(zhuǎn)至步驟614 ;
[0089]步驟614:將頂點(diǎn)表loopTmp.P_list中的頂點(diǎn)按順序存入鏈表A_out_B。
[0090]所示的步驟115中判斷面Fb是否與實(shí)體A相交,包括的步驟與步驟108中的步驟301?步驟310相同,所不同的是將步驟301?步驟310中的Fa變?yōu)镕B,F(xiàn)b變?yōu)镕a,實(shí)體B變?yōu)閷?shí)體A。
[0091]所示的步驟117中用面Fb截切實(shí)體A,得到剖面多邊形F2,包括的步驟與步驟110中的步驟401?步驟410相同,所不同的是將步驟401?步驟410中的Fa變?yōu)镕B,實(shí)體B變?yōu)閷?shí)體A,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2。
[0092]所示的步驟118中對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入B_in_A中,包括的步驟與步驟111中的步驟501?步驟514相同,所不同的是將步驟501?步驟514中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,內(nèi)裁剪結(jié)果A_in_B變?yōu)锽_in_A。
[0093]所示的步驟119中對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行WeiIer — Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入B_out_A中,包括的步驟與步驟112中的步驟601?步驟614相同,所不同的是將步驟601?步驟614中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,外裁剪結(jié)果A_out_B變?yōu)锽_out_A。
[0094]本發(fā)明有如下優(yōu)點(diǎn):
[0095](I)所提出的三維實(shí)體布爾運(yùn)算算法思路清晰、簡(jiǎn)便,算法模塊化程度高、易于實(shí)現(xiàn);
[0096](2)所提出的布爾運(yùn)算算法邏輯嚴(yán)密、幾何完備性好,算法魯棒性高;
[0097](3)所提出的布爾運(yùn)算算法通過(guò)對(duì)產(chǎn)生的共享信息簡(jiǎn)單組合便得到并、交、差三種運(yùn)算結(jié)果,對(duì)于同時(shí)需要多種布爾運(yùn)算結(jié)果的場(chǎng)合優(yōu)勢(shì)突出;
[0098](4)所提出的布爾運(yùn)算算法運(yùn)算量小。

【專利附圖】

【附圖說(shuō)明】
[0099]圖1是本發(fā)明的總流程圖;
[0100]圖2是判斷兩個(gè)實(shí)體包圍盒是否相交的流程圖;
[0101]圖3是判斷實(shí)體A的一個(gè)面與實(shí)體B是否相交的流程圖;
[0102]圖4是用實(shí)體A的一個(gè)面截切實(shí)體B時(shí)求取剖面多邊形的流程圖;
[0103]圖5是實(shí)體A的一個(gè)面多邊形與該面截切實(shí)體B時(shí)所得的剖面多邊形進(jìn)行Weiler一Atherton內(nèi)裁剪運(yùn)算以獲得A_in_B結(jié)果的流程圖;
[0104]圖6是實(shí)體A的一個(gè)面多邊形與該面截切實(shí)體B時(shí)所得的剖面多邊形進(jìn)行Weiler一Atherton外裁剪運(yùn)算以獲得A_out_B結(jié)果的流程圖;
[0105]圖7 (a)是實(shí)體A和實(shí)體B進(jìn)行布爾運(yùn)算的示例圖,圖7(b)是實(shí)體A的一個(gè)面截切實(shí)體B時(shí)求取剖面多邊形的示例圖;
[0106]圖8是圖7(a)所示的實(shí)體A和實(shí)體B進(jìn)行布爾運(yùn)算時(shí)生成的四個(gè)鏈表A_out_B、A_in_B> B_out_A> B_in_A 的結(jié)果。

【具體實(shí)施方式】
[0107]本發(fā)明的三維平面實(shí)體采用BRep表示形式,即用點(diǎn)、邊、面、環(huán)以及它們之間相互的鄰接關(guān)系定義三維平面實(shí)體,其中面的外環(huán)頂點(diǎn)順序規(guī)定為逆時(shí)針?lè)较颉?nèi)環(huán)頂點(diǎn)順序規(guī)定為順時(shí)針?lè)较颉?br> [0108]本發(fā)明的兩個(gè)三維平面實(shí)體布爾運(yùn)算的結(jié)果由保留面和修改面組成。保留面是實(shí)體的原有面,經(jīng)過(guò)布爾運(yùn)算未發(fā)生變化而被保留下來(lái)的面,修改面是經(jīng)過(guò)布爾運(yùn)算將原有面進(jìn)行了修改并用于組成布爾運(yùn)算所得實(shí)體的面。
[0109]本發(fā)明的基本思想是先產(chǎn)生兩個(gè)三維平面實(shí)體布爾運(yùn)算所用的四個(gè)共享信息鏈表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布爾運(yùn)算類型由共享信息鏈表形成布爾運(yùn)算結(jié)果。其中,鏈表A_out_B用于存儲(chǔ)實(shí)體A中不與實(shí)體B相交的保留面和實(shí)體A中與實(shí)體B相交的修改面,鏈表B_out_A存儲(chǔ)實(shí)體B中不與實(shí)體A相交的保留面和實(shí)體B中與實(shí)體A相交的修改面,鏈表A_in_B存儲(chǔ)實(shí)體A中與實(shí)體B相交所產(chǎn)生的修改面,鏈表B_in_A存儲(chǔ)實(shí)體B中與實(shí)體A相交所產(chǎn)生的修改面。
[0110]參照?qǐng)D1,本發(fā)明的兩個(gè)三維平面實(shí)體的布爾運(yùn)算方法包括如下步驟:
[0111]步驟101:依次讀入實(shí)體A和實(shí)體B的數(shù)據(jù),將實(shí)體A的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 鏈表中,實(shí)體B 的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 B_Point_list、B_Line_list、B_Loop_list、B_Face_list鏈表中;參照?qǐng)D7 (a),實(shí)體A有6個(gè)面,每個(gè)面只有一個(gè)外環(huán),每個(gè)環(huán)有4條邊,每個(gè)邊含兩個(gè)頂點(diǎn),6 個(gè)面的環(huán)分別為{4-3-7-8-4}、{2-1-5-6-2}、{5-1-4-8-5}、{3-2-6-7-3}、{1-2-3-4-1}、{6-5-8-7-6},實(shí)體B也有6個(gè)面,每個(gè)面只有一個(gè)外環(huán),每個(gè)環(huán)有4條邊,每個(gè)邊含兩個(gè)頂點(diǎn),6個(gè)面的環(huán)分別為{4’ -3’ -7’ -8’ -4’ }、{2’ -1’ -5’ -6’ -2’ }、{5,-1,-4,-8,-5,}、{3,-2,-6,-7,-3,}、U,-2,-3,-4,-1,}、{6,-5,-8,-7,-6,};
[0112]步驟102:遍歷鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 求取實(shí)體 A 的包圍盒值 A.min.X.、A.min.Y、A.min.Z、A.max.X、A.max.Y、A.max.Z ;遍歷鏈表 B_Point_list、B_Line_list、B_Loop_list、B_Face_list 求取實(shí)體 B 的包圍盒值 B.min.X.、
B.min.Υ、Β.min.Ζ、Β.max.Χ、Β.max.Υ、Β.max.Z ;參照?qǐng)D 7 (a),實(shí)體 A 的包圍盒值 A.min.X.、A.min.Y、A.min.Z 分別為頂點(diǎn) I 的 x、y、z 坐標(biāo)值,A.max.X、A.max.Y、A.max.Z 分別為頂點(diǎn)7的x、y、z坐標(biāo)值;實(shí)體B的包圍盒值B.min.X.、B.min.Y、B.min.Z分別為頂點(diǎn)I’的x、y、z坐標(biāo)值,B.max.X、B.max.Y、B.max.Z分別為頂點(diǎn)V的x、y、z坐標(biāo)值;
[0113]步驟103:判斷實(shí)體A的包圍盒與實(shí)體B的包圍盒是否相交,若相交則轉(zhuǎn)至步驟107,若不相交則轉(zhuǎn)至步驟104 ;
[0114]步驟103中判斷實(shí)體A的包圍盒與實(shí)體B的包圍盒是否相交的方法,參照?qǐng)D2,包括以下步驟:
[0115]步驟201:如果包圍盒A的A.max.X小于包圍盒B的B.min.X或者包圍盒A的A.min.X大于包圍盒B的B.max.X,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟202 ;
[0116]步驟202:如果包圍盒A的A.max.Y小于包圍盒B的B.min.Y或者包圍盒A的A.min.Y大于包圍盒B的B.max.Y,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟203 ;
[0117]步驟203:如果包圍盒A的A.max.Z小于包圍盒B的B.min.Z或者包圍盒A的
A.min.Z大于包圍盒B的B.max.Z,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟205 ;
[0118]步驟204:結(jié)果為兩個(gè)包圍盒不相交;
[0119]步驟205:結(jié)果為兩個(gè)包圍盒相交。對(duì)于圖7(a),經(jīng)判斷實(shí)體A的包圍盒和實(shí)體B的包圍盒相交。
[0120]步驟104:判斷實(shí)體A和實(shí)體B相離還是內(nèi)含,若相離轉(zhuǎn)至步驟106,若內(nèi)含轉(zhuǎn)至步驟 105 ;
[0121]步驟105:若實(shí)體 B 內(nèi)含于實(shí)體 A,令 A_out_B = A, B_out_A = null, A_in_B =null,B_in_A = B,轉(zhuǎn)至步驟 121 ;若實(shí)體A 內(nèi)含于實(shí)體B,令B_out_A = B,A_out_B = null,B_in_A = null, A_in_B = A,轉(zhuǎn)至步驟 121 ;
[0122]步驟106:實(shí)體A與實(shí)體B相離,則將實(shí)體A的所有面存入A_out_B,實(shí)體B的所有面存入 B_out_A,并令 A_in_B = null、B_in_A = null,轉(zhuǎn)至步驟 121 ;
[0123]步驟107:遍歷實(shí)體 A 的鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取實(shí)體A的一個(gè)面Fa ;
[0124]步驟108:判斷面Fa是否與實(shí)體B相交,若不相交,轉(zhuǎn)至步驟109,如果相交,轉(zhuǎn)至步驟110 ;
[0125]步驟108中判斷面Fa是否與實(shí)體B相交的方法,參照?qǐng)D3,包括以下步驟:
[0126]步驟301:讀取面Fa與實(shí)體B的所有面的信息;
[0127]步驟302:求面Fa的包圍盒;
[0128]步驟303:判斷面Fa的包圍盒與實(shí)體B的包圍盒是否相交,若不相交,則轉(zhuǎn)至步驟304,若相交,則轉(zhuǎn)至步驟305 ;
[0129]步驟304:結(jié)果為面Fa與實(shí)體B不相交;
[0130]步驟305:實(shí)體B的面是否全部判斷完,若判斷完,則轉(zhuǎn)至步驟304,若未判斷完,則轉(zhuǎn)至步驟306 ;
[0131]步驟306:取出實(shí)體B的一個(gè)面Fb ;
[0132]步驟307:把面Fa的所有邊與面Fb求交,得到理論交點(diǎn)集U ;
[0133]步驟308:把面Fb的所有邊與面Fa求交,得到理論交點(diǎn)集V ;
[0134]步驟309:判斷交點(diǎn)集U或V是否存在有效交點(diǎn),若不存在,則轉(zhuǎn)至步驟305,否則轉(zhuǎn)至步驟310 ;
[0135]步驟310:結(jié)果為面Fa與實(shí)體B相交。參照?qǐng)D7(a),面{2_1-5-6_2}、{5_1-4-8_5}、{1-2-3-4-1}與實(shí)體B相交。
[0136]步驟109:將實(shí)體A的面Fa存入鏈表八_0此_8,轉(zhuǎn)至步驟113 ;參照?qǐng)D7(a),與實(shí)體B 不相交的 3 個(gè)面{4-3-7-8-4}、{3-2-6-7-3}、{6-5-8-7-6}存入鏈表 A_out_B ;
[0137]步驟110:用面Fa截切實(shí)體B,得到剖面多邊形,記該多邊形為F1 ;
[0138]步驟110中用面Fa截切實(shí)體B,得到剖面多邊形F1的方法,參照?qǐng)D4,包括以下步驟:
[0139]步驟401:讀取面Fa與實(shí)體B的所有面的信息;
[0140]步驟402:取出實(shí)體B的一個(gè)面F ;
[0141]步驟403:判斷面Fa與面F是否相交,若不相交,則轉(zhuǎn)至步驟405,若相交,則轉(zhuǎn)至步驟404 ;
[0142]步驟404:求面Fa與面F的交線段,將其保存在相交線段鏈表IntersLine_list中;
[0143]步驟405:判斷實(shí)體B的面是否遍歷完,若未遍歷完,則轉(zhuǎn)至步驟402,若遍歷完,則轉(zhuǎn)至步驟406 ;
[0144]步驟406:搜索鏈表IntersLine_list中的交線段,按相鄰線段端點(diǎn)重合的規(guī)則構(gòu)造環(huán),將構(gòu)造的環(huán)存入鏈表Loop_list ;
[0145]步驟407:求取面Fa的外法線矢量;
[0146]步驟408:求取鏈表Loop_list中各環(huán)所在平面的法向量;
[0147]步驟409:判斷各環(huán)法向量是否與Fa的外法線矢量方向相同,若方向相同則環(huán)的頂點(diǎn)順序不變,若方向相反則將環(huán)的頂點(diǎn)順序逆序排列,經(jīng)過(guò)方向處理后的各環(huán)仍保存在鏈表 Loop_list 中;
[0148]步驟410:在環(huán)鏈表LoopJist中找出內(nèi)環(huán),將內(nèi)環(huán)的頂點(diǎn)順序逆序排列,最終得到的環(huán)鏈表LoopJist即為剖面多邊形F1的數(shù)據(jù)。參照?qǐng)D7(b),以實(shí)體A的面{1-2-3-4-1}為例,用其截切實(shí)體B時(shí)所得的剖面多邊形F1為{16’ -17’ -18’ -11-16’ }。
[0149]步驟111:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存AA_in_B中;
[0150]步驟111中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算的方法,參照?qǐng)D5,包括以下步驟:
[0151 ] 步驟501:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形;
[0152]步驟502:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_P中;
[0153]步驟503:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_Q中;
[0154]步驟504:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組intersect1n_Point中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形;
[0155]步驟505:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_P,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_M ;
[0156]步驟506:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_Q,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_C ;
[0157]步驟507:建立空的裁剪結(jié)果多邊形頂點(diǎn)表loopTmp.Point_list ;
[0158]步驟508:在主多邊形頂點(diǎn)表數(shù)組data_M中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表loopTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò);
[0159]步驟509:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟510 ;若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟511 ;
[0160]步驟510:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_M中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ;
[0161]步驟511:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_C中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.Point_list中,在data_C中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ;
[0162]步驟512:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟509,若相同,則轉(zhuǎn)至步驟513 ;
[0163]步驟513:判斷主多邊形頂點(diǎn)表數(shù)組data_M*交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟508,若遍歷完,則轉(zhuǎn)至步驟514 ;
[0164]步驟514:將頂點(diǎn)表loopTmp.Point_list中的頂點(diǎn)按順序存入鏈表A_in_B。參照?qǐng)D7(b),以實(shí)體A的面{1-2-3-4-1}為例,它與剖面多邊形{16’ -17’-18’-11-16’ }內(nèi)裁剪的結(jié)果為{11-10-1-12-11},并存入鏈表A_in_B中。
[0165]步驟112:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton外裁剪運(yùn)算,夕卜裁剪結(jié)果存入A_out_B中;
[0166]步驟112中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行Weiler—Atherton外裁剪運(yùn)算的方法,參照?qǐng)D6,包括以下步驟:
[0167]步驟601:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形;
[0168]步驟602:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_I中;
[0169]步驟603:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)順時(shí)針順序、內(nèi)環(huán)逆時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_J中;
[0170]步驟604:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組inters_P中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形;
[0171]步驟605:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_I,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_MM ;
[0172]步驟606:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_J,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_CC ;
[0173]步驟607:建立空的裁剪結(jié)果多邊形頂點(diǎn)表loopTmp.P_list ;
[0174]步驟608:在主多邊形頂點(diǎn)表數(shù)組data_MM中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表loopTmp.P_list中,在data_麗中標(biāo)記該交點(diǎn)已遍歷過(guò);
[0175]步驟609:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟610 ;若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟611 ;
[0176]步驟610:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_MM中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_MM中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ;
[0177]步驟611:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_CC中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_CC中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ;
[0178]步驟612:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟609,若相同,則轉(zhuǎn)至步驟613 ;
[0179]步驟613:判斷主多邊形頂點(diǎn)表數(shù)組data_MM中交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟608,若遍歷完,則轉(zhuǎn)至步驟614 ;
[0180]步驟614:將頂點(diǎn)表loopTmp.P_list中的頂點(diǎn)按順序存入鏈表A_out_B。參照?qǐng)D7(b),以實(shí)體A的面{1-2-3-4-1}為例,它與剖面多邊形{16’ -17’ -18’ -11-16’ }外裁剪的結(jié)果為{4-10-11-12-2-3-4},并存入鏈表A_out_B中。
[0181]步驟113:判斷實(shí)體A的面是否全部處理完,若未處理完轉(zhuǎn)至步驟107,若處理完,則轉(zhuǎn)至步驟114;
[0182]步驟114:遍歷實(shí)體 B 的鏈表 B_Point_list、B_Line_list、B_Loop_list、B_Face_list,取實(shí)體B的一個(gè)面Fb ;
[0183]步驟115:判斷面Fb是否與實(shí)體A相交,若不相交,轉(zhuǎn)至步驟116,如果相交,轉(zhuǎn)至步驟117 ;
[0184]步驟115中包括的步驟與步驟108中的步驟301?步驟310相同,所不同的是將步驟301?步驟310中的Fa變?yōu)镕b,F(xiàn)b變?yōu)镕a,實(shí)體B變?yōu)閷?shí)體A。
[0185]步驟116:將實(shí)體B的面Fb存入鏈表B_out_A,轉(zhuǎn)至步驟120 ;
[0186]步驟117:用面Fb截切實(shí)體A,得到剖面多邊形,記該多邊形為F2 ;
[0187]步驟117中包括的步驟與步驟110中的步驟401?步驟410相同,所不同的是將步驟401?步驟410中的Fa變?yōu)镕b,實(shí)體B變?yōu)閷?shí)體A,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2。
[0188]步驟118:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Weiler—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存AB_in_A中;
[0189]步驟118中包括的步驟與步驟111中的步驟501?步驟514相同,所不同的是將步驟501?步驟514中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,內(nèi)裁剪結(jié)果A_in_B變?yōu)?B_in_A。
[0190]步驟119:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Weiler—Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入B_out_A中;
[0191]步驟119包括的步驟與步驟112中的步驟601?步驟614相同,所不同的是將步驟601?步驟614中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,外裁剪結(jié)果A_out_B變?yōu)?B_out_A。
[0192]步驟120:判斷實(shí)體B的面是否全部處理完,若未處理完轉(zhuǎn)至步驟114,若處理完,則轉(zhuǎn)至步驟121 ;
[0193]經(jīng)過(guò)以上步驟,對(duì)于圖7(a)所示的兩個(gè)實(shí)體A和B,得到圖8所示的四個(gè)共享信息鏈表 A_out_B、A_in_B、B_out_A、B_in_A 的結(jié)果。
[0194]步驟121:判斷實(shí)體A和實(shí)體B的布爾運(yùn)算類型,若為并運(yùn)算A U B,則轉(zhuǎn)至步驟122 ;若為交運(yùn)算A Π B,則轉(zhuǎn)至步驟123 ;若為差運(yùn)算Α-Β,則轉(zhuǎn)至步驟124,若為差運(yùn)算Β-Α,則轉(zhuǎn)至步驟125 ;
[0195]步驟122:結(jié)果為鏈表么_0此_8和B_out_A的合并;對(duì)于圖7(a)所示的兩個(gè)實(shí)體 A 和 B, A U B 的結(jié)果為{4-3-7-8-4}、 {6-2-12-13-14-5-6}、 {4-8-5-14-15-10-4}、{3-2-6-7-3}、 {2-3-4-10-11-12-2}、 {6-5-8-7-6}、 {4, -3, -11-10-15-8, -4, }、{2,-1,-5,-6,-2,}、{5,-1,-4,-8,-5,}、{2,-6,-13-12-11-3,-2,}、{I,-2,-3,-4,-1,}、{8’ -15-14-13-6’ -5’ -8’ }等 12 個(gè)面;
[0196]步驟123:結(jié)果為鏈表八」11_8和8」11_4的合并;對(duì)于圖7(a)所示的兩個(gè)實(shí)體A和
B,A η B 的結(jié)果為{1-14-13-12-1}、{1-10-15-14-1}、{1-12-11-10-1}、{15-10-11_7,-15}、{11-12-13-7,-11}、{13-14-15-7,-13}等 6 個(gè)面;
[0197]步驟124:結(jié)果為將B_in_A中面的頂點(diǎn)順序反向后得到的鏈表和A_out_B鏈表的合并;對(duì)于圖7(a)所示的兩個(gè)實(shí)體A和B,A-B的結(jié)果為{15_7’ -11-10-15}、{11-7, -13-12-11}、 {13-7, -15-14-13}、 {4-3-7-8-4}、 {6-2-12-13-14-5-6}、{4-8-5-14-15-10-4}、{3-2-6-7-3}、{2-3-4-10-11-12-2}、{6-5-8-7-6}等 9 個(gè)面;
[0198]步驟125:結(jié)果為將A_in_B中面的頂點(diǎn)順序反向后得到的鏈表和B_out_A鏈表的合并;對(duì)于圖7 (a)所示的兩個(gè)實(shí)體A和B,B-A的結(jié)果為{1-12-13-14-1}、{1-14-15-10-1}、{1-10-11-12-1}、{4,-3,-11-10-15-8,-4,}、{2,-1,-5,-6,-2,}、{5,-1,-4,-8,-5,}、{2,-6’ -13-12-11-3’ -2’ }、{Γ -2’ -3’ -4’ -1’ }、{8,-15-14-13-6’ -5’ -8’ }等 9 個(gè)面。
【權(quán)利要求】
1.一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:包括如下步驟: 步驟101:依次讀入實(shí)體A和實(shí)體B的數(shù)據(jù),將實(shí)體A的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 鏈表中,實(shí)體 B 的所有頂點(diǎn)、邊、環(huán)和面的數(shù)據(jù)分別讀入到 B_Point_list、B_Line_list、B_Loop_list、B_Face_list鏈表中; 步驟 102:遍歷鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list 求取實(shí)體A 的包圍盒值 A.min.X.、A.min.Υ、Α.min.Ζ、Α.max.Χ、Α.max.Υ、Α.max.Z ;遍歷鏈表 B_Point_list、B_Line_list、B_Loop_list、B_Face_list 求取實(shí)體 B 的包圍盒值 B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z ; 步驟103:判斷實(shí)體A的包圍盒與實(shí)體B的包圍盒是否相交,若相交則轉(zhuǎn)至步驟107,若不相交則轉(zhuǎn)至步驟104 ; 步驟104:判斷實(shí)體A和實(shí)體B相離還是內(nèi)含,若相離轉(zhuǎn)至步驟106,若內(nèi)含轉(zhuǎn)至步驟105 ; 步驟 105:若實(shí)體 B 內(nèi)含于實(shí)體 A,令 A_out_B = A, B_out_A = null, A_in_B = null,B_in_A = B,轉(zhuǎn)至步驟 121 ;若實(shí)體 A 內(nèi)含于實(shí)體 B,令 B_out_A = B, A_out_B = null, B_in_A = null, A_in_B = A,轉(zhuǎn)至步驟121 ;這里鏈表A_out_B用于存儲(chǔ)實(shí)體A中不與實(shí)體B相交的保留面和實(shí)體A中與實(shí)體B相交的修改面,鏈表B_out_A#儲(chǔ)實(shí)體B中不與實(shí)體A相交的保留面和實(shí)體B中與實(shí)體A相交的修改面,鏈表A_in_B存儲(chǔ)實(shí)體A中與實(shí)體B相交所產(chǎn)生的修改面,鏈表B_in_A存儲(chǔ)實(shí)體B中與實(shí)體A相交所產(chǎn)生的修改面;保留面是實(shí)體的原有面,經(jīng)過(guò)布爾運(yùn)算未發(fā)生變化而被保留下來(lái)的面,修改面是經(jīng)過(guò)布爾運(yùn)算將原有面進(jìn)行了修改并用于組成布爾運(yùn)算所得實(shí)體的面; 步驟106:實(shí)體A與實(shí)體B相離,則將實(shí)體A的所有面存入A_out_B,實(shí)體B的所有面存入 B_out_A,并令 A_in_B = null、B_in_A = null,轉(zhuǎn)至步驟 121 ; 步驟 107:遍歷實(shí)體 A 的鏈表 A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取實(shí)體A的一個(gè)面Fa ; 步驟108:判斷面Fa是否與實(shí)體B相交,若不相交,轉(zhuǎn)至步驟109,如果相交,轉(zhuǎn)至步驟110 ; 步驟109:將實(shí)體A的面Fa存入鏈表A_out_B,轉(zhuǎn)至步驟113 ; 步驟110:用面Fa截切實(shí)體B,得到剖面多邊形,記該多邊形為F1 ; 步驟111:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行WeiIer—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入A_in_B中; 步驟112:對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行WeiIer—Atherton外裁剪運(yùn)算,外裁剪結(jié)果存入A_out_B中; 步驟113:判斷實(shí)體A的面是否全部處理完,若未處理完轉(zhuǎn)至步驟107,若處理完,則轉(zhuǎn)至步驟114 ;
步驟 114:遍歷實(shí)體B 的鏈表13_?0;[111:_1181:、13_1^116_1181:、13_1^00卩_1181:、13_卩&。6_1181:,取實(shí)體B的一個(gè)面Fb ; 步驟115:判斷面Fb是否與實(shí)體A相交,若不相交,轉(zhuǎn)至步驟116,如果相交,轉(zhuǎn)至步驟
117 ; 步驟116:將實(shí)體B的面Fb存入鏈表B_out_A,轉(zhuǎn)至步驟120 ; 步驟117:用面Fb截切實(shí)體A,得到剖面多邊形,記該多邊形為F2 ; 步驟118:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行WeiIer—Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入B_in_A中; 步驟119:對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行Wei Ier—Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入B_out_A中; 步驟120:判斷實(shí)體B的面是否全部處理完,若未處理完轉(zhuǎn)至步驟114,若處理完,則轉(zhuǎn)至步驟121 ; 步驟121:判斷實(shí)體A和實(shí)體B的布爾運(yùn)算類型,若為并運(yùn)算A U B,則轉(zhuǎn)至步驟122;若為交運(yùn)算A Π B,則轉(zhuǎn)至步驟123 ;若為差運(yùn)算Α-Β,則轉(zhuǎn)至步驟124,若為差運(yùn)算Β-Α,則轉(zhuǎn)至步驟125 ; 步驟122:結(jié)果為鏈表A_out_B和B_out_A的合并; 步驟123:結(jié)果為鏈表A_in_B和B_in_A的合并; 步驟124:結(jié)果為將B_in_A中面的頂點(diǎn)順序反向后得到的鏈表和A_out_B鏈表的合并; 步驟125:結(jié)果為將A_in_B中面的頂點(diǎn)順序反向后得到的鏈表和B_out_A鏈表的合并。
2.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟103中判斷實(shí)體A的包圍盒和實(shí)體B的包圍盒是否相交,包括以下步驟: 步驟201:如果包圍盒A的A.max.X小于包圍盒B的B.min.X或者包圍盒A的A.min.X大于包圍盒B的B.max.X,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟202 ; 步驟202:如果包圍盒A的A.max.Y小于包圍盒B的B.min.Y或者包圍盒A的A.min.Y大于包圍盒B的B.max.Y,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟203 ; 步驟203:如果包圍盒A的A.max.Z小于包圍盒B的B.min.Z或者包圍盒A的A.min.Z大于包圍盒B的B.max.Z,轉(zhuǎn)至步驟204,否則轉(zhuǎn)至步驟205 ; 步驟204:結(jié)果為兩個(gè)包圍盒不相交; 步驟205:結(jié)果為兩個(gè)包圍盒相交。
3.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟108中判斷面Fa是否與實(shí)體B相交,包括以下步驟: 步驟301:讀取面Fa與實(shí)體B的所有面的信息; 步驟302:求面Fa的包圍盒; 步驟303:判斷面Fa的包圍盒與實(shí)體B的包圍盒是否相交,若不相交,則轉(zhuǎn)至步驟304,若相交,則轉(zhuǎn)至步驟305 ; 步驟304:結(jié)果為面Fa與實(shí)體B不相交; 步驟305:實(shí)體B的面是否全部判斷完,若判斷完,則轉(zhuǎn)至步驟304,若未判斷完,則轉(zhuǎn)至步驟306 ; 步驟306:取出實(shí)體B的一個(gè)面Fb ; 步驟307:把面Fa的所有邊與面Fb求交,得到理論交點(diǎn)集U ; 步驟308:把面Fb的所有邊與面Fa求交,得到理論交點(diǎn)集V ; 步驟309:判斷交點(diǎn)集U或V是否存在有效交點(diǎn),若不存在,則轉(zhuǎn)至步驟305,否則轉(zhuǎn)至步驟310 ; 步驟310:結(jié)果為面Fa與實(shí)體B相交。
4.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟110中用面Fa截切實(shí)體B,得到剖面多邊形F1,包括以下步驟: 步驟401:讀取面Fa與實(shí)體B的所有面的信息; 步驟402:取出實(shí)體B的一個(gè)面F ; 步驟403:判斷面Fa與面F是否相交,若不相交,則轉(zhuǎn)至步驟405,若相交,則轉(zhuǎn)至步驟404 ; 步驟404:求面Fa與面F的交線段,將其保存在相交線段鏈表IntersLine_list中;步驟405:判斷實(shí)體B的面是否遍歷完,若未遍歷完,則轉(zhuǎn)至步驟402,若遍歷完,則轉(zhuǎn)至步驟406 ; 步驟406:搜索鏈表IntersLine_list中的交線段,按相鄰線段端點(diǎn)重合的規(guī)則構(gòu)造環(huán),將構(gòu)造的環(huán)存入鏈表Loop_list ; 步驟407:求取面Fa的外法線矢量; 步驟408:求取鏈表Loop_list中各環(huán)所在平面的法向量; 步驟409:判斷各環(huán)法向量是否與Fa的外法線矢量方向相同,若方向相同則環(huán)的頂點(diǎn)順序不變,若方向相反則將環(huán)的頂點(diǎn)順序逆序排列,經(jīng)過(guò)方向處理后的各環(huán)仍保存在鏈表Loop_list 中; 步驟410:在環(huán)鏈表LoopJist中找出內(nèi)環(huán),將內(nèi)環(huán)的頂點(diǎn)順序逆序排列,最終得到的環(huán)鏈表LoopJist即為剖面多邊形F1的數(shù)據(jù)。
5.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟111中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行WeiIer — Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入A_in_B中,包括以下步驟: 步驟501:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形; 步驟502:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_P中; 步驟503:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_Q中; 步驟504:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組intersect1n_Point中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形; 步驟505:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_P,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_M ; 步驟506:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_Q,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_C ; 步驟507:建立空的裁剪結(jié)果多邊形頂點(diǎn)表loopTmp.Point_list ; 步驟508:在主多邊形頂點(diǎn)表數(shù)組data_M中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表loopTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò); 步驟509:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟510 ;若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟511 ; 步驟510:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_M中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.Point_list中,在data_M中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ; 步驟511:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_C中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.Point_list中,在data_C中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟512 ; 步驟512:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟509,若相同,則轉(zhuǎn)至步驟513 ; 步驟513:判斷主多邊形頂點(diǎn)表數(shù)組data_M中交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟508,若遍歷完,則轉(zhuǎn)至步驟514 ; 步驟514:將頂點(diǎn)表loopTmp.Point_list中的頂點(diǎn)按順序存入鏈表A_in_B。
6.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟112中對(duì)面Fa多邊形和剖面多邊形F1進(jìn)行WeiIer — Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入A_out_B中,包括以下步驟: 步驟601:讀取面Fa的數(shù)據(jù)信息,并將面Fa作為主多邊形,讀取剖面多邊形F1的數(shù)據(jù)信息,并將剖面多邊形F1作為裁剪多邊形; 步驟602:遍歷主多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)逆時(shí)針順序、內(nèi)環(huán)順時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_I中; 步驟603:遍歷裁剪多邊形環(huán)、邊和頂點(diǎn)鏈表,按外環(huán)順時(shí)針順序、內(nèi)環(huán)逆時(shí)針順序?qū)㈨旤c(diǎn)鏈表中的點(diǎn)存入數(shù)組data_J中; 步驟604:求出主多邊形和裁剪多邊形的所有交點(diǎn),將交點(diǎn)信息存入數(shù)組inters_P中,每個(gè)交點(diǎn)信息包括交點(diǎn)所屬的主多邊形和裁剪多邊形的邊的位置、“入”或“出”標(biāo)記及交點(diǎn)坐標(biāo);這里,交點(diǎn)為“入點(diǎn)”是指在該點(diǎn)處主多邊形進(jìn)入了裁剪多邊形,交點(diǎn)為“出點(diǎn)”是指在該點(diǎn)處主多邊形離開(kāi)了裁剪多邊形; 步驟605:根據(jù)交點(diǎn)位置將交點(diǎn)插入主多邊形頂點(diǎn)表數(shù)組data_I,插入交點(diǎn)后的主多邊形頂點(diǎn)表數(shù)組記為data_MM ; 步驟606:根據(jù)交點(diǎn)位置將交點(diǎn)插入裁剪多邊形頂點(diǎn)表數(shù)組data_J,插入交點(diǎn)后的裁剪多邊形頂點(diǎn)表數(shù)組記為data_CC ; 步驟607:建立空的裁剪結(jié)果多邊形頂點(diǎn)表loopTmp.P_list ; 步驟608:在主多邊形頂點(diǎn)表數(shù)組data_MM中,取未遍歷過(guò)的第一個(gè)交點(diǎn)作為裁剪結(jié)果的每個(gè)多邊形起點(diǎn)且作為當(dāng)前交點(diǎn),并將其存入頂點(diǎn)表loopTmp.P_list中,在data_MM中標(biāo)記該交點(diǎn)已遍歷過(guò); 步驟609:判斷當(dāng)前交點(diǎn)為“入點(diǎn)”還是“出點(diǎn)”,若當(dāng)前交點(diǎn)為“出點(diǎn)”,則轉(zhuǎn)至步驟610 ;若當(dāng)前交點(diǎn)為“入點(diǎn)”,則轉(zhuǎn)至步驟611 ; 步驟610:進(jìn)入主多邊形頂點(diǎn)表數(shù)組data_MM中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取到的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_MM中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ; 步驟611:進(jìn)入裁剪多邊形頂點(diǎn)表數(shù)組data_CC中同位置交點(diǎn)處,從該交點(diǎn)下一個(gè)頂點(diǎn)起由前往后取頂點(diǎn)一直取到交點(diǎn)處且該交點(diǎn)作為當(dāng)前交點(diǎn),并把取至1J的點(diǎn)存入頂點(diǎn)表loopTmp.P_list中,在data_CC中標(biāo)記該交點(diǎn)已遍歷過(guò),轉(zhuǎn)至步驟612 ; 步驟612:判斷當(dāng)前交點(diǎn)是否與裁剪結(jié)果多邊形起點(diǎn)相同,若不同,則轉(zhuǎn)至步驟609,若相同,則轉(zhuǎn)至步驟613 ; 步驟613:判斷主多邊形頂點(diǎn)表數(shù)組data_MM中交點(diǎn)是否全部遍歷完,若未遍歷完,則轉(zhuǎn)至步驟608,若遍歷完,則轉(zhuǎn)至步驟614 ; 步驟614:將頂點(diǎn)表loopTmp.P_list中的頂點(diǎn)按順序存入鏈表A_out_B。
7.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟115中判斷面Fb是否與實(shí)體A相交,包括的步驟與步驟108中的步驟301?步驟310相同,所不同的是將步驟301?步驟310中的Fa變?yōu)镕b,F(xiàn)b變?yōu)镕a,實(shí)體B變?yōu)閷?shí)體A。
8.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟117中用面Fb截切實(shí)體A,得到剖面多邊形F2,包括的步驟與步驟110中的步驟401?步驟410相同,所不同的是將步驟401?步驟410中的Fa變?yōu)镕B,實(shí)體B變?yōu)閷?shí)體A,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2。
9.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟118中對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行WeiIer — Atherton內(nèi)裁剪運(yùn)算,將內(nèi)裁剪結(jié)果存入B_in_A中,包括的步驟與步驟111中的步驟501?步驟514相同,所不同的是將步驟501?步驟514中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,內(nèi)裁剪結(jié)果A_in_B變?yōu)锽—in—A0
10.根據(jù)權(quán)利要求1所述的一種三維平面實(shí)體的布爾運(yùn)算方法,其特征是:所示的步驟119中對(duì)面Fb多邊形和剖面多邊形F2進(jìn)行WeiIer — Atherton外裁剪運(yùn)算,將外裁剪結(jié)果存入B_out_A*,包括的步驟與步驟112中的步驟601?步驟614相同,所不同的是將步驟601?步驟614中的Fa變?yōu)镕b,剖面多邊形F1變?yōu)槠拭娑噙呅蜦2,外裁剪結(jié)果A_out_B變?yōu)?B_out_A。
【文檔編號(hào)】G06T17/10GK104134236SQ201410369841
【公開(kāi)日】2014年11月5日 申請(qǐng)日期:2014年7月30日 優(yōu)先權(quán)日:2014年7月30日
【發(fā)明者】許社教, 邱揚(yáng), 張居峰, 徐延雪, 田錦, 杜美玲 申請(qǐng)人:西安電子科技大學(xué)
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
张家口市| 巴青县| 高台县| 庆城县| 个旧市| 华阴市| 凤冈县| 双城市| 井研县| 衡东县| 昌邑市| 台东县| 富锦市| 清河县| 吴桥县| 开鲁县| 宁城县| 瓦房店市| 左云县| 马边| 恩平市| 昔阳县| 南昌县| 东方市| 邯郸市| 诏安县| 兰州市| 阿尔山市| 花垣县| 专栏| 澳门| 台山市| 顺义区| 武清区| 太仓市| 手机| 手机| 河曲县| 张家川| 高碑店市| 廊坊市|