張亞寧,劉春光,吳詩帆
基于VC++的二維繪圖程序設(shè)計(jì)
張亞寧,劉春光,吳詩帆
(91550部隊(duì),遼寧 大連 116023)
對(duì)工程數(shù)據(jù)進(jìn)行繪圖是數(shù)據(jù)分析中的一項(xiàng)重要內(nèi)容,基于VC++開發(fā)環(huán)境從數(shù)據(jù)讀取、選定坐標(biāo)范圍、繪制數(shù)據(jù)曲線等方面對(duì)二維數(shù)據(jù)繪圖程序設(shè)計(jì)流程進(jìn)行了詳細(xì)描述,通過繪圖實(shí)驗(yàn)驗(yàn)證了程序的正確性和科學(xué)性,具有一定的工程意義。
VC++;二維數(shù)據(jù);測量設(shè)備;繪圖軟件
在工程實(shí)踐中,對(duì)測量設(shè)備或傳感器采集的數(shù)據(jù)進(jìn)行實(shí)時(shí)顯示、事后分析等工作較為普遍[1]。通過計(jì)算機(jī)繪制出的數(shù)據(jù)曲線走勢對(duì)數(shù)據(jù)分析具有重要的意義。當(dāng)前使用較廣泛的繪圖軟件有AutoCAD、Solidworks、MATLAB、OriginPro等,經(jīng)過多年的發(fā)展,以上繪圖軟件的功能較完善。在實(shí)際工程中,有時(shí)需要對(duì)數(shù)據(jù)進(jìn)行較快速度的處理,或者需要與計(jì)算機(jī)硬件接口進(jìn)行信息互換,此時(shí),利用上述繪圖軟件處理不方便。Visual Studio C++是Microsoft公司推出的一款基于Windows平臺(tái)、可視化的集成開發(fā)環(huán)境,在其平臺(tái)下開發(fā)的程序具有效率高、占用內(nèi)存低、與硬件接口銜接方便等特點(diǎn)[2-4]?;诖?,本文利用VC++平臺(tái)開發(fā)了二維數(shù)據(jù)繪圖程序,并進(jìn)行了數(shù)據(jù)繪圖實(shí)驗(yàn),實(shí)驗(yàn)證明了程序的可行性和科學(xué)性,具有一定的工程意義。
程序設(shè)計(jì)主要分為4部分,分別是:①獲取數(shù)據(jù);②選定坐標(biāo)范圍;③繪制坐標(biāo)刻度及標(biāo)注;④繪制數(shù)據(jù)曲線。程序各模塊代碼的實(shí)現(xiàn)如下。
獲取數(shù)據(jù)是程序處理的源頭,在工程中數(shù)據(jù)獲取分為實(shí)時(shí)獲取和事后獲取。實(shí)時(shí)獲取主要從計(jì)算機(jī)硬件接口獲取,而事后獲取可以從文本、表格等文件中獲取。本文以從TXT文本文件獲取數(shù)據(jù)為例進(jìn)行程序設(shè)計(jì):
因不同文件數(shù)據(jù)的行數(shù)列數(shù)一般不同,所以在定義數(shù)據(jù)存儲(chǔ)數(shù)組前,需要先編寫程序獲取數(shù)據(jù)的行數(shù)和列數(shù)。同時(shí),因?yàn)閿?shù)組的維數(shù)一般用常量來定義,本程序選擇動(dòng)態(tài)分配空間的方式定義存儲(chǔ)數(shù)據(jù)數(shù)組[*]。數(shù)據(jù)獲取之后,通過循環(huán)語句按照行或列拆分?jǐn)?shù)組,具體如下:
科學(xué)、合理地選擇坐標(biāo)范圍具有重要的意義,數(shù)據(jù)范圍過大或過小都將導(dǎo)致看圖不便。本文根據(jù)數(shù)據(jù)(數(shù)據(jù)同理)的最大、最小值確定坐標(biāo)范圍,以數(shù)據(jù)為例程序處理如下:
x_max=max_double(x,N);//計(jì)算x的最大值x_max
x_min=min_double(x,N);//計(jì)算x的最小值x_min
x_abs_max=abs_max_double(x_max,x_min);//計(jì)算x絕對(duì)值的最大值
int x_power;//x_power為x的指數(shù),例如:10^2
int xd_start;// xd_start為x軸的左側(cè)
int xd_end;// xd_end為x軸的右側(cè)
x_power=e_pow_double(xx_abs_max);//計(jì)算數(shù)值的10的冪次
xd_start=xx_min/pow(10,xx_power)-1;//左側(cè)邊界減少1
xd_end =xx_max/pow(10,xx_power)+1;//右側(cè)邊界增加1
坐標(biāo)軸的范圍確定之后,需要確定坐標(biāo)軸在屏幕上的位置,即:
const int psc_left=400;//繪圖左側(cè)邊界
const int psc_right=1000; //繪圖右側(cè)邊界
const int psc_up=100; //繪圖上側(cè)邊界
const int psc_down=400; //繪圖下側(cè)邊界
確定完屏幕范圍后,需要計(jì)算坐標(biāo)范圍和屏幕范圍之間的變換系數(shù),即單位長度的數(shù)據(jù)在屏幕上的長度,計(jì)算公式為=(psc_right-psc_left)/(xd_end-xd_start)//變換系數(shù),=(psc_down-psc_up)/((-yd_start)-(-yd_end))//變換系數(shù)。
此處需要注意屏幕橫向是從左向右,縱向是從上向下,所以在計(jì)算和兩個(gè)變換系數(shù)時(shí)有所差異。
繪制坐標(biāo)軸首先需要計(jì)算出原點(diǎn)(0,0)在屏幕上的位置(0,0),根據(jù)比例關(guān)系得到的公式為:
定好原點(diǎn)(0,0)后,調(diào)用MFC中的類CPen,進(jìn)行畫圖,主要程序代碼如下:
CPen zpen,cpen; //坐標(biāo)軸zpen,坐標(biāo)刻度cpen
zpen.CreatePen(PS_SOLID,3,RGB(0,0,0));
cpen.CreatePen(PS_SOLID,2,RGB(0,0,0));
pDC->SetViewportOrg(x0,y0);// 確定原點(diǎn)
pDC->SelectObject(&zpen);//pDC指向zpen,開始畫坐標(biāo)軸
pDC->MoveTo(xd_start*pow(10,x_power)*ex,0);
pDC->LineTo((xd_end)*pow(10,x_power)*ex,0);
pDC->MoveTo(0,-(yd_end)*pow(10,y_power)*ey);
pDC->LineTo(0,-yd_start*pow(10,y_power)*ey);
pDC->SelectObject(&cpen);//pDC指向cpen,開始畫坐標(biāo)刻度
CString sTemp;
for (i=xd_start;i<=xd_end;i++){//劃大刻度
pDC->MoveTo(int(i*pow(10,x_power)*ex),0);
pDC->LineTo(int(i*pow(10,x_power)*ex),-8);
for (int j=1;(j<=4)&&(i pDC->MoveTo(int((i+j*0.2)*pow(10,x_power)*ex),0); pDC->LineTo(int((i+j*0.2)*pow(10,x_power)*ex),-4);} sTemp.Format("%d",i);//將數(shù)字“i”轉(zhuǎn)換成字符“sTemp” pDC->TextOut(int(i*pow(10,xx_power)*ex-4),5,sTemp);} 軸刻度的畫法與軸相同,此處不再贅述。 坐標(biāo)軸和坐標(biāo)刻度繪制完畢之后,最后對(duì)數(shù)據(jù)進(jìn)行繪制,此處需要強(qiáng)調(diào)的是坐標(biāo)軸的變換系數(shù)和數(shù)據(jù)的變換系數(shù)必須一致,即數(shù)據(jù)的變換系數(shù)也是,。 主要程序代碼如下: CPen pen;定義數(shù)據(jù)曲線pen畫筆 pen.CreatePen(PS_SOLID,3,RGB(255,0,0));//數(shù)據(jù)曲線特征 pDC->SelectObject(&pen);//pDC指向pen,開始畫數(shù)據(jù)曲線 for( i=0;i<=N-1;i++){ pDC->MoveTo(int(x[i]*ex),int(-y[i]*ey)); pDC->LineTo(int(x[i]*ex),int(-y[i]*ey));} cpen.DeleteObject();//刪除刻度畫筆 zpen.DeleteObject(); //刪除坐標(biāo)畫筆 pen.DeleteObject(); //刪除數(shù)據(jù)畫筆 程序完成后,選取兩組工程數(shù)據(jù)依次在VC++和OriginPro環(huán)境下進(jìn)行繪圖實(shí)驗(yàn),結(jié)果如圖1和圖2所示。 圖1 數(shù)據(jù)曲線(VC++環(huán)境) 圖2 數(shù)據(jù)曲線(OriginPro環(huán)境) 通過對(duì)比可以發(fā)現(xiàn),本文設(shè)計(jì)的二維數(shù)據(jù)繪圖程序繪圖結(jié)果與OriginPro環(huán)境下的繪圖結(jié)果是一致的,證明了本文設(shè)計(jì)程序的正確性。 本文通過在VC++環(huán)境下設(shè)計(jì)繪圖程序,實(shí)現(xiàn)了高效、準(zhǔn)確地對(duì)事后數(shù)據(jù)進(jìn)行繪圖處理,下一步將針對(duì)網(wǎng)絡(luò)發(fā)送的實(shí)時(shí)數(shù)據(jù)進(jìn)行實(shí)時(shí)繪圖顯示。 [1] 李楊,徐潔,王春海,等.VC++高效無閃爍繪制大數(shù)據(jù)量圖形[J].電腦編程技巧與維護(hù),2014(2):19-26 . [2]賈振華.VC++程序設(shè)計(jì)項(xiàng)目實(shí)踐[M].北京:清華大學(xué)出版社,2010:36-128. [3]和清芳.計(jì)算機(jī)圖形學(xué)原理及算法教程(Visual C++版)[M].2版.北京:清華大學(xué)出版社,2010:39-58. [4]王振武.計(jì)算機(jī)圖形學(xué)基礎(chǔ)[M].北京:清華大學(xué)出版社,2011:31-77. TP311 A 10.15913/j.cnki.kjycx.2019.17.020 2095-6835(2019)17-0048-02 張亞寧(1988—),男,碩士研究生,助理工程師,研究方向?yàn)閿?shù)據(jù)融合及目標(biāo)安全控制。 〔編輯:張思楠〕2.4 繪制數(shù)據(jù)曲線
3 實(shí)驗(yàn)驗(yàn)證
4 小結(jié)及展望