王嗣策
(西南交通大學 信息科學與技術學院, 成都 611756)
鐵路運營過程中,電路圖紙是管理和維護鐵路信號設備的重要依據。結合三維場景顯示的電路圖軟件能夠提供更多信息,直觀易懂,成為提高鐵路運輸效率和職工專業素質的有效工具。常用的圖形顯示及建模方法有:(1)AutoCAD[1],具備基本三維設計功能,并可以通過內嵌語言 Visual Lisp,VBA和ARX等進行二次開發,但是其開發主要目標是完成自動繪圖,難以實現如電路圖的功能仿真等需求[1]。(2)LightWave 3D, Unigraphics NX和CATIA等三維建模軟件,三維建模功能強大且各具特色,但是難以回避模型導入帶來的格式問題。(3)OpenGL,DirectX等底層圖形接口,具有開發復雜性大,周期性長和維護困難的缺點[2]。
本文以ZPW-2000A軌道電路結構圖為顯示對象進行設計,采用旋轉矩陣原理和作為圖形設備接口的GDI+技術實現三維顯示的效果。在一定程度上,降低了開發的難度并增強了設計的靈活性。
旋轉矩陣(Rotation Matrix)是指與一個向量相乘時,能夠在改變向量方向的同時又不影響其大小效果的矩陣。旋轉矩陣是一個行列式為1的正交矩陣,它的每個列向量都是單位向量且相互正交。其可被用于三維模型設計,運動學和離散數學的組合優化問題等領域中。
假設最開始空間的笛卡爾坐標系為XA, YA, ZA, 如此可列出三維空間A的矩陣VA={XA, YA, ZA}T。通過坐標軸的旋轉,空間A坐標系的3個坐標軸變換到了圖1中紅色的3個坐標軸XB, YB, ZB的位置, 得出空間B的矩陣VB={XB, YB, ZB}T。將兩個空間聯系起來可以推出VB=R×VA,這里,R即是旋轉矩陣[3]。

