999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于GDI+與雙緩沖的飛機(jī)姿態(tài)指示儀(ADI)仿真實(shí)現(xiàn)

2014-08-20 18:00:43周濤
現(xiàn)代電子技術(shù) 2014年16期

周濤

摘要:為了實(shí)現(xiàn)了飛機(jī)姿態(tài)指引儀(ADI)的仿真,在Visual C++開發(fā)環(huán)境下采用GDI+以及雙緩沖技術(shù),利用GDI+中的繪圖坐標(biāo)面變換和區(qū)域裁剪特性,實(shí)現(xiàn)了ADI的俯仰刻度帶和橫滾刻度帶的動(dòng)態(tài)仿真。其中通過DGI+的API實(shí)現(xiàn)了圖形和文本的反走樣,使顯示效果更加逼真。同時(shí)利用雙緩沖技術(shù),解決了Win32 環(huán)境下圖形頻繁重繪時(shí)出現(xiàn)的閃爍現(xiàn)象。提出了一種不同于虛擬儀表開發(fā)工具的仿真實(shí)現(xiàn)方法,實(shí)踐證明此種方法具有低成本高效率的優(yōu)勢,為電子飛行儀表的仿真提供了可以借鑒的思路和方法。

關(guān)鍵詞:姿態(tài)指引儀; GDI+; 雙緩沖; 坐標(biāo)面變換

中圖分類號: TN911?34 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2014)16?0071?03

Simulation of airplane attitude direction indicator based on GDI+ and double buffer

ZHOU Tao

(AVIC Xian Aircraft Industry (Group) Company Ltd., Xian 710089, China)

Abstract:In order to implement the simulation of the airplane attitude direction indicator (ADI), the dynamic simulation of the pitch scale and roll scale was achieved by utilizing the GDI+ and the double buffer technique in the Visual C++ development environment, as well as the drawing coordinate plane transformation and region clip property of GDI+, in which the graph and text anti?aliasing was implemented by API in GDI+, so that make the display more realistic. The flicker phenomenon appearing when the graphs were redrawn frequently in the Win32 platform was eliminated by means of the double buffer technology. A simulation method unlike the virtual instrument development tool is proposed in this paper. The practical application has proved that this method has the advantages of low cost and high efficiency. It provided an idea and method for simulation of the electronic flight instruments.

Keywords: attitude direction indicator; GDI+; double buffer; coordinate plane transformation

姿態(tài)指引儀(Attitude Direction Indicator?ADI)是電子飛行儀表系統(tǒng)(EFIS)的重要組成部分,為飛行員提供飛機(jī)的俯仰、滾轉(zhuǎn)、側(cè)滑等飛行參數(shù)。對電子飛行儀表仿真通常采用VAPS或GL Studio等虛擬儀表工具,此種方法的優(yōu)點(diǎn)是開發(fā)效率高,有封裝好的儀表模塊可以直接復(fù)用,但其也存在采購和培訓(xùn)成本過高,靈活性較差等缺點(diǎn),本文提出在Visual C++ 環(huán)境下,采用基于DGI+與雙緩沖技術(shù)實(shí)現(xiàn)姿態(tài)指引儀的仿真,為電子飛行儀表的仿真提供了一種新思路。

1 GDI+與雙緩沖

GDI+是Windows XP中的一個(gè)子系統(tǒng),是一組通過C++類實(shí)現(xiàn)的應(yīng)用程序編程接口,對以前Windows版本中的GDI進(jìn)行了優(yōu)化,并添加了許多新的功能。利用GDI+函數(shù),不必使用句柄或者設(shè)備描述表,只需簡單地創(chuàng)建一個(gè)圖形對象(Graphics),以熟悉的面向?qū)ο蟮木幊谭绞秸{(diào)用它的方法即可。Graphics對象是GDI+的核心,正如設(shè)備描述表是GDI的核心一樣,但是兩者也存在著本質(zhì)的不同。前者使用基于句柄的編程方法而后者使用面向?qū)ο蟮木幊谭椒?。在GDI中,所有與繪圖有關(guān)的繪圖對象必須選入指定設(shè)備描述表中(使用SelectObject函數(shù)),才能被指定的設(shè)備描述表所使用。而在GDI+中,只需把這些繪圖對象作為一個(gè)參數(shù)傳遞給圖形對象Graphics方法調(diào)用即可,它可以通過參數(shù)使用多種Pen和Brush繪圖,而不是與特定的筆和畫刷聯(lián)系在一起,極大地提高了繪圖效率。

