APP下载

基于VC++的风玫瑰图绘制程序设计与实现

2015-01-28况源周小明梁富强

电子设计工程 2015年17期
关键词:数组风向方位

况源,周小明,梁富强

(四川省宜宾市气象局 四川 宜宾 644000)

风玫瑰图能够直观地反应某一地区风的状况,故被广泛地应用到城市规划、环境评价、风能资源评估等工作中[1-3]。风玫瑰图的绘制工作通常要先对基础风向、风速数据进行统计,计算出16个方位的风频、平均风速,再借助CAD、Matlab等软件绘图,过程工作量大,耗时较长,难度高,出错率高。所以,编写一款风玫瑰图绘制程序,具有工程实际意义。

1 风玫瑰图

风玫瑰图是指在极坐标底图上点绘出的某一地区在某一时段内各风向出现的频率或各风向的平均风速的统计图。前者为“风向玫瑰图”,后者为“风速玫瑰图”。因图形似玫瑰花朵故名[4]。风向是风吹来的方向,风向一共分为16个方位,以北在起点,每隔22.5°确定一个方向,分别为北(N)、东北偏北 (NNE)、 东 北 (NE)、 东 北 偏 东 (ENE)、 东 (E)、 东 南 偏 东(ESE)、东南(SE)、东南偏南(SSE)、南(S)、西南偏南(SSW)、西南(SW)、西南偏西(WSW)、西(W)、西北偏西(WNW)、西北(NW)、西北偏北(NNW)。风速是指空气在单位时间内的流过的距离,单位一般为m/s[5]。

2 总体设计

程序主要功能有:实现对基础数据的excel方式导入,对基础数据自动统计,风玫瑰图绘制,曲线调整,自定义颜色填充和风玫瑰图导出等功能。程序功能设计图如图1所示。

图1 程序功能设计图Fig.1 Program function design

3 程序主要功能的实现

3.1 基础数据导入与处理

程序通过导入excel表格的方式加载基础数据,程序在加载数据时,从约定的有效数据起始位置(3行2列)开始遍历数据表,将表中风向、对应风速分别保存到数组pfdata、pvdata中,且风向风速的对应关系要保持不变。主要代码如下[6]

void CMainFrame::InitExcel(){

/*此处略去Excel服务器和获取数据Worksheet页(wht)代码*/

/*加载数据*/

Range range, usedRange;

usedRange.AttachDispatch(wht.GetUsedRange());

range.AttachDispatch(usedRange.GetRows());

long iRowNum=range.GetCount(); //获 取 已 经 使 用的行数

range.AttachDispatch(usedRange.GetColumns());long iColNum=range.GetCount();//获取已经使用的列数CString*pfdata=new CString[(iRowNum-2)*(iColNum-1)/2]; //用于加载风向数据

float*pvdata=new float[(iRowNum-2)*(iColNum-1)/2];//用于加载风速数据

for(intm=3; m<=iRowNum; m++){

for (intn=2; n<=iColNum; n++){//遍历表中风向、风速数据

range.AttachDispatch(wht.GetCells());

range.AttachDispatch (range.GetItem (COleVariant((long)m),COleVariant((long)n)).pdispVal);

COleVariant vResult=range.GetValue2();

if(vResult.vt==VT_BSTR) {//字 符 串 则 为风向pfdata [((m-3)* (iColNum-1) +n-2)/2]=vResult.bstrVal;}

if(vResult.vt==VT_R8) {//数字则为风速

pvdata[((m-3)*(iColNum-1)+n-3)/2]= (float)vResult.dblVal;}}

}

/*此处略去退出Excel服务器代码*/

}

数据加载完后,遍历数组pfdata数组统计出风向再各方位出现的次数,保存在fnum数组中;同时将各方位对应的风速累加到vnum数组中,主要代码如下。

/*fnum为存放风向在各方位出现的次数的数组,vnum为存放对应风速的累计值的数组,数组元素对应各个方位,依 次 为 N,NNE,NE,ENE,E,ESE,SE,SSE,S,SSW,SW,WSW,W,WNW,NW,NNW,C*/

int fnum[17]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0};

float vnum[17]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0};

for(int i=0; i<(iRowNum-2)*(iColNum-1)/2; i++){

if(pfdata[i]=="N") {

fnum[0]++;

vnum[0]+=pvdata[i];}

/*此处略去处理其他方位的代码*/

}

最后用各方位出现次数除以总次数得到该方位的风频(以百分率表示),用各方位风速值之和除以该方位出现次数得到平均风速。

3.2 绘制风玫瑰图

风玫瑰图分为风向玫瑰图和风速玫瑰图,绘制风玫瑰图可以分别绘制在两张玫瑰图中,亦可以叠加在同一张风玫瑰图里面。下面以绘制风向玫瑰图实现过程为例。风向玫瑰图的绘制过程,首先要将风按16个方位进行统计,计算出各方位的风向频率,其计算公式为:gn式中:gn为 n方位的风向频率,fn为所取资料年代内风在n方位出现的次数,n表示方位,共16个方位。c为所取资料年代内静风的次数[2]。然后计算为坐标点,连接所有点后,即为基本的风向玫瑰图。

3.2.1 计算各方位风频的坐标

风频在极坐标系上的坐标计算方法如图2所示,若点A为NE方位在极坐标上的描点,OA长度为风向在NE方位的风频,角α值如表1所示[8](在 VC++中使用弧度作计算),这样就能够算出点 A的坐标(OA×cosα,OA×sinα)。

图2 风频在极坐标系上的坐标计算方法Fig.2 Coordinates calculationmethods ofwind frequency on the polar coordinates

