鄭國(guó)勛,張 華,張曉賢,趙 亮,王若金
(1.長(zhǎng)春工程學(xué)院計(jì)算機(jī)技術(shù)與工程學(xué)院;2.吉林省招生委員會(huì)辦公室;3.吉林省交通職業(yè)技術(shù)學(xué)院,長(zhǎng)春130012)
實(shí)時(shí)動(dòng)態(tài)數(shù)據(jù)曲線的繪制與顯示,是各種測(cè)控系統(tǒng)的重要功能。實(shí)時(shí)動(dòng)態(tài)數(shù)據(jù)曲線能夠?qū)崟r(shí)、直觀地反應(yīng)數(shù)據(jù)的變化趨勢(shì)。但是,很多開發(fā)語言都沒有提供數(shù)據(jù)曲線工具,而提供數(shù)據(jù)曲線繪制功能的軟件(如:Matlab)又難于實(shí)現(xiàn)軟件集成化。因此,開發(fā)具有實(shí)時(shí)動(dòng)態(tài)曲線功能的軟件,通常會(huì)使用第三方控件。在第三方繪制曲線控件中比較常用的是微軟的Graph OLE組件,它的功能完善,易于操作使用,但使用它需要付費(fèi)購買Microsoft Office辦公軟件,且在處理大數(shù)據(jù)時(shí)性能不佳。相關(guān)實(shí)驗(yàn)表明,當(dāng)數(shù)據(jù)量達(dá)到50 000條時(shí),Graph OLE組件加載、刷新一次曲線大約需要1min,這樣的刷新速率對(duì)實(shí)時(shí)性要求較高的測(cè)控軟件是不適用的。
本文在Microsoft Visual Studio平臺(tái)上,使用VB.NET語言,采用面向?qū)ο蠓椒ㄔO(shè)計(jì)一個(gè)動(dòng)態(tài)曲線控件,把動(dòng)態(tài)曲線的繪制封裝在一個(gè)用戶自定義控件類中,通過可視化界面配置相關(guān)屬性,簡(jiǎn)化了圖形坐標(biāo)系統(tǒng)的繪制和標(biāo)識(shí),同時(shí)提高了代碼的可重用性,便于在各種系統(tǒng)中使用。
實(shí)時(shí)動(dòng)態(tài)曲線繪制與靜態(tài)圖形繪制不同點(diǎn)主要在于繪制動(dòng)態(tài)曲線的數(shù)據(jù)是逐步得到的,在繪制過程中必須保證實(shí)時(shí)性,即獲取數(shù)據(jù)與繪制曲線必須是同步的。因此,在軟件的設(shè)計(jì)過程中,必須注意繪制圖形的效率,滿足實(shí)時(shí)監(jiān)測(cè)的需要。
實(shí)時(shí)動(dòng)態(tài)曲線的繪制一般要考慮到實(shí)時(shí)數(shù)據(jù)值的范圍和數(shù)據(jù)的采樣頻率。實(shí)時(shí)動(dòng)態(tài)曲線一般的形式是Y方向軸表示監(jiān)測(cè)數(shù)據(jù)的大小,X方向軸表示時(shí)間。隨著時(shí)間的變化,動(dòng)態(tài)曲線不斷更新變化。常用的實(shí)現(xiàn)曲線顯示方法有2種:一種是把已繪制的圖形擦除,重新從左向右繪制;另一種方式稱為平推式,把已有圖形向左方或右方平移。在平推式中,最需要解決的問題是圖形刷新的問題,以免在采樣頻率較高的情況下圖形閃爍嚴(yán)重。
本文采用的方法是:利用VB.NET的Bitmap對(duì)象在內(nèi)存中進(jìn)行坐標(biāo)軸及曲線的繪制,Picture-Box控件作為曲線的顯示載體,將Bitmap對(duì)象賦值給PictureBox控件。通過這種方法,可以避免曲線直接繪制在PictureBox控件上而將產(chǎn)生的閃爍問題以及窗體被置于下層時(shí)曲線被擦除的問題。
Microsoft Visual Studio平臺(tái)中默認(rèn)坐標(biāo)系統(tǒng)是容器的左上角坐標(biāo)為(0,0),Y 方向軸向右,X方向軸向下,容器右下角坐標(biāo)為(Width,Height)(注:Width為容器寬度,Height為容器高度)。因此,在繪制曲線前必須自定義絕對(duì)坐標(biāo)系,自定義絕對(duì)坐標(biāo)系規(guī)則如下:
1)Y方向軸的最大值和最小值由曲線數(shù)據(jù)確定,分別記作u、l;
2)Y方向軸刻度由曲線數(shù)據(jù)的最大值、最小值及它們之間的差值確定,分別記作Dmax、Dmin、t=Dmax-Dmin。當(dāng)t=0時(shí)曲線是一條平行于X方向軸的線段;
3)Y方向軸單位長(zhǎng)度記作s,刻度數(shù)記作m;
4)定義函數(shù)f(x)為小于x的最大整數(shù),c(x)為大于x的最小整數(shù)。
通過計(jì)算可以得到:
為了提高復(fù)用性,文中把實(shí)動(dòng)態(tài)時(shí)曲線的繪制封裝成一個(gè)自定義控件類,用類的方法分別實(shí)現(xiàn)坐標(biāo)繪制、動(dòng)態(tài)曲線繪制等操作。自定義控件類的屬性見表1。
表1 自定義控件類的屬性
按上述規(guī)則建立了自定義坐標(biāo)系后,就可以進(jìn)行數(shù)據(jù)曲線的繪制了。坐標(biāo)系是否顯示右側(cè)Y軸由控件的EnableRightYAxis屬性決定。多條數(shù)據(jù)曲線由傳入數(shù)據(jù)的二維數(shù)據(jù)決定。曲線控件繪制曲線的具體步驟如下:
1)通過LastLeftDataArray屬性獲取曲線數(shù)據(jù);
2)利用傳入的數(shù)據(jù)和公式(1)~(3)計(jì)算求得坐標(biāo)軸刻度的單位長(zhǎng)度、最小刻度值、最大刻度值及刻度數(shù);
3)繪制坐標(biāo)軸、刻度線、更新坐標(biāo)系文本;
4)利用坐標(biāo)軸相關(guān)參數(shù)將曲線數(shù)據(jù)真實(shí)值換算為Microsoft Visual Studio平臺(tái)中默認(rèn)坐標(biāo)系統(tǒng)的坐標(biāo)值;
5)在Bitmap對(duì)象中繪制曲線,并將Bitmap對(duì)象賦值給PictureBox控件。
該自定義曲線控件通常要與開發(fā)工具的時(shí)間控件配合使用,以實(shí)現(xiàn)實(shí)時(shí)曲線功能。在Microsoft Visual Studio平臺(tái)上可以通過使用BeginInvoke方法實(shí)現(xiàn)多線程對(duì)曲線控件的調(diào)用。使用多線程技術(shù)調(diào)用曲線控件,可以有效地避免程序在運(yùn)行過程中窗體出現(xiàn)假死情況,程序運(yùn)行后如圖1所示。
圖1 曲線控件運(yùn)行后畫面
本文介紹了確定坐標(biāo)系、坐標(biāo)軸刻度和繪制平面曲線的方法,使用VB.NET語言編寫了平面雙縱軸曲線控件。該控件計(jì)算坐標(biāo)軸刻度的方法計(jì)算效率高,繪制的刻度線、刻度分布更為合理。實(shí)現(xiàn)了雙縱軸顯示曲線,并且可以顯示不同顏色的多條數(shù)據(jù)曲線,具有很好的通用性。
[1]許強(qiáng).工業(yè)實(shí)時(shí)曲線實(shí)現(xiàn)的方法及其比較[J].中國(guó)科技信息,2010(17):103-104.
[2]王林,劉子英,蔣仕林.基于Ajax技術(shù)的遠(yuǎn)動(dòng)系統(tǒng)實(shí)時(shí)曲線研究[J].華東交通大學(xué)學(xué)報(bào),2008(1):77-79.
[3]翟世磊,李明波,李福,等.實(shí)時(shí)曲線的繪制方法探索[J].科技信息,2009(36):521-522.