雙緩沖是圖形圖像處理編程過程中的一種基本技術(shù),即在內(nèi)存中創(chuàng)建一個(gè)與屏幕繪圖區(qū)域一致的對象,先將圖形繪制到內(nèi)存中的這個(gè)對象上,再一次性將這個(gè)對象上的圖形拷貝到屏幕上,所以不會(huì)占用顯示系統(tǒng)的開銷,大大加快繪圖的速度,可以避免窗體頻繁重繪時(shí)出現(xiàn)閃爍現(xiàn)象。

2 ADI組成

ADI主要由滾轉(zhuǎn)刻度帶、俯仰刻度帶、滾轉(zhuǎn)游標(biāo)、側(cè)滑指示符以及飛機(jī)符號等組成,具體定義如下:

橫滾刻度帶:位置固定不動(dòng),指示飛機(jī)的橫滾角度。

橫滾指針:在橫滾刻度帶上滑行,指示當(dāng)前橫滾角。

側(cè)滑指示符:位于橫滾指針下方,相對其做橫向移動(dòng),移動(dòng)幅度正比于橫向加速度。

俯仰刻度帶:在指定可見范圍內(nèi)上下滾動(dòng)顯示,指示當(dāng)前俯仰角。

飛機(jī)符號:位置固定不動(dòng),指示飛機(jī)相對于地平線的姿態(tài)。

ADI示意圖如圖1所示。

圖1 ADI示意圖

3 GDI+中雙緩沖的實(shí)現(xiàn)

雙緩沖實(shí)現(xiàn)過程如下:

(1) 建立內(nèi)存畫布;

(2) 在內(nèi)存中創(chuàng)建與畫布一致的緩沖區(qū);

(3) 在緩沖區(qū)繪圖;

(4) 將緩沖區(qū)位圖拷貝到前臺。

以下給出在Visual C++環(huán)境中的實(shí)現(xiàn)代碼:

void CADISimDlg::OnPaint()

{

Graphics graphics(m_hWnd); //聲明GDI+繪圖對象

CRect rect;

GetClientRect(&rect); //獲取窗口客戶區(qū)大小

Point center(rect.CenterPoint().x, rect.CenterPoint().y);

//窗口客戶區(qū)中心坐標(biāo)

Bitmap CatchImage(rect.Width(), rect.Height());

//聲明內(nèi)存畫布

Graphics buffer(&CatchImage);

//聲明與內(nèi)存畫布一致的緩沖區(qū)

OnDrawADI(center.X, center.Y , buffer);

//調(diào)用ADI繪制函數(shù),并將客戶區(qū)中心坐標(biāo)和圖形對象作為參數(shù)

buffer.SetSmoothingMode(SmoothingModeAntiAlias);

//設(shè)置圖形和文本反走樣模式

buffer.SetTextRenderingHint(TextRenderingHintAntiAlias);

graphics.DrawImage(&CatchImage, 0, 0);

//將緩沖區(qū)位圖拷貝到前臺

}

4 ADI仿真中應(yīng)用的GDI+關(guān)鍵技術(shù)

4.1 平移變換與旋轉(zhuǎn)變換

平移變換將圖形繪制所在的坐標(biāo)面平移一個(gè)增量(dx,dy):

Status TranslateTransform (REAL dx, REAL dy, MatrixOrder order = MatrixOrderPrepend);即:[x′=x+d,y′=y+d];相當(dāng)于進(jìn)行如下矩陣變換:

[x′y′=xydxdy]

旋轉(zhuǎn)變換將圖形繪制所在的坐標(biāo)面旋轉(zhuǎn)一個(gè)角度α,單位為度,有:

Status RotateTransform ( REAL angle, MatrixOrder order = MatrixOrderPrepend);

即:[x′=xcosα-ysinα,y′=xsinα+ycosα]相當(dāng)于進(jìn)行如下矩陣變換:

