




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IDL对象图形法应用于科学数据可视化董彦卿交互式数据处理开发语言IDL一直是应用程序开发和科学家进行可视化与分析的首选语言,因为它功能强大、简单易学,很少的几行代码就能实现其他语言很难实现的功能。IDL拥有的对象图形法能灵活、方便地构建图形图像,本文以气象数据为例,介绍利用对象图形法快速实现气象数据可视化,一起领略IDL应用于科学数据可视化的魅力。1. IDL的优势与其他常规语言相比较,IDL语言的优势主要体现在以下几个方面: 语法简单、功能强大IDL是第四代面向对象的语言,语法简单,功能强大,并内建大量数学、统计、图像处理和信号分析工具包。图1 IDL函数 快速构建应用程序原型IDL是一种解释性语言,在一些问题上有着立竿见影的结果,同时IDL降低了设计、编译、测试的周期。IDL内置了大量成熟算法和应用模型,而且大部分的工具都提供源程序,可供用户参考。可以很方便的参考这些代码。 快速可视化IDL下有智能可视化(iTools Visualizations)、直接图形法(Direct Graphics)和对象图形法(Object Graphics)三种可视化模式。三种模式各有其优点:智能可视化方便、快捷,包含了一系列的预置处理和分析功能,它是基于对象图形法的一个系统集成应用;直接图形法的绘图质量高、速度快;对象图形法灵活、可操控性好。在实际的应用中,可根据需求选择相应的可视化模式。 一次编写跨平台运行IDL语言不依赖于操作系统平台,代码可以一次编写,多处运行,保护了用户的投资。IDL支持Windows、UNIX、Macintosh、Linux等多种操作平台,基本上消除了对操作系统的依赖性,实现跨平台的代码共享。 灵活的外部语言接口IDL既是ActiveX/COM控件,又是ActiveX/COM容器。利用ActiveX技术,您可以将IDL的图形功能嵌入到VB,VC+等编写的Windows程序中。同样,在Windows系统中用户也可以在IDL中使用ActiveX控件来扩展IDL程序的功能。同时IDL也提供了IDL-Java/COM Bridge可以在IDL代码中使用JAVA对象。通过IDL-Java/COM Bridge, IDL应用软件可以有效地利用Java的I/O技术、网络技术和其它的一些功能。图2 灵活的外部语言接口 有效的数据管理手段IDL DataMiner是一个开放数据库连接( ODBC )接口,借助它IDL用户可快速访问、查询并管理ODBC兼容数据库,支持Oracle、Informix、Sybase、MS SQL Server等大型商用数据库。 灵活多样的程序发布部署方式IDL的程序可以通过两种方式发布:IDL虚拟机(Virtual Machine)和IDLRuntime。IDL虚拟机为IDL用户和软件开发人员提供了IDL应用程序发布的便捷工具,因虚拟机是一个免费的程序发布工具且适用于所有IDL支持的平台。针对大型的商业应用程序,IDL Runtime是一种高性价比的IDL软件发布方法,它不仅可以发布IDL程序,而且可以发布其他语言与IDL混编的软件。图3 IDL的Virtual Machine2. 气象数据可视化2.1. 气象数据特点气象数据复杂多样,包括风场、大气温度、云等各种要素数据,数据格式多样。IDL支持文本、二进制、图像数据(BMP、JPEG、Motion JPEG2000、GIF、PNG、TIFF/GeoTIFF等)科学数据格式(HDF、HDF5、CDF、HDF-EOS、NCDF或grib1)。对各种尚未直接支持格式的数据,根据数据格式说明可以轻松编写数据解析的功能模块。2.2. 实例编写这里以实现图4为例,按照数据读取、可视化及分发部署的基本步骤来说明如何编写实现类似的可视化Demo。图4 大气层层面模拟对图4进行分析,基本技术路线为:先读取数据再进行显示。而显示除了显示控制界面(GUI)之外,还需要实现下面几个实体的显示:1) 蓝色的地球及矢量叠加;2) 外框下半部分绿色包围线;3) 上半部分绿色包围线及红色切面(未闭合);4) 两个扇形部分外包围线及红色切面;基于上述几点分析,主显示框架可以调用xobjview,xobjview是IDL提供的一个对象查看、操控的一个通用框架,可以快速显示任何一个图形图像类对象。其余显示实体可以用球体对象类、矢量类和编写扇形类三个类来创建实现。2.3. 数据读取数据读取是基础,只有成功读取数据才能保证正确的显示。Demo中需要读取的是全球大陆边界矢量,矢量的读取可以利用IDL自带的IDLffShape类,使用这个类可以轻松解析shape文件格式。针对上面的要求,要实现矢量叠加显示在蓝色地球上,需要先创建球体,再解析显示shape。下面为创建地球和解析shape及显示的源码,功能介绍可参考”;”后面的注释。;创建空的model为IDL对象显示的体系基础。 oModel = OBJ_NEW(IDLgrModel);直径为1的地球 MESH_OBJ, 4, vertices, polygons, REPLICATE(1, 72, 72), $ /CLOSED ;绘制地球出来 oOrb = OBJ_NEW(IDLgrPolygon, vertices,polygons = polygons,$ color = 0,0,128, style =1,TEXTURE_MAP=oImage) ;添加地球对象到model中 oModel-Add,oOrb;创建矢量对象,解析矢量文件并创建多边形对象 shapeFile = OBJ_NEW(IDLffShape, FILE_DIRNAME(ROUTINE_FILEPATH(CreateGraphics)+shapefilecontinents.shp);shapefilechina.shp); shapeFile-Getproperty, N_Entities = nEntities ;设置颜色 color = 255,255,0 ;读取矢量 FOR i=0, nEntities-1 DO BEGIN entitie = shapeFile-Getentity(i) IF PTR_VALID(entitie.parts) NE 0 THEN BEGIN cuts = *entitie.parts, entitie.n_vertices FOR j=0, entitie.n_parts-1 DO BEGIN tempLon = (*entitie.vertices)0,cutsj:cutsj+1 - 1*!dtor tempLat = (*entitie.vertices)1,cutsj:cutsj+1 - 1*!dtor IF N_ELEMENTS(tempLat) GT 1 THEN BEGIN verts = FLTARR(3,N_ELEMENTS(templat) verts0,* = COS(tempLat)*COS(templon) verts1,* = COS(tempLat)*SIN(templon) verts2,* = SIN(templat) polyLines = LINDGEN(N_ELEMENTS(templat)+1)-1 polylines0 = N_ELEMENTS(templat) tempPlot = OBJ_NEW(IDLgrPolyline, $ verts, $ Polylines = polyLines , $ color = color) oModel-Add,tempPlot ENDIF ENDFOR ENDIF shapeFile-Destroyentity, entitie ENDFOR ;销毁矢量对象 OBJ_DESTROY, shapeFile实现的效果如图5所示: 图5 地球与矢量线叠加2.4. 可视化对地球外围的对象来说,下半球是一个完整的半球,上半球中的图形拆开后都有一个类似的特点:可以利用一个圆弧绕中心一直径旋转再加红色剖面得到,故先实现根据输入参数创建曲面多边形的函数createCureveSurface,输入不同的参数该函数可以返回对应的扇形对象。;函数功能:创建扇形条多边形;density: 每一度网格个数;maxR:大半径;minR:小半径;startLon,endLon 起点终点经度;startLat,endLat 起点终点纬度;sliderNums :线条数,疏密程度;outSideColor:外边颜色;inSideColor:内边颜色FUNCTION createCureveSurface,density, $ maxR = maxR, $ minR = minR, $ startLon = sTartLon, $ endLon = endLon, $ startLat = sTartLat, $ endLat = endLat, $ sliderNums = sliderNums, $ outSideColor = outSideColor, $ inSideColor = inSideColor ;创建model oModel = OBJ_NEW(IDLgrModel) ;球面方向多边形 nums = (endLat-startLat)/density angle = startLat*!Dtor+FINDGEN(nums+1)*(endLat - startLat)/nums*!Dtor inArr = MAKE_ARRAY(3,nums+1,/float) inArr0,* = maxR*COS(angle) inArr2,* = maxR*SIN(angle) ;生成点集和链接关系 Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =(endLon - startLon)/density , P2=0,0,0, $ P3 = 0,0,1, $ P4 =startLon*!Dtor, P5 = endLon*!Dtor ;创建对象 oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = outSideColor,style =1) ;添加对象关系 oModel-Add,oPoly ;球面切方向多边形 nums = (endLon - startLon)/density inArr = MAKE_ARRAY(3,sliderNums+1,/float) inArr2,* = minR +(maxR-minR)*FINDGEN(sliderNums+1)/sliderNums ; Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =(endLat-startLat)/density , P2=0,0,0, $ P3 = COS(startLon*!dtor+!pi/2),SIN(startLon*!dtor+!pi/2),0, $ P4 =startLat*!Dtor, P5 = endLat*!Dtor oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = inSideColor,style =1) oModel-Add,oPoly RETURN,oModelEND基于该函数,则系统可以一次进行外围对象实体的创建,即依次创建外围下半球、上半球的三个扇形及剖面线。代码及注释如下:;创建下面的半球参数 angle = 0-FINDGEN(37)*90/36*!Dtor inArr = MAKE_ARRAY(3,37,/float) inArr0,* = 1.3*COS(angle) inArr2,* = 1.3*SIN(angle) ;生成点集和链接关系 Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =36 , P2=0,0,0, $ P3 = 0,0,1, $ P4 =0, P5 = 360*!Dtor ;创建对象 oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = 96,196,0,style =1) ;添加对象到model中 oModel-Add,oPoly ;创建上面的半球 angle =0-angle inArr0,* = 1.3*COS(angle) inArr2,* = 1.3*SIN(angle) ;生成点集和链接关系 Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =27 , P2=0,0,0, $ P3 = 0,0,1, $ P4 =0*!Dtor, P5 = 270*!Dtor ;创建对象 oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = 96,196,0,style =1) ;添加对象到model中 oModel-Add,oPoly ; ;左侧红色斜面 inArr = MAKE_ARRAY(3,11,/float) inArr2,*=1+0.3*FINDGEN(11)/10 ;生成点集和链接关系 Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =18 , P2=0,0,0, $ P3 = 1,0,0, $ P4 =0*!Dtor, P5 = 90*!Dtor ;创建对象 oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = 196,0,0,style =1) ;添加对象到model中 ;oModel-Add,oPoly ;红色底面 inArr = MAKE_ARRAY(3,11,/float) inArr0,*=1+0.3*FINDGEN(11)/10 ;生成点集和链接关系 Mesh_Obj, 6, Vertex_List, Polygon_List , $ inArr, P1 =18 , P2=0,0,0, $ P3 = 0,0,1, $ P4 =270*!Dtor, P5 = 360*!Dtor ;创建对象 oPoly = OBJ_NEW(IDLgrPolygon, vertex_list, $ Polygons = polygon_list, $ color = 196,0,0,style =1) ;添加对象到model中 ;oModel-Add,oPoly ;右侧小侧面 oModel-Add, createCureveSurface(3, $ maxR = 1.3, $ minR = 1.2, $ startLon = 350, $ endLon = 360, $ startLat = 0, $ endLat = 90, $ sliderNums = 10, $ outSideColor = 96,196,0, $ inSideColor =196,0,0 ) ; oModel-Add, createCureveSurface(3, $ maxR = 1.2, $ minR = 1.1, $ startLon = 340, $ endLon = 350, $ startLat = 0, $ endLat = 90, $ sliderNums = 10, $ outSideColor = 96,196,0, $ inSideColor =196,0,0 ) ; oModel-Add, createCureveSurface(3, $ maxR = 1.1, $ minR = 1.0, $ startLon = 330, $ endLon = 340, $ startLat = 0, $ endLat = 90, $ sliderNums = 10, $ outSideColor = 96,196,0, $ inSideColor =196,0,0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国液压缩头机市场调查研究报告
- 2025年中国标牌扎带市场调查研究报告
- 2025年中国合成塔成套高压容器市场调查研究报告
- 2025年葡萄原酒项目可行性研究报告
- 2025年药用软膏铝管项目可行性研究报告
- 2025-2030自动洗碟机行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030脂肪是羊毛行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030联合用药诊断行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030缩水甘油市场发展分析及行业投资战略研究报告
- 2025年花蜜荔枝香精项目可行性研究报告
- 空气轴承技术培训教程
- 20xx老旧楼加装电梯方案计划(含详细预算清单)
- 北京中小学生天文知识竞赛复习题库
- 偏航闸及闸片更换作业指导书
- 新标日初级上考试试卷试题(1-7-10课)
- 乡村旅游经营管理的八种模式知识讲解
- 施工现场日周月安全检查记录表
- 板材生产线的张力控制和负荷平衡控制
- G101-2现浇混凝土板式楼梯
- 招标代理企业内部管理规章制度
- 公安民警职业能力心理检验测试
评论
0/150
提交评论