此时得到的极坐标还不能直接用于绘图,因为在Windows应用程序中,绘图使用GDI坐标系统,在GDI坐标系统中原点(0,0)位于左上角,水平轴的正方形向右,垂直轴的正方向向下[7],所以还需要作处理。处理方法是根据绘图区域确定 O 点在 GDI坐标系统的坐标 O′(XO′,YO′)(可以取中心点坐标),与已计算出的A点在极坐标系上坐标A(XA,YA)作计算,得到A点在GDI坐标系统的新坐标A′,计算公式为:A′(XA′,YA′)=(XO′+XA,YO′-YA)。 另外,因风玫瑰图风格多样,有的将最里同心圆视为原点(0,0),此情况还需把坐标作进一步处理。同理,计算出其它方位点的坐标,保存至CPoint类型的数组fpt中。

表1 各方位在极坐标上的角度和弧度值Tab.1 The parties on the polar angle and radian value

3.2.2 绘制风向玫瑰图

计算出各方位风频坐标后,用直线连接16个坐标点后,但通常还需要绘制表示风频大小的同心圆[9],绘制表示各方位的放射直线,标注方位符号,在中心位置标注静风频率(如标注C=19.2,表示静风频率为19.2%),注明说明性文本,对曲线填充颜色等。重要代码如下[10]。

/*连接坐标点*/

CPen pen(PS_SOLID, 2, pMain->m_colorf);

dc.SelectObject(pen);

for(int j=0; j<16; j++){

dc.MoveTo(fpt[j%16]);

dc.LineTo(fpt[(j+1)%16]);}

/*填充曲线*/

CBrush brhf(pMain->m_colorf);

dc.BeginPath();

dc.MoveTo(fpt[0]);

for(int i=0; i<16; i++){

dc.LineTo(fpt[(i+1)%16]);}

dc.EndPath();

rgnf.CreateFromPath(&dc);

dc.FillRgn(&rgnf, &brhf);

4 程序验证

4.1 准备基础数据

基础数据的excel数据表可支持一种或多种格式,本程序支持的其中一种比较典型的格式如表2所示,验证所用数据为XX县2010年1月逐日定时风向风速数据。

表2 原始数据格式Tab.2 The form at of the original data

4.2 程序绘制结果

将基本数据导入成功后,自动在程序界面左边显示计算出的各方位风频和平均风速的数值。点击绘图功能按钮可在程序主界面绘制出风玫瑰图。如图3所示。

图3 绘制结果Fig.3 The results of the draw

5 结 论

程序基于VC++实现了对风要素基础数据的导入、自动统计和绘制风玫瑰图。运用到实际工作中,有效地提高了工作效率;同时共享到网络,受到使用者一致好评。但程序也存在一些不足,如数据导入方式和风玫瑰图风格均较单一,需在今后作改进。

[1]邢婷,郑有飞,朱勇,等.云南风能资源及其开发利用研究进展[J].气象与环境科学,2013,36(4):55-61.XING Ting,ZHENG You-fei,ZHU Yong,et al.Wind energy resources and its exploitation and utilization of research progress in yunnan[J].Meteorology and Environmental Science,2013,36(4):55-61.

[2]王新生.浅谈风玫瑰图在城市规划中的应用[J].武测科技,1994(3):35-38.WANG Xin-sheng.Introduction to the wind rose in the application of the urban planning[J].Wuhan Measurement Technology,1994(3):35-38.

[3]霍焕.风玫瑰图在大气污染评价中的应用[J].环境保护,1983(5):17-19.HUO Huan.The wind rose in the application of atmospheric pollution evaluation[J].Environmental Protection,1983(5) :17-19.

[4]佚名.风玫瑰图[J].吉林交通科技,1995(3):51-52.Anonymous.Thewind rose[J].Jilin Traffic Science and Technology,1995(3):51-52.

[5]曹丽娟,周玲,陈艳丽,等.风玫瑰图的研究与程序自动成图设计[J].计算机与现代化,2013(2):134-137,146.CAO Li-juan,ZHOU Ling,CHEN Yan-li,et al.The wind rose the research and application of automatic mapping design[J].Computer&Modern,2013(2):134-137,146.

[6]郝建,张红瑞,吕延岗.VC++和Excel对象接口的研究与应用[J].石家庄铁道学院学报:自然科学版,2009,22(4):75-78,81.HAO Jian,ZHANG Hong-rui,LV Yan-gang.Vc++and the research and application of Excel object interface[J].Shijiazhuang Railway Institute:Natural Science Edition,2009,22(4):75-78,81.

[7]陈夕松,邵祥兵.基于Windows GDI的图形编程[J].微计算机信息,1998(5):50-52.CHEN Xi-song,SHAO Xiang-bing.Based on the Windows GDI graphics programming[J].Microcomputer Information,1998(5):50-52.

[8]李忠.为什么要使用弧度制[J].数学通报,2009,48(11):1-3,7.LIZhong.Why use radian system[J].Mathematics Bulletin,2009,48(11):1-3,7.

[9]王建庄,余秀娟,谭光洪,等.风向玫瑰图的精确绘制[J].广东气象,2010,32(5):48-49.WANG Jian-zhuang,YU Xiu-juan,TAN Guang-hong,et al.The wind rose diagram drawn exactly [J].Guangdong Meteorological,2010,32(5):48-49.

[10]刘锐宁,梁水,李伟明.Visual C++开发实战1200例[M].北京:清华大学出版社,2013.

猜你喜欢

数组风向方位
JAVA稀疏矩阵算法
认方位
JAVA玩转数学之二维数组排序
逆风歌
CeMAT Asia 2017:聚焦“智慧物流”引领行业风向
Excel数组公式在林业多条件求和中的应用
借助方位法的拆字
基于TMS320C6678的SAR方位向预滤波器的并行实现
Word Fun
确定风向