[x′y′=cosα-sinαsinαcosαxy]

圖形的旋轉(zhuǎn)以坐標(biāo)面原點(diǎn)為中心,所以需將坐標(biāo)面原點(diǎn)平移到圖形的中心。在ADI仿真中可以通過平移變換將窗口坐標(biāo)原點(diǎn)從左上角移至中心,作為俯仰刻度帶以及滾轉(zhuǎn)游標(biāo)的旋轉(zhuǎn)中心,通過旋轉(zhuǎn)變換不必進(jìn)行三角函數(shù)運(yùn)算就可實(shí)現(xiàn)圖形的旋轉(zhuǎn)。

4.2 區(qū)域裁剪

Status SetClip(const Region* region, CombineMode combineMode = CombineModeReplace);

GDI+區(qū)域裁剪可實(shí)現(xiàn)特定局部重繪,在提高繪圖效率的同時(shí)可將區(qū)域之外的圖形進(jìn)行裁剪,在ADI仿真中,可利用這一特性實(shí)現(xiàn)俯仰刻度帶在限制區(qū)域內(nèi)的滾動(dòng)顯示效果。

5 ADI的仿真實(shí)現(xiàn)

以下以俯仰刻度帶和橫滾刻度為例來說明,GDI+在ADI仿真中的應(yīng)用。

5.1 俯仰刻度帶

利用GDI+的區(qū)域裁剪特性,將俯仰刻度帶的更新區(qū)域限制在±20的刻度范圍內(nèi),同時(shí)利用坐標(biāo)面的旋轉(zhuǎn)變換實(shí)現(xiàn)俯仰刻度帶的與橫滾游標(biāo)的同步旋轉(zhuǎn),主要實(shí)現(xiàn)算法及代碼如下:

void CADISimDlg:: OnDrawADI(int x, int y, Graphics& buffer)

{……

buffer.ResetTransform(); //重置坐標(biāo)面

buffer.TranslateTransform(x, y);

//平移變換,將坐標(biāo)原點(diǎn)平移至客戶區(qū)中心

buffer.RotateTransform(RollAngle); //旋轉(zhuǎn)變換,將橫滾角

作為參數(shù),實(shí)現(xiàn)俯仰刻度帶和橫滾游標(biāo)繞坐標(biāo)原點(diǎn)旋轉(zhuǎn)

Rect rect(?Wm, ?Hm, PitchScaleWidth, PitchScaleHeight);

Region rgn(rect);

buffer.ResetClip(); //重置裁剪區(qū)

buffer.SetClip(&rgn, CombineModeReplace); //設(shè)置裁剪區(qū)

//以下為計(jì)算俯仰刻度帶第一個(gè)刻度線位置和刻度值的算法

double TicksDistance = PitchRange/PitchTicksCount;

float TickPixels = float((PitchScaleHeight/PitchRange)

* TicksDistance);

double tickValue = floor((pitchAngle ? PitchRange/2)/TicksDistance)*TicksDistance ;

float tickPosition = (float)floor(Hm + PitchScaleHeight/PitchRange*(pitchAngle ? tickValue))

//建立繪圖對象并設(shè)置其屬性

Pen pen(Color::WhiteSmoke, 2);

SolidBrush brush(Color::WhiteSmoke);

FontFamily fontFamily(L" futura medium ");

Font font(&fontFamily, 19, FontStyleBold, UnitPixel);

//根據(jù)計(jì)算的第一個(gè)刻度線位置和刻度值,在循環(huán)中從下至上完成刻度帶的繪制

for (int L = 0; L <= PitchTicksCount + 1; L++) //

{ ……

//此處根據(jù)顯示要求繪制刻度線和刻度值,代碼從略

tickValue += TicksDistance; //更新刻度值

tickPosition ?= TickPixels; //更新刻度顯示位置

} }

5.2 橫滾刻度帶

橫滾刻度帶的繪制主要利用GDI+的坐標(biāo)系旋轉(zhuǎn),選定起始點(diǎn),然后在循環(huán)中完成繪制,

