路 云,巨正平
(1.云南睿琦勘察設(shè)計(jì)有限公司,云南 昆明 650231;2.國(guó)家林業(yè)局昆明勘察設(shè)計(jì)院, 云南 昆明 650216)
隨著煤礦井下各種圖形實(shí)現(xiàn)計(jì)算機(jī)繪制與管理,在煤礦巷道圖繪制過程中,巷道繪制的工作量大,而且重復(fù)性勞動(dòng)過多,由于煤礦巷道圖的整幅圖形中直線巷道是很多的,且并不成水平或垂直大都有一定的斜率,各個(gè)巷道之間還有各種復(fù)雜的拓?fù)潢P(guān)系,若由CAD等繪圖工具進(jìn)行繪制,繪制工作將是非常繁瑣的,而且容易出錯(cuò),因此,由井下控制點(diǎn)自動(dòng)生成礦圖巷道的探究在煤礦巷道的繪制中起到越來越重要的作用[1]。
通過井下控制點(diǎn)自動(dòng)生成巷道圖形的計(jì)算方法已有很多種[2-3,6],在現(xiàn)有的巷道接口處理技術(shù)中,一般將巷道節(jié)點(diǎn)處處理技術(shù)分為兩條巷道之間和三條及三條巷道以上之間的處理方式。對(duì)于兩條巷道的連接,同地下三維管線處理技術(shù)幾乎相同,都是先將巷道中線生成巷道雙線時(shí)的重疊區(qū)域分離開,然后把巷道模型截面細(xì)化成各個(gè)點(diǎn),并用相鄰的巷道截面構(gòu)建巷道體,最后對(duì)模型節(jié)點(diǎn)處進(jìn)行修復(fù)。對(duì)多條巷道接口處理技術(shù)并沒有很好的技術(shù)借鑒[7],目前,一種是多條巷道處于分離狀態(tài),直接對(duì)分離的三條巷道進(jìn)行接口處理,本方法可能和巷道數(shù)據(jù)源有關(guān);另一種是多條巷道處交與一點(diǎn),以第一次出現(xiàn)的中線為基準(zhǔn),計(jì)算與其他巷道中線的夾角,逆時(shí)針按從小到大的順序進(jìn)行排列,再計(jì)算相鄰兩巷道相鄰兩半截面的偏移量。這種方法將每條巷道的截面分成2份,對(duì)每條巷道的左右截面進(jìn)行計(jì)算偏移量,并以半截面為單位分別移動(dòng)截面點(diǎn)坐標(biāo)。本論文以每條巷道的截面為單元,順次計(jì)算各個(gè)巷道截面的偏移量,相鄰巷道取較大偏移量將巷道截面點(diǎn)坐標(biāo)依次移動(dòng)。采用一條巷道對(duì)應(yīng)一個(gè)截面的方式可以很好的管理截面點(diǎn)數(shù)據(jù),始終將截面點(diǎn)數(shù)據(jù)與巷道中線點(diǎn)坐標(biāo)對(duì)應(yīng),在檢索任意節(jié)點(diǎn)處時(shí)可按照此方法根據(jù)巷道中線數(shù)據(jù)實(shí)時(shí)計(jì)算出截面的坐標(biāo).本算法采用C#語(yǔ)言開發(fā)OpenGL 實(shí)現(xiàn)進(jìn)行實(shí)驗(yàn)。以兩條巷道三維體修飾算法為例。
巷道拐點(diǎn)及其巷道交點(diǎn)處都稱節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)連接處的巷道,如果是同一巷道內(nèi)的弧段(也稱兩條巷道相交),可根據(jù)相連的關(guān)系對(duì)接口處進(jìn)行連接;如果是巷道之間的連接處,因?yàn)楣?jié)點(diǎn)處的幾條巷道在空間上沒有規(guī)律可循就會(huì)出現(xiàn)重疊或錯(cuò)切的現(xiàn)象,需要對(duì)巷道之間空間關(guān)系進(jìn)行判別,然后對(duì)相接處進(jìn)行處理,其實(shí)質(zhì)即為空間三維直線拓?fù)潢P(guān)系問題[8,10-11]。本文對(duì)節(jié)點(diǎn)連接使用先處理相交再統(tǒng)一縫合的方法,即“先分離再縫合”的方法。方法規(guī)定:規(guī)定前進(jìn)方向,兩條巷道方向規(guī)定為巷道中線依次連接方向;三條及其三條以上巷道方向規(guī)定為以連接節(jié)點(diǎn)為中心,指向節(jié)點(diǎn)方向?yàn)榍斑M(jìn)方向,巷道以左為左幫,巷道以右為右?guī)?,?jié)點(diǎn)處截面點(diǎn)坐標(biāo)依次編號(hào)0-11,共12點(diǎn),巷道右?guī)偷酌娼屈c(diǎn)為0號(hào)點(diǎn),逆時(shí)針旋轉(zhuǎn)依次對(duì)應(yīng)0-11號(hào)點(diǎn)。如圖1、圖2所示。
圖1 兩條巷道相交巷道前進(jìn)方向
圖2 三條巷道相交巷道前進(jìn)方向
如圖3所示,為巷道A0O和巷道B0O相交,A0O、B0O為巷道中線,交點(diǎn)為O,A1A2A3A4和B1B2B3B4是由單線巷道生成的雙線巷道,可見在生成雙線巷道時(shí)巷道兩個(gè)幫線出現(xiàn)了重疊和相離的情況,因此,在構(gòu)建三維巷道體時(shí)也會(huì)出現(xiàn)體與體之間的空間重疊和相離現(xiàn)象。這樣會(huì)導(dǎo)致模型的失真,同時(shí)也影響在巷道體內(nèi)的漫游。所以,在進(jìn)行三維模型建立前必須對(duì)重疊和相離現(xiàn)象進(jìn)行處理,即對(duì)重疊部分進(jìn)行裁剪;對(duì)相離部分進(jìn)行連接。算法思想如下:
圖3 兩條巷道節(jié)點(diǎn)處二維平面圖
確定重疊部分和相離部分:在處理之前必須將重疊部分和相離部分確定出來。如圖4所示,巷道由A0→O→B0,箭頭表示數(shù)據(jù)存儲(chǔ)順序前進(jìn)方向,規(guī)定巷道沿前進(jìn)方向左手邊稱巷道左邊,右手邊稱巷道右邊,α為巷道A0O與巷道B0O之間的夾角,由此我們可以根據(jù)以下進(jìn)行判斷:
圖4 巷道前進(jìn)方向與夾角示意圖
圖5 處理后兩條巷道間節(jié)點(diǎn)處二維平面圖
經(jīng)處理后巷道節(jié)點(diǎn)二維平面圖如圖5所示。
計(jì)算幫線交點(diǎn)O1點(diǎn)坐標(biāo):通過α值可以判斷出O1點(diǎn)所處位置,如圖3,然后將重疊端A4O1和B4O1的偏移量裁去,得出如圖5所示的巷道。O1點(diǎn)坐標(biāo)由已經(jīng)計(jì)算出的截面坐標(biāo)進(jìn)行計(jì)算,即為線段A1A4和線段B1B4的交點(diǎn)坐標(biāo)。
A1A4和B1B4的坐標(biāo)為已知點(diǎn)坐標(biāo),使用向量法即可得出O1的坐標(biāo);
A1O1∥O1A4
B1O1∥O1B4
巴蘭對(duì)自己的貢獻(xiàn)始終非常謙虛。他曾將互聯(lián)網(wǎng)比作由許多人歷經(jīng)多年建造的大教堂,不斷有新人加入其中,每個(gè)人都在舊基礎(chǔ)之上添磚加瓦。每人都會(huì)說我建造了一個(gè)大教堂。他說:“如果你不注意,就會(huì)騙自己相信你做了最重要的工作。但現(xiàn)實(shí)情況是,每一項(xiàng)貢獻(xiàn)都建立在先前工作的基礎(chǔ)之上,一切都與其他事物息息相關(guān)?!?/p>
更新巷道截面坐標(biāo)點(diǎn)數(shù)據(jù):得到O1點(diǎn)坐標(biāo)后,根據(jù)截面12個(gè)點(diǎn)的分布,找出與O1點(diǎn)對(duì)應(yīng)的坐標(biāo)A[0,i],求出坐標(biāo)的增量Dx、Dy,然后遍歷截面坐標(biāo)統(tǒng)一加減Dx、Dy,以替換原有的界面坐標(biāo),作為巷道三維建模的截面數(shù)據(jù)。本文弧頂圓曲線采用∏/8離散化方式,離散化巷道截面圖如圖6所示。
圖6 ∏/8離散化后截面圖
OQ左側(cè)拱形5個(gè)離散點(diǎn)坐標(biāo)(1<=n<=5):
OQ右側(cè)拱形5個(gè)離散點(diǎn)坐標(biāo)(6<=n<=10):
連接各對(duì)應(yīng)點(diǎn)生成巷道體:得到處理后巷道的兩個(gè)截面點(diǎn)數(shù)據(jù)后便可以建立三維巷道模型,根據(jù)連接節(jié)點(diǎn)的方法,將連接相鄰兩截面點(diǎn)構(gòu)建三角面,最終實(shí)現(xiàn)三維巷道模型。
在巷道節(jié)點(diǎn)連接處重合部分處理完后,另一幫面必然出現(xiàn)相離的現(xiàn)象,所以要對(duì)出現(xiàn)相離的一端進(jìn)行縫合,使巷道形成一個(gè)封閉的體域。兩條巷道節(jié)點(diǎn)處兩個(gè)截面都有對(duì)應(yīng)的坐標(biāo),只需將新的截面坐標(biāo)相互連接形成四邊面即可[4]。若不考慮無用面可從0點(diǎn)到12點(diǎn)依次進(jìn)行構(gòu)四邊形面,但是這樣回形成一個(gè)只有兩點(diǎn)的四邊形面,為A0A1B0B1面,因?yàn)锳0與B0重合,A1與B1重合;若考慮剔除這個(gè)無用的面,首先在判斷交點(diǎn)位置時(shí)給予標(biāo)示,無用面得形成無非是A0A1B0B1或者A10A11B10B11,把握好在那一邊即可剔除。同時(shí),底面也需要縫合,理論上底面也是四邊形面,但是A0與B0或者A11與B11始終會(huì)有一對(duì)是交點(diǎn),所以底面形狀上只是一個(gè)三角面。流程圖如圖7所示。
圖7 兩條巷道節(jié)點(diǎn)處縫合
無論在節(jié)點(diǎn)處為幾條巷道相交,方法和三條巷道相交處理是完全相同的,先進(jìn)行巷道分離,然后再進(jìn)行巷道的縫合,使得三維巷道體能夠形成一個(gè)封閉的體域。如圖8、圖9為巷道節(jié)點(diǎn)連接方式及縫合的過程圖。
OpenGL是一個(gè)底層圖形庫(kù)規(guī)范。它為程序員提供了一個(gè)小的幾何圖元(點(diǎn)、線、多邊形、圖片和位圖)庫(kù)和一個(gè)支持2D/3D幾何對(duì)象繪圖命令庫(kù)[5],通過所提供的圖元和命令來控制對(duì)象的呈現(xiàn)(繪圖)。OpenGL圖形基礎(chǔ)元素和GIS的相同,并具有強(qiáng)大的三維功能,坐標(biāo)變換,模型構(gòu)建、視口移動(dòng),渲染等。
圖8 RGBA模式兩條巷道節(jié)點(diǎn)連接及縫合圖
圖9 RGBA模式兩條巷道節(jié)點(diǎn)連接及縫合圖
線條元素構(gòu)建函數(shù):
GL.glBegin(GL.GL_LINES);
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(x2, x2, z2);//起始點(diǎn)
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(x3, y3, z3);//終止點(diǎn)
GL.glEnd();
面狀元素構(gòu)建函數(shù):
GL.glBegin(GL.GL_QUADS);
//空間四點(diǎn)構(gòu)建面
GL.glColor3f(1.0f, 1.0f, 1.0f); GL.glVertex3f(AN[0, 0], AN[0, 1], AN[0, 2]);
GL.glColor3f(1.0f, 1.0f, 1.0f); GL.glVertex3f(BN[0, 0], BN[0, 1], BN[0, 2]);
GL.glColor3f(1.0f, 1.0f, 1.0f); GL.glVertex3f(BN[11, 0], BN[11, 1], BN[11, 2]);
GL.glColor3f(1.0f, 1.0f, 1.0f); GL.glVertex3f(AN[11, 0], AN[11, 1], AN[11, 2]);
GL.glEnd();
三維礦井巷道體間節(jié)點(diǎn)連接算法的研究對(duì)井下三維巷道自動(dòng)化建模具有十分重要的意義,它可以使用井下巷道基本的中線坐標(biāo)信息快速建立模型[8],并對(duì)三維模型節(jié)點(diǎn)處進(jìn)行處理,使得整個(gè)三維模型形成封閉、平滑的模型體。大大解放了手工建模的工作[10-11]。本文主要對(duì)三維模型巷道間連接處處理方法的研究,通過算法自動(dòng)完成節(jié)點(diǎn)處模型的縫合處理。本人使用C#連接OpenGL圖形庫(kù),對(duì)生成的模型進(jìn)行了可視化 ,同時(shí)實(shí)現(xiàn)了模型的三維漫游、旋轉(zhuǎn)等操作 ,并利用實(shí)際工程中的礦井中線坐標(biāo)數(shù)據(jù)對(duì)該構(gòu)模方法進(jìn)行了測(cè)試 ,其建模速度快 ,且建立的模型層次分明,無重疊部分,建模結(jié)果有效表明該方法有一定的可靠性,所以該方法在三維巷道建模中有廣泛的實(shí)用性。