是二維圖形外輪廓的逼近,并非真實(shí)外輪廓。
[0098]針對由2維平面片封閉的3維外輪廓,其與3維球體的表面是拓?fù)涞葍r(jià)的,即在不發(fā)生撕裂或粘黏的情況下,3維外輪廓可以拓?fù)渥儞Q為3維球體的表面(如附圖1(b)所示)。就如由I維邊封閉的2維外輪廓,其與2維圓圈的邊界是拓?fù)涞葍r(jià)的,即在不發(fā)生撕裂或粘黏的情況下,2維外輪廓可以拓?fù)渥儞Q為2維圓圈的表面(如附圖1(a)所示)。
[0099]針對構(gòu)成3維外輪廓的2維平面片與2維平面片之間的二面角計(jì)算,比構(gòu)成2維外輪廓的I維邊與I維邊之間的夾角計(jì)算,要復(fù)雜。然而,二面角的計(jì)算可以簡化處理:將嵌入于三維空間中的任意姿態(tài)的平面片束(如附圖2(a)所示)剛性變換至垂直于XOY的平面片束(如附圖2(b)所示),再將每個(gè)平面片映射到XOY上的直線段(如附圖2(c)所示)。通過以上處理,二面角的計(jì)算簡化為一維夾角的計(jì)算。更為具體的,在附圖2(a)中,ABCD代表了平面片fl,ABOP代表了平面片f2,ABEF代表了平面片f5,平面片f3和f4類似定義,這些平面片嵌入于三維空間中;在附圖2(b)中,f 1,f2,f5,f3,f4統(tǒng)一垂直于XOY平面;在附圖2(c)中,平面片fl,f2, f5, f3, f4都各自簡化為XOY平面中的一條直線段。
[0100]值得注意的是,之所以稱為“三維外輪廓”,其是由處于最外圍的平面片的構(gòu)成,一方面其內(nèi)部是呈現(xiàn)“掏空”的,另一方面其外部也是呈現(xiàn)“空曠”的。利用以上極限特征,可以認(rèn)為:針對三維外輪廓外部的“無限遠(yuǎn)體”,可以看作是三維外輪廓內(nèi)部的“最小體集合”在三維空間中的補(bǔ)集,故而“無限遠(yuǎn)體”與“最小體集合”的邊界相同,即三維外輪廓。
[0101]以下結(jié)合附圖和具體實(shí)施例詳細(xì)說明本發(fā)明技術(shù)方案。
[0102]本發(fā)明采用的三維空間數(shù)據(jù)模型中,主要包括節(jié)點(diǎn)、邊、環(huán)、平面片、殼、體這6類基元。針對這6類基元的具體說明如下:
[0103](I)節(jié)點(diǎn)(3D Point)
[0104]節(jié)點(diǎn)是嵌入于三維空間中的一類O維基元,它記錄了 X,Y, Z坐標(biāo)。節(jié)點(diǎn)(Point)在數(shù)據(jù)庫中一般記為Node,它在歐拉公式中一般記為Vertex。
[0105](2)邊(Edge)
[0106]邊是嵌入于三維空間中的一類I維基元,它是由起始節(jié)點(diǎn)和終止節(jié)點(diǎn)封閉的一條有向直線段。邊的物理方向由起始節(jié)點(diǎn)指向終止節(jié)點(diǎn)。邊的起始節(jié)點(diǎn)和終止節(jié)點(diǎn)不能夠是同一個(gè)點(diǎn)。邊通常也記為弧段。邊同胚于I維流形。
[0107](3)環(huán)(Ring)
[0108]環(huán)是嵌入于三維空間中的I維基元,它由至少3條邊封閉而成,這些邊形成一個(gè)集合,稱為環(huán)的構(gòu)造邊集合(R.edges);包含于這些邊中的所有節(jié)點(diǎn),稱環(huán)的構(gòu)造節(jié)點(diǎn)集合(R.vertices)。環(huán)是I維基元,邊是I維基元,且環(huán)是邊的聚合。環(huán)是封閉的,即構(gòu)成環(huán)的第一條邊和最后一條邊具有公共節(jié)點(diǎn)。盡管以上沒有顯式約束環(huán)的所有構(gòu)造邊必須位于同一個(gè)平面片上,但直接引用環(huán)對象的只有平面片對象,而平面片上所有點(diǎn)必然位于同一平面上,所以默認(rèn)環(huán)的所有構(gòu)造邊位于同一個(gè)平面上。環(huán)通常也記為循環(huán)(Loop)或圈(Cycle)。
[0109](4)平面片
[0110]平面片是嵌入于三維空間中的一類2維基元,它是由唯一外環(huán)和O至多個(gè)內(nèi)環(huán)封閉而成的區(qū)域。平面片的邊界是環(huán)。平面片的唯一外環(huán)上的邊和所有內(nèi)環(huán)上的邊共同形成一個(gè)集合,該集合稱為平面片的構(gòu)造邊集合(F.edges)。以上邊中包含的所有節(jié)點(diǎn),稱平面片的構(gòu)造節(jié)點(diǎn)集合(F.vertices) ο 一個(gè)平面片包含至少3條構(gòu)造邊。平面片是相對簡單多邊形,可以是凸的,可以是凹的。當(dāng)一個(gè)平面片只由3條邊構(gòu)成時(shí),平面片退化為三角形。值得注意的是,不允許平面片的外環(huán)與內(nèi)環(huán)接觸,內(nèi)環(huán)與內(nèi)環(huán)之間也不允許發(fā)生接觸或嵌套。因此,平面片同胚于2維流形,而環(huán)不一定同胚于I維流形。
[0111]平面片具有法向量。在平面片任意一個(gè)環(huán)內(nèi),其構(gòu)造邊的排列是有序的,即構(gòu)造邊集合有一定的走向,也即前一條邊與后一條邊一定有公共節(jié)點(diǎn);同時(shí),每條邊本身有物理方向,即從邊的起始節(jié)點(diǎn)指向邊的終止節(jié)點(diǎn)。但在同一個(gè)環(huán)內(nèi),并不是所有邊的方向都一致,也即前一條邊的終止節(jié)點(diǎn)與后一條邊的起始節(jié)點(diǎn)并不一定是同一個(gè)點(diǎn)。因此,需要一個(gè)統(tǒng)一規(guī)則來決定平面片的法向量,通常采用右手定則(即四指方向?yàn)槠矫嫫奈ㄒ煌猸h(huán)中邊的環(huán)繞方向,大拇指方向?yàn)榉ㄏ蛄糠较?。進(jìn)一步的,當(dāng)平面片的唯一外環(huán)的邊集合確定后,該邊集合的環(huán)繞方向就與每條邊的本身方向作比較,如果一致則該條邊標(biāo)記”+”,否則標(biāo)記,,-,,。
[0112]任一平面片都具有兩側(cè)。因?yàn)槊總€(gè)平面片都有一個(gè)所在超平面,該超平面將三維空間分成兩部分,一般把平面片法向量所在一側(cè)稱為正面,把異于平面片法向量的一側(cè)稱為背面。在Google Sketchup中,平面片的正面默認(rèn)繪制為白色,平面片的背面默認(rèn)繪制為灰色。
[0113](5)殼(Shell)
[0114]殼是嵌入于三維空間中的一類2維基元,它由至少4個(gè)平面片構(gòu)成。在二維情況中,環(huán)是多邊形的邊界;類似的,在三維情況中,殼是體的邊界。具體的,多邊形由I個(gè)外環(huán)和O至多個(gè)內(nèi)環(huán)封閉,而體由I個(gè)外殼和O至多個(gè)內(nèi)殼封閉。
[0115](6)體(Body)
[0116]體是嵌入于三維空間中的一類3維基元,它由I個(gè)外殼和O至多個(gè)內(nèi)殼封閉。換言之,體由至少4個(gè)平面片封閉。體的邊界是殼,或稱體的邊界是平面片,它們形成一個(gè)集合,稱體的構(gòu)造平面片集合(B.facets)。體內(nèi)部不存在其它基元,也稱最小體。平面片的法向量(normalVector)只有I個(gè),具有客觀的計(jì)算數(shù)值。與此不同,一個(gè)平面片的方向(dir)是主觀定義的,而且認(rèn)為有兩個(gè),即后向(標(biāo)記為”1”)和前向(標(biāo)記為”2”)。其中,針對每個(gè)平面片而言,當(dāng)該平面片的法向量指向某個(gè)體的外部時(shí),此時(shí)的平面片(注意:不用“該平面片”)稱為前向平面片(即使用了平面片的正面),該體稱為后向體;當(dāng)該平面片的法向量指向某個(gè)體的內(nèi)部時(shí),此時(shí)的平面片(注意:不用“該平面片”)稱為后向平面片(即使用了平面片的背面),該體稱前向體。
[0117]本發(fā)明的總體上包括4個(gè)大步驟,即:(1)首先,根據(jù)連通性找到多個(gè)連通分支;
(2)然后,找到其中具備極值頂點(diǎn)的那個(gè)連通分支,該連通分支包含了三維外輪廓(同時(shí)包含了用于構(gòu)造內(nèi)部最小體的面片);(3)之后,找到具備極值頂點(diǎn)的最外圍的面片;(4)接著,從最外圍面片出發(fā),采用深度優(yōu)先遍歷(DFS, Depth-first Search)依次找到構(gòu)成三維外輪廓包含的所有平面片。
[0118]針對大步驟⑴和(2),主要利用了拓?fù)鋵W(xué)中的連通性原理。針對大步驟⑶,主要利用了計(jì)算幾何原理。針對大步驟(4),同時(shí)利用了拓?fù)鋵W(xué)中連通性與計(jì)算幾何這兩個(gè)原理。同時(shí),在大步驟(4)中,之所以采用深度優(yōu)先遍歷(DFS),是因?yàn)樵凇懊嫦虻丶娜S空間數(shù)據(jù)模型”相關(guān)研宄中目前都采用廣度優(yōu)先遍歷(BFS,Breadth-first Search),兩者搜索結(jié)果相同,但在搜索過程有所不同,包括采用廣度優(yōu)先遍歷則呈現(xiàn)“環(huán)狀”搜索效果,而采用深度優(yōu)先遍歷則呈現(xiàn)“條帶狀”搜索結(jié)果。針對后者,在目前的相關(guān)研宄中幾乎沒有具體討論,所以在本發(fā)明中詳述。
[0119]附圖3給出了針對帶內(nèi)穴的簡單案例尋找三維外輪廓的簡要過程分析。如附圖3所示,從左到右依次為初始數(shù)據(jù)(包含多個(gè)連通分支)、包含三維外輪廓的連通分支、三維外輪廓示意圖,初始輸入數(shù)據(jù)為由多個(gè)面片構(gòu)成的大立方體,最終形成5X5X5個(gè)小立方體,每個(gè)小立方體中都有一個(gè)內(nèi)穴。借助連通性原理,因?yàn)槊總€(gè)內(nèi)穴是一個(gè)單獨(dú)的連通分支,所以總共形成了 126(126 = 5X5X5+1)個(gè)連通分支,其中125個(gè)連通分支為內(nèi)穴,另外I個(gè)連通分支為包含三維外輪廓的連通分支,稍后利用大步驟(3)和(4)找到以上連通分支中包含的最外圍平面片集合,即三維外輪廓。
[0120]附圖4給出了帶穿洞的簡單案例尋找三維外輪廓的簡要過程分析。如附圖4所示,從左到右依次為初始數(shù)據(jù)(以普通模式觀察)、初始數(shù)據(jù)(以透視模式觀察)、三維外輪廓(以透視模式觀察),初始輸入數(shù)據(jù)為由多個(gè)面片構(gòu)成的帶穿洞的封閉實(shí)體,穿洞并沒有增加連通分支的個(gè)數(shù),穿洞部分包含的面片事實(shí)上屬于三維外輪廓的一部分,稍后利用大步驟(3)和(4)找到以上連通分支中包含的最外圍面片集合,即三維外輪廓。
[0121]需要注意的是,針對大步驟(3),往往認(rèn)為包含最多面片個(gè)數(shù)的連通分支為包含三維外輪擴(kuò)的連通分支。事實(shí)上,這種從集合論角度來獲取包含三維外輪廓的連通分支的方法是錯(cuò)誤的,設(shè)想一個(gè)僅僅由6個(gè)大面片封閉的立方體內(nèi)部有一個(gè)小球體,而該小球體由上百個(gè)(甚至上千個(gè))小面片逼近而成,此時(shí)從集合論角度獲取三維輪輪廓是不適用的。還是應(yīng)該利用計(jì)算幾何原理(以下詳述)。
[0122]更為具體的,本發(fā)明闡述的自動(dòng)獲取三維外輪廓的具體實(shí)現(xiàn)步驟如下:
[0123]單個(gè)連通分支內(nèi)所有最小體共同形成一個(gè)較大的體,稱為三維外輪廓體(簡稱外輪廓體)。在三維空間中去除那些常規(guī)認(rèn)知的、具備有限體積的最小體之后,剩余的三維空間稱為無窮遠(yuǎn)體。無窮遠(yuǎn)體可以看作所有常規(guī)體在三維空間的補(bǔ)集。無窮遠(yuǎn)體的邊界(由平面片構(gòu)成)與相應(yīng)外輪廓體的邊界(由平面片構(gòu)成)相同。因此,針對搜索三維外輪廓體的邊界,也即等價(jià)于搜索無窮遠(yuǎn)體的邊界。無窮遠(yuǎn)體的邊界具有極值性,采用最大Z值、最小Z值、最大X值、最小X值、最大Y值、最小Y值作為判斷使用的極值均可,以下以Z軸正向最大值為例闡述三維外輪廓體的邊界(也即三維外輪廓)的具體構(gòu)造過程。包括如下步驟:
[0124](I)根據(jù)連通性找到原始給定平面片集合中存在的多個(gè)連通分支;
[0125](2)確定每個(gè)連通分支包含的平面片集合,每個(gè)平面片集合中的平面片之間通過邊相互鄰接;(3)針對每個(gè)連通分支,獲取每個(gè)連通分支的最小外接盒。計(jì)算該最小外接盒的最大Z值,簡稱“分支最大Z值”;
[0126](4)比較所有的“分支最大Z值”,獲得其中具備最大“分支最大Z值”的那個(gè)連通分支,以后操作都針對該連通分支進(jìn)行,即確定該連通分支為后續(xù)操作對象,且最大“分支最大Z值”簡稱為“最大Z值”;
[0127](5)創(chuàng)建一個(gè)結(jié)果平面片,內(nèi)容為空;
[0128](6)創(chuàng)建一個(gè)相接平面片集合,內(nèi)容為空。
[0129](7)將(4)所確定連通分支相應(yīng)平面片集合作為當(dāng)前的給定平面片集合,針對給定平面片集合中的每個(gè)平面片的每個(gè)頂點(diǎn),比較頂點(diǎn)的Z值與“最大Z值”:若存在有一個(gè)或者一個(gè)以上頂點(diǎn)等于“最大Z值”的平面片,則將該平面片加入以上相接平面片集合中。
[0130](8)針對給定平面片集合,如果存在所有頂點(diǎn)的Z值等于“最大Z值”的平面片,將該平面片標(biāo)記為平行平面片,并轉(zhuǎn)入步驟(9),進(jìn)一步的,如果客觀上存在多個(gè)平行平面片,則選取其中任意一個(gè)作為平行平面片,并轉(zhuǎn)入步驟(9);如果不存在,則轉(zhuǎn)入步驟(10)。
[0131](9)比較平行平面片的法向量與三維矢量(0,0,I)的夾角大小,進(jìn)行以下處理,然后轉(zhuǎn)入步驟(12):(i)若兩者夾角為0,則將該平面片標(biāo)記為結(jié)果平面片,且結(jié)果平面片的方向?yàn)镮 ;
[0132](ii)若兩者夾角為180,則將該平面片標(biāo)記為結(jié)果平面片,且結(jié)果平面片的方向?yàn)? ;
[0133](10)針對相接平面片集合中的每個(gè)平面片,計(jì)算其法向量與三維矢量(0,0,I)的夾角,該夾角記為“原始夾角”。比較原始夾角與90進(jìn)行如下處理計(jì)算“處理夾角”,然后進(jìn)入步驟(11):
[0134](i)若原始夾角處于(0,90),則不處理,原始夾角即“處理夾角”;
[0135](ii)若原始夾角處于(90,180),則將180減去原始夾角,結(jié)果標(biāo)記為“處理夾角”;
[0136](11)從相接平面片集合中的所有平面片中,選擇“處理夾角”最小的那個(gè)平面片,將該平面片標(biāo)記為結(jié)果平面片。
[0137]同時(shí),根據(jù)結(jié)果平面片的“原始夾角”計(jì)算結(jié)果平面片的方向:
[0138](i)若原始夾角處于(0,90),則結(jié)果平面片的方向?yàn)镮 ;
[0139](ii)若原始夾角處于(90,180),則結(jié)果平面片的方向?yàn)? ;
[0140](12)搜索結(jié)束,結(jié)果平面片即外輪廓體邊界上的一個(gè)平面片,并返回結(jié)果平面片。
[0141](13)創(chuàng)建外輪廓體,內(nèi)容為空;
[0142](14)創(chuàng)建當(dāng)前平面片(當(dāng)前平面片的大小始終為一個(gè)),采用結(jié)果平面片初始化;
[0143](15)針對當(dāng)前平面片,讀取此時(shí)當(dāng)前平面片的方向,將該平面片以及此時(shí)的方向加入外輪廓體中,同時(shí)對該平面片此時(shí)方向?qū)?yīng)的側(cè)面作標(biāo)記:
[0144]⑴若此時(shí)當(dāng)前平面片的方向?yàn)?(即表明搜索前向無窮遠(yuǎn)體),則該平面片的背面標(biāo)記“已使用”;
[0145](ii)若此時(shí)當(dāng)前平面片的方向?yàn)?(即表明搜索后向無窮遠(yuǎn)體),則該平面片的正面標(biāo)記“已使用