這樣可以避免在傳統(tǒng)GDI作圖中的角度計(jì)算,繪制效率更高。主要實(shí)現(xiàn)代碼如下:

void CADISimDlg:: OnDrawADI(int x, int y, Graphics& buffer)

{……

//因?yàn)闄M滾刻度帶固定不動(dòng),所以需重置裁剪區(qū)和坐標(biāo)面

buffer.ResetClip();

buffer.ResetTransform();

buffer.TranslateTransform(x, y);

buffer.RotateTransform(340);

//以短刻度線為例,在循環(huán)中完成刻度帶的繪制

for (int r = 0; r < 4 ; r++)

{

buffer.FillRectangle(&SolidBrush(Color::White), Rect(0, ?RollArcRadius ? RollShortTickLengh, 2, RollShortTickLengh));

if (r == 1)

{ buffer.RotateTransform(10);

} buffer.RotateTransform(10);

} }

圖2和圖3為程序運(yùn)行后的效果。

圖2 ADI初始畫面

圖3 俯仰角和滾轉(zhuǎn)角輸入后的ADI畫面

6 結(jié) 語

本文在Visual C++開發(fā)環(huán)境下,利用GDI+以及雙緩沖技術(shù),實(shí)現(xiàn)了電子飛行儀表中姿態(tài)指示儀的仿真,GDI+中的新特性極大地提高了繪圖效率和顯示效果,為電子飛行儀表系統(tǒng)仿真提供了可借鑒的思路和方法。

參考文獻(xiàn)

[1] 馬銀才,張興媛.航空機(jī)載電子設(shè)備[M].北京:清華大學(xué)出版社,2007.

[2] 周鳴揚(yáng),趙景亮.精通GDI+編程[M].北京:清華大學(xué)出版社,2003.

[3] [美]李普曼,[美]拉茹瓦,[美]穆.C++ Primer中文版[M].李師賢,譯.4版.北京:人民郵電出版社,2006.

[4] [美]PROSISE Jeff. MFC Windows程序設(shè)計(jì)[M].北京博彥科技發(fā)展有限公司,譯.2版.北京:清華大學(xué)出版社,2007.

[5] 車森,劉海硯,劉輝,等.GDI+在電子地圖可視化中的應(yīng)用[J].測繪科學(xué),2008(1):226?227.

[6] 張仁忠,常明志,許德新.利用MFC實(shí)現(xiàn)雙緩存機(jī)制改善圖形的顯示效果[J].應(yīng)用科技,2005(1):47?48.

* TicksDistance);

double tickValue = floor((pitchAngle ? PitchRange/2)/TicksDistance)*TicksDistance ;

float tickPosition = (float)floor(Hm + PitchScaleHeight/PitchRange*(pitchAngle ? tickValue))

//建立繪圖對象并設(shè)置其屬性

Pen pen(Color::WhiteSmoke, 2);

SolidBrush brush(Color::WhiteSmoke);

FontFamily fontFamily(L" futura medium ");

Font font(&fontFamily, 19, FontStyleBold, UnitPixel);

//根據(jù)計(jì)算的第一個(gè)刻度線位置和刻度值,在循環(huán)中從下至上完成刻度帶的繪制

for (int L = 0; L <= PitchTicksCount + 1; L++) //

{ ……

//此處根據(jù)顯示要求繪制刻度線和刻度值,代碼從略

tickValue += TicksDistance; //更新刻度值

tickPosition ?= TickPixels; //更新刻度顯示位置

} }

5.2 橫滾刻度帶

橫滾刻度帶的繪制主要利用GDI+的坐標(biāo)系旋轉(zhuǎn),選定起始點(diǎn),然后在循環(huán)中完成繪制,

這樣可以避免在傳統(tǒng)GDI作圖中的角度計(jì)算,繪制效率更高。主要實(shí)現(xiàn)代碼如下:

void CADISimDlg:: OnDrawADI(int x, int y, Graphics& buffer)