圖1 坐標軸的旋轉變換
本文通過點的組合實現三維和二維圖形的顯示,利用組成圖形點陣的坐標在坐標軸的旋轉方式,生成旋轉矩陣并以此推導出旋轉后的相應坐標,實現圖形隨鼠標拖動進行相應的旋轉。旋轉矩陣的推導方法如下。
將3個基本旋轉的序列復合是求解旋轉矩陣的方法之一。在右手笛卡爾坐標系中,三維旋轉矩陣都可以用繞x軸順時針旋轉的角度θx,繞y軸順時針旋轉的角度θy和繞z軸順時針旋轉的角度θz來描述。因此,可以先分別單獨計算繞x軸,y軸和z軸三者之一進行相應角度旋轉的矩陣 Rx(θx), Ry(θy)和 Rz(θz)。而最終需要的旋轉矩陣剛好可以表示為Rx(θx), Ry(θy)和Rz(θz)3個矩陣的乘積。這種旋轉步驟的分解,致使這3個矩陣的生成元很容易理解,分別推導如下。
繞x軸旋轉矩陣的推導:假設在一個三維場景中,點 P(x, y, z)繞 x 軸順時針旋轉 θx度得到點 P′(x′,y′,z')。其可以被描述成x坐標保持不變,在y軸和z軸組成的yoz(o為坐標原點)平面上進行了一次旋轉角為θx的二維旋轉,由此可得:x'=x, y′=ycosθxzsinθx,z'=ysinθx+zcosθx,用(3×3)矩陣表示如下 :

繞y 軸旋轉矩陣的推導:其可以被描述為y 坐標保持不變,在z 軸和x 軸組成的平面zox 上進行了一次旋轉角為θy 的二維旋轉,x'=zsinθy+xcosθy, y'=y,z'=zcosθy-xsinθy, 用(3×3)矩陣表示如下:

繞z 軸旋轉矩陣的推導:其可以被描述為z 坐標保持不變,在x 軸和y 軸組成的平面xoy 上進行了一次旋轉角為θz 的二維旋轉,x'=xcosθz-ysinθz,y′=xsinθz+ycosθz,z'=z,用(3×3)矩陣表示如下:

本文使用鼠標水平與豎直拖動窗體焦點的方式移動圖紙視角,為方便設計只需要繞z軸和繞y軸順時針方向旋轉的矩陣相乘得到旋轉矩陣,即R=Ry(θy)×Rz(θz)[4]。
采用旋轉矩陣的原理可以得到任意一點經過坐標軸旋轉后的坐標,進而可以較為方便地使用二維的繪圖API繪制三維圖形的輪廓。但是從實際的效果上看,經過GDI+繪制輸出在屏幕上的僅是能隨鼠標拖動而旋轉的框架圖,無法展現空間上的物體之間的遮擋關系,與實物相差較大且可能對用戶造成一定干擾,圖2和圖3為軟件設計過程中,對三維圖形遮擋關系的處理效果進行試驗的結果對比。
由此可知,需要進行三維圖形遮擋關系的處理,方法是采用C#的fill函數對處于用戶視角中的幾何體表面的輪廓進行填充。

圖2 未進行遮擋處理的效果圖

圖3 經過遮擋處理的效果圖
建立如圖4中所繪坐標系,在設定用戶視線與屏幕垂直的基礎上,以迎著視線的方向作為y軸的初始方向,與地面垂直的方向為z軸初始方向,并以此對幾何體的表面進行編號。采用判斷語句對繞z軸逆時針旋轉角度β和繞y軸的逆時針旋轉角度α的多種組合進行判斷,結合三維圖形確定當下角度最多顯示的面(長方體是3個面)并對其進行填充,以實現空間遮擋效果,如圖5所示。

圖4 初始位置下的視圖顯示

圖5 經過旋轉后的視圖顯示
以圖4中的長方體為例,其初始位置為同一頂點的3條棱與初始坐標系重合的情況,按照其分別繞著y軸和z軸的從0?到360?逐步旋轉,其出現在用戶視角中的3個面的編號如表1所示,其中,當α或β為90?的倍數時,視角中只能看到長方體的2個或1個面,可視表1中多列出的平面面積為0,并不影響顯示效果。

表1 旋轉角度與視圖中顯示的平面關系
采用面向對象的方式將圖紙中常用的圖形的點,線,面,體的組合封裝成類。點和線,線和面,面和體的關系類均是前者組合成后者的關系。最后通過不同幾何體的組合形成列車和鋼軌的三維模型。
由于軟件采用圖形類之間的這種組合關系,只需要對處于頂層的圖形類的對象進行初始化,即可生成組成該幾何體的各部分類的對象,如調用構造函數初始化鋼軌的信息,則將依次生成構成這段鋼軌的數條橫軌和兩條豎軌,以及每個長方體對應的6個面,12條棱,8個頂點。
對上述類的對象分別進行存儲是由C#語言的List<T>類來完成的。List<T>類表示可通過索引訪問的對象的強類型列表。其中,T為類型參數,代表列表中元素的類型。List<T>類提供用于對列表進行搜索、排序和操作的方法,其大小可按需動態增加,為使用C#語言編寫面向對象程序增加了極大的效力和靈活性[5]。
為了便于圖形的修改以及其它設備圖紙的繪制,采用Excel表格存儲圖形數據。采用C#窗體應用設計,通過其事件處理的機制,寫入瀏覽文件和表格操作的相關方法,實現在Windows窗體中點擊按鈕導入表格的功能。
選中表格文件后,程序將讀取的表格中每一行的類型碼,以此確定需要初始化的類的對象,使用表格中相應行的數據為其賦初值,并添加到相應的List<T> 類列表中。
經過讀取后的表格顯示如圖6所示,表格(除表頭外)的每一行都與電路圖中某一元素的信息一一對應;每行設置13列分別記錄此元素的不同屬性,包括了圖形設備的名稱,在圖紙中的三維坐標,圖形的長寬高信息以及繪制導線用到的另一端點的三維坐標,圖形的狀態信息,還有用于程序進行識別繪圖的類型碼信息。

圖6 導入表格后的界面顯示
當數據從表格轉入程序內存后,將利用程序中的相關函數調用點列表中的信息進行坐標變換的計算,得到新的點的坐標,經過繪圖事件的觸發即可在屏幕中輸出相應圖形。
本設計通過編寫程序來實現ZPW-2000A型軌道電路結構圖的平面顯示,并可以操作列車和鋼軌的三維模型組成不同的列車運行場景,對不同場景下軌道電路的動作進行顯示。
軟件中視角旋轉到俯視角度的ZPW-2000A型軌道電路結構如圖7所示。ZPW-2000A型軌道電路由室內與室外設施組成。其室內部分包括站防雷及電纜模擬網絡,衰耗器,發送器及接收器。電室外設施有匹配變壓器,補償電容,傳輸電纜與調諧區以及調諧區設備引接線[6]。
ZPW-2000A型軌道電路被分成主軌道電路與短小軌道電路。小軌道電路被看作列車行駛前方主軌道電路的延長區段。小軌道的信號經過行駛前方鄰近軌道電路接收器處理,再將處理后的信號變成小軌道電路軌道繼電器動作條件送入本軌道電路接收器,成為軌道繼電器吸起的必要條件中的一部分[7]。在圖7中,發送器產生出高頻率信號,其中的一些經由主軌道返回該軌道接收端,而另外的一些通過小軌道電路到達相鄰軌道接收端,經過相鄰軌道接收器處理變為執行命令送入主軌道接收器[8]。當明確主軌道移頻信號與小軌道繼電器執行條件正確的情況下,使得軌道繼電器(GJ)吸起。以此來判斷區段的空閑和占用情況。如此可完成軌道電路的全程斷軌檢測。
軟件具有電路結構圖隨鼠標拖動進行變換視圖的功能,實現步驟:(1)通過在C#窗體程序中設置一系列鼠標操作事件,獲取開始點擊鼠標與停止拖動鼠標時的橫縱坐標。(2)將獲取到的鼠標移動數據進行處理,轉換成將圖紙分別繞y軸與z軸旋轉的弧度值。(3)根據旋轉的弧度值生成旋轉矩陣,代入各圖形的點位信息解出變換后的坐標值。(4)對得到的坐標進行平面覆蓋的相關處理,并通過Refresh()函數對窗體的圖像顯示控件PictureBox進行刷新變換視圖。
軟件還具有模擬鋼軌的占用與出清狀態時電流回路的相應變化,發送報警繼電器(FBJ)的吸起與落下的功能,實現步驟:(1)在Windows窗體中加入了ToolStrip控件建立下拉菜單。(2)將表格中的數據逐行添加到ToolStrip控件可供顯示的下拉文本項中,為用戶提供圖紙數據。(3)設置ToolStrip控件的索引改變事件,可通過選中某一行的信息更改相應圖形的狀態值。(4)刷新PictureBox控件,顯示經過狀態變換后的圖形。

圖7 空閑狀態的軌道電路結構圖
為了便于顯示,在編制數據時,將用于模擬列車和鋼軌的模型與表示軌道電路及其結構框圖部分設置為不同的高度,使其分別處于上下兩個平行的平面中,這樣在將圖紙旋轉到圖示位置時,可以清晰直觀地看到列車在鋼軌中占用位置的同時,也可以了解到軌道電路信號的流向。如圖8所示在列車第一輪對壓入主軌道電路調諧區前方的位置,由發送器發出的信號讀取到電流信號一欄的狀態為1,顯示為紅色電流線,經過發送器(主),站防雷及電纜模擬網絡,在主軌道電路端經過列車輪形成閉合回路。另一部分則流入調諧區小軌道以實現全程無斷軌檢查。

圖8 列車占用場景下軌道電路結構圖
通過點擊選中下拉列表中發送器所在行,實現其狀態的改變,并刷新圖紙內容,電路走向隨之發生相應的變化,如圖9所示即為主發送器故障,通過衰耗器內部的發送報警繼電器的狀態改變,斷開與主發送器的連接,接通備用的發送器,達到了故障導向安全的目的。

圖9 發送器主備系切換
在Window環境下,利用VS2012編程開發工具,根據圖紙內容編制了存儲電路圖信息的表格,實現了結合三維場景下軌道電路結構圖的顯示。軟件能夠顯示在軌道占用和出清狀態下電流的走向,易于使用者理解和學習。此外,以上建模過程可應用于其它三維場景的設計,并可通過修改表格繪制鐵路信號設備的其它圖紙,具有良好的實用性。