王嗣策
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院, 成都 611756)
鐵路運(yùn)營(yíng)過(guò)程中,電路圖紙是管理和維護(hù)鐵路信號(hào)設(shè)備的重要依據(jù)。結(jié)合三維場(chǎng)景顯示的電路圖軟件能夠提供更多信息,直觀易懂,成為提高鐵路運(yùn)輸效率和職工專業(yè)素質(zhì)的有效工具。常用的圖形顯示及建模方法有:(1)AutoCAD[1],具備基本三維設(shè)計(jì)功能,并可以通過(guò)內(nèi)嵌語(yǔ)言 Visual Lisp,VBA和ARX等進(jìn)行二次開發(fā),但是其開發(fā)主要目標(biāo)是完成自動(dòng)繪圖,難以實(shí)現(xiàn)如電路圖的功能仿真等需求[1]。(2)LightWave 3D, Unigraphics NX和CATIA等三維建模軟件,三維建模功能強(qiáng)大且各具特色,但是難以回避模型導(dǎo)入帶來(lái)的格式問(wèn)題。(3)OpenGL,DirectX等底層圖形接口,具有開發(fā)復(fù)雜性大,周期性長(zhǎng)和維護(hù)困難的缺點(diǎn)[2]。
本文以ZPW-2000A軌道電路結(jié)構(gòu)圖為顯示對(duì)象進(jìn)行設(shè)計(jì),采用旋轉(zhuǎn)矩陣原理和作為圖形設(shè)備接口的GDI+技術(shù)實(shí)現(xiàn)三維顯示的效果。在一定程度上,降低了開發(fā)的難度并增強(qiáng)了設(shè)計(jì)的靈活性。
旋轉(zhuǎn)矩陣(Rotation Matrix)是指與一個(gè)向量相乘時(shí),能夠在改變向量方向的同時(shí)又不影響其大小效果的矩陣。旋轉(zhuǎn)矩陣是一個(gè)行列式為1的正交矩陣,它的每個(gè)列向量都是單位向量且相互正交。其可被用于三維模型設(shè)計(jì),運(yùn)動(dòng)學(xué)和離散數(shù)學(xué)的組合優(yōu)化問(wèn)題等領(lǐng)域中。
假設(shè)最開始空間的笛卡爾坐標(biāo)系為XA, YA, ZA, 如此可列出三維空間A的矩陣VA={XA, YA, ZA}T。通過(guò)坐標(biāo)軸的旋轉(zhuǎn),空間A坐標(biāo)系的3個(gè)坐標(biāo)軸變換到了圖1中紅色的3個(gè)坐標(biāo)軸XB, YB, ZB的位置, 得出空間B的矩陣VB={XB, YB, ZB}T。將兩個(gè)空間聯(lián)系起來(lái)可以推出VB=R×VA,這里,R即是旋轉(zhuǎn)矩陣[3]。
圖1 坐標(biāo)軸的旋轉(zhuǎn)變換
本文通過(guò)點(diǎn)的組合實(shí)現(xiàn)三維和二維圖形的顯示,利用組成圖形點(diǎn)陣的坐標(biāo)在坐標(biāo)軸的旋轉(zhuǎn)方式,生成旋轉(zhuǎn)矩陣并以此推導(dǎo)出旋轉(zhuǎn)后的相應(yīng)坐標(biāo),實(shí)現(xiàn)圖形隨鼠標(biāo)拖動(dòng)進(jìn)行相應(yīng)的旋轉(zhuǎn)。旋轉(zhuǎn)矩陣的推導(dǎo)方法如下。
將3個(gè)基本旋轉(zhuǎn)的序列復(fù)合是求解旋轉(zhuǎn)矩陣的方法之一。在右手笛卡爾坐標(biāo)系中,三維旋轉(zhuǎn)矩陣都可以用繞x軸順時(shí)針旋轉(zhuǎn)的角度θx,繞y軸順時(shí)針旋轉(zhuǎn)的角度θy和繞z軸順時(shí)針旋轉(zhuǎn)的角度θz來(lái)描述。因此,可以先分別單獨(dú)計(jì)算繞x軸,y軸和z軸三者之一進(jìn)行相應(yīng)角度旋轉(zhuǎn)的矩陣 Rx(θx), Ry(θy)和 Rz(θz)。而最終需要的旋轉(zhuǎn)矩陣剛好可以表示為Rx(θx), Ry(θy)和Rz(θz)3個(gè)矩陣的乘積。這種旋轉(zhuǎn)步驟的分解,致使這3個(gè)矩陣的生成元很容易理解,分別推導(dǎo)如下。
繞x軸旋轉(zhuǎn)矩陣的推導(dǎo):假設(shè)在一個(gè)三維場(chǎng)景中,點(diǎn) P(x, y, z)繞 x 軸順時(shí)針旋轉(zhuǎn) θx度得到點(diǎn) P′(x′,y′,z')。其可以被描述成x坐標(biāo)保持不變,在y軸和z軸組成的yoz(o為坐標(biāo)原點(diǎn))平面上進(jìn)行了一次旋轉(zhuǎn)角為θx的二維旋轉(zhuǎn),由此可得:x'=x, y′=ycosθxzsinθx,z'=ysinθx+zcosθx,用(3×3)矩陣表示如下 :
繞y 軸旋轉(zhuǎn)矩陣的推導(dǎo):其可以被描述為y 坐標(biāo)保持不變,在z 軸和x 軸組成的平面zox 上進(jìn)行了一次旋轉(zhuǎn)角為θy 的二維旋轉(zhuǎn),x'=zsinθy+xcosθy, y'=y,z'=zcosθy-xsinθy, 用(3×3)矩陣表示如下:
繞z 軸旋轉(zhuǎn)矩陣的推導(dǎo):其可以被描述為z 坐標(biāo)保持不變,在x 軸和y 軸組成的平面xoy 上進(jìn)行了一次旋轉(zhuǎn)角為θz 的二維旋轉(zhuǎn),x'=xcosθz-ysinθz,y′=xsinθz+ycosθz,z'=z,用(3×3)矩陣表示如下:
本文使用鼠標(biāo)水平與豎直拖動(dòng)窗體焦點(diǎn)的方式移動(dòng)圖紙視角,為方便設(shè)計(jì)只需要繞z軸和繞y軸順時(shí)針?lè)较蛐D(zhuǎn)的矩陣相乘得到旋轉(zhuǎn)矩陣,即R=Ry(θy)×Rz(θz)[4]。
采用旋轉(zhuǎn)矩陣的原理可以得到任意一點(diǎn)經(jīng)過(guò)坐標(biāo)軸旋轉(zhuǎn)后的坐標(biāo),進(jìn)而可以較為方便地使用二維的繪圖API繪制三維圖形的輪廓。但是從實(shí)際的效果上看,經(jīng)過(guò)GDI+繪制輸出在屏幕上的僅是能隨鼠標(biāo)拖動(dòng)而旋轉(zhuǎn)的框架圖,無(wú)法展現(xiàn)空間上的物體之間的遮擋關(guān)系,與實(shí)物相差較大且可能對(duì)用戶造成一定干擾,圖2和圖3為軟件設(shè)計(jì)過(guò)程中,對(duì)三維圖形遮擋關(guān)系的處理效果進(jìn)行試驗(yàn)的結(jié)果對(duì)比。
由此可知,需要進(jìn)行三維圖形遮擋關(guān)系的處理,方法是采用C#的fill函數(shù)對(duì)處于用戶視角中的幾何體表面的輪廓進(jìn)行填充。
圖2 未進(jìn)行遮擋處理的效果圖
圖3 經(jīng)過(guò)遮擋處理的效果圖
建立如圖4中所繪坐標(biāo)系,在設(shè)定用戶視線與屏幕垂直的基礎(chǔ)上,以迎著視線的方向作為y軸的初始方向,與地面垂直的方向?yàn)閦軸初始方向,并以此對(duì)幾何體的表面進(jìn)行編號(hào)。采用判斷語(yǔ)句對(duì)繞z軸逆時(shí)針旋轉(zhuǎn)角度β和繞y軸的逆時(shí)針旋轉(zhuǎn)角度α的多種組合進(jìn)行判斷,結(jié)合三維圖形確定當(dāng)下角度最多顯示的面(長(zhǎng)方體是3個(gè)面)并對(duì)其進(jìn)行填充,以實(shí)現(xiàn)空間遮擋效果,如圖5所示。
圖4 初始位置下的視圖顯示
圖5 經(jīng)過(guò)旋轉(zhuǎn)后的視圖顯示
以圖4中的長(zhǎng)方體為例,其初始位置為同一頂點(diǎn)的3條棱與初始坐標(biāo)系重合的情況,按照其分別繞著y軸和z軸的從0?到360?逐步旋轉(zhuǎn),其出現(xiàn)在用戶視角中的3個(gè)面的編號(hào)如表1所示,其中,當(dāng)α或β為90?的倍數(shù)時(shí),視角中只能看到長(zhǎng)方體的2個(gè)或1個(gè)面,可視表1中多列出的平面面積為0,并不影響顯示效果。
表1 旋轉(zhuǎn)角度與視圖中顯示的平面關(guān)系
采用面向?qū)ο蟮姆绞綄D紙中常用的圖形的點(diǎn),線,面,體的組合封裝成類。點(diǎn)和線,線和面,面和體的關(guān)系類均是前者組合成后者的關(guān)系。最后通過(guò)不同幾何體的組合形成列車和鋼軌的三維模型。
由于軟件采用圖形類之間的這種組合關(guān)系,只需要對(duì)處于頂層的圖形類的對(duì)象進(jìn)行初始化,即可生成組成該幾何體的各部分類的對(duì)象,如調(diào)用構(gòu)造函數(shù)初始化鋼軌的信息,則將依次生成構(gòu)成這段鋼軌的數(shù)條橫軌和兩條豎軌,以及每個(gè)長(zhǎng)方體對(duì)應(yīng)的6個(gè)面,12條棱,8個(gè)頂點(diǎn)。
對(duì)上述類的對(duì)象分別進(jìn)行存儲(chǔ)是由C#語(yǔ)言的List<T>類來(lái)完成的。List<T>類表示可通過(guò)索引訪問(wèn)的對(duì)象的強(qiáng)類型列表。其中,T為類型參數(shù),代表列表中元素的類型。List<T>類提供用于對(duì)列表進(jìn)行搜索、排序和操作的方法,其大小可按需動(dòng)態(tài)增加,為使用C#語(yǔ)言編寫面向?qū)ο蟪绦蛟黾恿藰O大的效力和靈活性[5]。
為了便于圖形的修改以及其它設(shè)備圖紙的繪制,采用Excel表格存儲(chǔ)圖形數(shù)據(jù)。采用C#窗體應(yīng)用設(shè)計(jì),通過(guò)其事件處理的機(jī)制,寫入瀏覽文件和表格操作的相關(guān)方法,實(shí)現(xiàn)在Windows窗體中點(diǎn)擊按鈕導(dǎo)入表格的功能。
選中表格文件后,程序?qū)⒆x取的表格中每一行的類型碼,以此確定需要初始化的類的對(duì)象,使用表格中相應(yīng)行的數(shù)據(jù)為其賦初值,并添加到相應(yīng)的List<T> 類列表中。
經(jīng)過(guò)讀取后的表格顯示如圖6所示,表格(除表頭外)的每一行都與電路圖中某一元素的信息一一對(duì)應(yīng);每行設(shè)置13列分別記錄此元素的不同屬性,包括了圖形設(shè)備的名稱,在圖紙中的三維坐標(biāo),圖形的長(zhǎng)寬高信息以及繪制導(dǎo)線用到的另一端點(diǎn)的三維坐標(biāo),圖形的狀態(tài)信息,還有用于程序進(jìn)行識(shí)別繪圖的類型碼信息。
圖6 導(dǎo)入表格后的界面顯示
當(dāng)數(shù)據(jù)從表格轉(zhuǎn)入程序內(nèi)存后,將利用程序中的相關(guān)函數(shù)調(diào)用點(diǎn)列表中的信息進(jìn)行坐標(biāo)變換的計(jì)算,得到新的點(diǎn)的坐標(biāo),經(jīng)過(guò)繪圖事件的觸發(fā)即可在屏幕中輸出相應(yīng)圖形。
本設(shè)計(jì)通過(guò)編寫程序來(lái)實(shí)現(xiàn)ZPW-2000A型軌道電路結(jié)構(gòu)圖的平面顯示,并可以操作列車和鋼軌的三維模型組成不同的列車運(yùn)行場(chǎng)景,對(duì)不同場(chǎng)景下軌道電路的動(dòng)作進(jìn)行顯示。
軟件中視角旋轉(zhuǎn)到俯視角度的ZPW-2000A型軌道電路結(jié)構(gòu)如圖7所示。ZPW-2000A型軌道電路由室內(nèi)與室外設(shè)施組成。其室內(nèi)部分包括站防雷及電纜模擬網(wǎng)絡(luò),衰耗器,發(fā)送器及接收器。電室外設(shè)施有匹配變壓器,補(bǔ)償電容,傳輸電纜與調(diào)諧區(qū)以及調(diào)諧區(qū)設(shè)備引接線[6]。
ZPW-2000A型軌道電路被分成主軌道電路與短小軌道電路。小軌道電路被看作列車行駛前方主軌道電路的延長(zhǎng)區(qū)段。小軌道的信號(hào)經(jīng)過(guò)行駛前方鄰近軌道電路接收器處理,再將處理后的信號(hào)變成小軌道電路軌道繼電器動(dòng)作條件送入本軌道電路接收器,成為軌道繼電器吸起的必要條件中的一部分[7]。在圖7中,發(fā)送器產(chǎn)生出高頻率信號(hào),其中的一些經(jīng)由主軌道返回該軌道接收端,而另外的一些通過(guò)小軌道電路到達(dá)相鄰軌道接收端,經(jīng)過(guò)相鄰軌道接收器處理變?yōu)閳?zhí)行命令送入主軌道接收器[8]。當(dāng)明確主軌道移頻信號(hào)與小軌道繼電器執(zhí)行條件正確的情況下,使得軌道繼電器(GJ)吸起。以此來(lái)判斷區(qū)段的空閑和占用情況。如此可完成軌道電路的全程斷軌檢測(cè)。
軟件具有電路結(jié)構(gòu)圖隨鼠標(biāo)拖動(dòng)進(jìn)行變換視圖的功能,實(shí)現(xiàn)步驟:(1)通過(guò)在C#窗體程序中設(shè)置一系列鼠標(biāo)操作事件,獲取開始點(diǎn)擊鼠標(biāo)與停止拖動(dòng)鼠標(biāo)時(shí)的橫縱坐標(biāo)。(2)將獲取到的鼠標(biāo)移動(dòng)數(shù)據(jù)進(jìn)行處理,轉(zhuǎn)換成將圖紙分別繞y軸與z軸旋轉(zhuǎn)的弧度值。(3)根據(jù)旋轉(zhuǎn)的弧度值生成旋轉(zhuǎn)矩陣,代入各圖形的點(diǎn)位信息解出變換后的坐標(biāo)值。(4)對(duì)得到的坐標(biāo)進(jìn)行平面覆蓋的相關(guān)處理,并通過(guò)Refresh()函數(shù)對(duì)窗體的圖像顯示控件PictureBox進(jìn)行刷新變換視圖。
軟件還具有模擬鋼軌的占用與出清狀態(tài)時(shí)電流回路的相應(yīng)變化,發(fā)送報(bào)警繼電器(FBJ)的吸起與落下的功能,實(shí)現(xiàn)步驟:(1)在Windows窗體中加入了ToolStrip控件建立下拉菜單。(2)將表格中的數(shù)據(jù)逐行添加到ToolStrip控件可供顯示的下拉文本項(xiàng)中,為用戶提供圖紙數(shù)據(jù)。(3)設(shè)置ToolStrip控件的索引改變事件,可通過(guò)選中某一行的信息更改相應(yīng)圖形的狀態(tài)值。(4)刷新PictureBox控件,顯示經(jīng)過(guò)狀態(tài)變換后的圖形。
圖7 空閑狀態(tài)的軌道電路結(jié)構(gòu)圖
為了便于顯示,在編制數(shù)據(jù)時(shí),將用于模擬列車和鋼軌的模型與表示軌道電路及其結(jié)構(gòu)框圖部分設(shè)置為不同的高度,使其分別處于上下兩個(gè)平行的平面中,這樣在將圖紙旋轉(zhuǎn)到圖示位置時(shí),可以清晰直觀地看到列車在鋼軌中占用位置的同時(shí),也可以了解到軌道電路信號(hào)的流向。如圖8所示在列車第一輪對(duì)壓入主軌道電路調(diào)諧區(qū)前方的位置,由發(fā)送器發(fā)出的信號(hào)讀取到電流信號(hào)一欄的狀態(tài)為1,顯示為紅色電流線,經(jīng)過(guò)發(fā)送器(主),站防雷及電纜模擬網(wǎng)絡(luò),在主軌道電路端經(jīng)過(guò)列車輪形成閉合回路。另一部分則流入調(diào)諧區(qū)小軌道以實(shí)現(xiàn)全程無(wú)斷軌檢查。
圖8 列車占用場(chǎng)景下軌道電路結(jié)構(gòu)圖
通過(guò)點(diǎn)擊選中下拉列表中發(fā)送器所在行,實(shí)現(xiàn)其狀態(tài)的改變,并刷新圖紙內(nèi)容,電路走向隨之發(fā)生相應(yīng)的變化,如圖9所示即為主發(fā)送器故障,通過(guò)衰耗器內(nèi)部的發(fā)送報(bào)警繼電器的狀態(tài)改變,斷開與主發(fā)送器的連接,接通備用的發(fā)送器,達(dá)到了故障導(dǎo)向安全的目的。
圖9 發(fā)送器主備系切換
在Window環(huán)境下,利用VS2012編程開發(fā)工具,根據(jù)圖紙內(nèi)容編制了存儲(chǔ)電路圖信息的表格,實(shí)現(xiàn)了結(jié)合三維場(chǎng)景下軌道電路結(jié)構(gòu)圖的顯示。軟件能夠顯示在軌道占用和出清狀態(tài)下電流的走向,易于使用者理解和學(xué)習(xí)。此外,以上建模過(guò)程可應(yīng)用于其它三維場(chǎng)景的設(shè)計(jì),并可通過(guò)修改表格繪制鐵路信號(hào)設(shè)備的其它圖紙,具有良好的實(shí)用性。