{……

//因?yàn)闄M滾刻度帶固定不動(dòng),所以需重置裁剪區(qū)和坐標(biāo)面

buffer.ResetClip();

buffer.ResetTransform();

buffer.TranslateTransform(x, y);

buffer.RotateTransform(340);

//以短刻度線為例,在循環(huán)中完成刻度帶的繪制

for (int r = 0; r < 4 ; r++)

{

buffer.FillRectangle(&SolidBrush(Color::White), Rect(0, ?RollArcRadius ? RollShortTickLengh, 2, RollShortTickLengh));

if (r == 1)

{ buffer.RotateTransform(10);

} buffer.RotateTransform(10);

} }

圖2和圖3為程序運(yùn)行后的效果。

圖2 ADI初始畫面

圖3 俯仰角和滾轉(zhuǎn)角輸入后的ADI畫面

6 結(jié) 語

本文在Visual C++開發(fā)環(huán)境下,利用GDI+以及雙緩沖技術(shù),實(shí)現(xiàn)了電子飛行儀表中姿態(tài)指示儀的仿真,GDI+中的新特性極大地提高了繪圖效率和顯示效果,為電子飛行儀表系統(tǒng)仿真提供了可借鑒的思路和方法。

參考文獻(xiàn)

[1] 馬銀才,張興媛.航空機(jī)載電子設(shè)備[M].北京:清華大學(xué)出版社,2007.

[2] 周鳴揚(yáng),趙景亮.精通GDI+編程[M].北京:清華大學(xué)出版社,2003.

[3] [美]李普曼,[美]拉茹瓦,[美]穆.C++ Primer中文版[M].李師賢,譯.4版.北京:人民郵電出版社,2006.

[4] [美]PROSISE Jeff. MFC Windows程序設(shè)計(jì)[M].北京博彥科技發(fā)展有限公司,譯.2版.北京:清華大學(xué)出版社,2007.

[5] 車森,劉海硯,劉輝,等.GDI+在電子地圖可視化中的應(yīng)用[J].測繪科學(xué),2008(1):226?227.

[6] 張仁忠,常明志,許德新.利用MFC實(shí)現(xiàn)雙緩存機(jī)制改善圖形的顯示效果[J].應(yīng)用科技,2005(1):47?48.

* TicksDistance);

double tickValue = floor((pitchAngle ? PitchRange/2)/TicksDistance)*TicksDistance ;

float tickPosition = (float)floor(Hm + PitchScaleHeight/PitchRange*(pitchAngle ? tickValue))

//建立繪圖對象并設(shè)置其屬性

Pen pen(Color::WhiteSmoke, 2);

SolidBrush brush(Color::WhiteSmoke);

FontFamily fontFamily(L" futura medium ");

Font font(&fontFamily, 19, FontStyleBold, UnitPixel);

//根據(jù)計(jì)算的第一個(gè)刻度線位置和刻度值,在循環(huán)中從下至上完成刻度帶的繪制

for (int L = 0; L <= PitchTicksCount + 1; L++) //

{ ……

//此處根據(jù)顯示要求繪制刻度線和刻度值,代碼從略

tickValue += TicksDistance; //更新刻度值

tickPosition ?= TickPixels; //更新刻度顯示位置

} }

5.2 橫滾刻度帶

橫滾刻度帶的繪制主要利用GDI+的坐標(biāo)系旋轉(zhuǎn),選定起始點(diǎn),然后在循環(huán)中完成繪制,

這樣可以避免在傳統(tǒng)GDI作圖中的角度計(jì)算,繪制效率更高。主要實(shí)現(xiàn)代碼如下:

void CADISimDlg:: OnDrawADI(int x, int y, Graphics& buffer)

{……

//因?yàn)闄M滾刻度帶固定不動(dòng),所以需重置裁剪區(qū)和坐標(biāo)面

buffer.ResetClip();

buffer.ResetTransform();

buffer.TranslateTransform(x, y);

buffer.RotateTransform(340);

//以短刻度線為例,在循環(huán)中完成刻度帶的繪制

for (int r = 0; r < 4 ; r++)

{

buffer.FillRectangle(&SolidBrush(Color::White), Rect(0, ?RollArcRadius ? RollShortTickLengh, 2, RollShortTickLengh));

if (r == 1)

{ buffer.RotateTransform(10);

} buffer.RotateTransform(10);

} }

圖2和圖3為程序運(yùn)行后的效果。

圖2 ADI初始畫面

圖3 俯仰角和滾轉(zhuǎn)角輸入后的ADI畫面

6 結(jié) 語

本文在Visual C++開發(fā)環(huán)境下,利用GDI+以及雙緩沖技術(shù),實(shí)現(xiàn)了電子飛行儀表中姿態(tài)指示儀的仿真,GDI+中的新特性極大地提高了繪圖效率和顯示效果,為電子飛行儀表系統(tǒng)仿真提供了可借鑒的思路和方法。

參考文獻(xiàn)

[1] 馬銀才,張興媛.航空機(jī)載電子設(shè)備[M].北京:清華大學(xué)出版社,2007.

[2] 周鳴揚(yáng),趙景亮.精通GDI+編程[M].北京:清華大學(xué)出版社,2003.

[3] [美]李普曼,[美]拉茹瓦,[美]穆.C++ Primer中文版[M].李師賢,譯.4版.北京:人民郵電出版社,2006.

[4] [美]PROSISE Jeff. MFC Windows程序設(shè)計(jì)[M].北京博彥科技發(fā)展有限公司,譯.2版.北京:清華大學(xué)出版社,2007.

[5] 車森,劉海硯,劉輝,等.GDI+在電子地圖可視化中的應(yīng)用[J].測繪科學(xué),2008(1):226?227.

[6] 張仁忠,常明志,許德新.利用MFC實(shí)現(xiàn)雙緩存機(jī)制改善圖形的顯示效果[J].應(yīng)用科技,2005(1):47?48.

主站蜘蛛池模板: 成色7777精品在线| 97在线免费| 亚洲第一成人在线| 成AV人片一区二区三区久久| 97se亚洲综合| 成人免费黄色小视频| 国产白浆在线| 手机精品视频在线观看免费| 国产成人成人一区二区| 日韩精品一区二区三区中文无码| 国产精品妖精视频| 色婷婷在线播放| 美女免费黄网站| 99视频在线精品免费观看6| 亚洲精品麻豆| 国产玖玖视频| 欧美福利在线观看| 在线看片中文字幕| 免费啪啪网址| 久久99精品久久久久纯品| 国产一区二区福利| 99视频在线免费| 99视频有精品视频免费观看| 国产综合亚洲欧洲区精品无码| 国产成人乱码一区二区三区在线| 久久久久国色AV免费观看性色| 免费福利视频网站| 一级毛片高清| 2021国产v亚洲v天堂无码| 日本免费一区视频| 欧美国产日韩另类| 亚洲水蜜桃久久综合网站| 亚洲欧美另类视频| 亚洲综合欧美在线一区在线播放| jizz在线免费播放| 免费精品一区二区h| 伊人色天堂| 日韩欧美国产成人| 亚洲一级毛片免费看| 日韩在线欧美在线| 人人爽人人爽人人片| 日本免费a视频| 国产自在线拍| 国产综合精品一区二区| 波多野结衣AV无码久久一区| 亚洲一欧洲中文字幕在线| 内射人妻无套中出无码| 97视频精品全国在线观看| 日本伊人色综合网| 99视频精品全国免费品| 色婷婷综合激情视频免费看| 中文字幕日韩欧美| 国产91蝌蚪窝| 国产在线一二三区| 日韩一区精品视频一区二区| 毛片网站在线播放| 视频二区国产精品职场同事| 久久精品只有这里有| 欧美在线观看不卡| 欧美在线免费| 伊人久久大香线蕉综合影视| 强奷白丝美女在线观看| 久久永久免费人妻精品| 久久99蜜桃精品久久久久小说| 国产一在线| 国产精品自拍露脸视频| 日本成人福利视频| 国产女人在线视频| 日韩欧美中文在线| 在线看AV天堂| 日本欧美中文字幕精品亚洲| 伊人久久精品无码麻豆精品| 天天综合网在线| 免费看美女毛片| 中文字幕天无码久久精品视频免费| 中文字幕久久波多野结衣| 香蕉久久国产超碰青草| 伊在人亚洲香蕉精品播放| 一本一道波多野结衣一区二区| 国产精品女人呻吟在线观看| 成年女人18毛片毛片免费| 亚洲男人天堂2020|