IDL培训对象图形篇(PPT).ppt_第1页
IDL培训对象图形篇(PPT).ppt_第2页
IDL培训对象图形篇(PPT).ppt_第3页
IDL培训对象图形篇(PPT).ppt_第4页
IDL培训对象图形篇(PPT).ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IDL IDL 高级培训高级培训 对象图形篇对象图形篇 对象图形篇对象图形篇 概述概述 Basic 对象图形是IDL引入面向对象编程概念后出现的。 面向对象编程的基础是对象类的使用。对象类允许程序员将数据和方法封装成为 一个包,称之为对象。一个对象类可以反复使用而每次使用都封装不同的数据。 IDL里对象类的实现主要是用一组预建的对象类构成对象图形系统。对象图形系 统是一个IDL内建的对象类库,可用于创建场景。 对象类也可以用IDL编写以实现程序员自己的要求。程序员可以在IDL环境中用 传统的过程和函数的编写方法加上对象特性编写自己的对象模块。 对象图形篇对象图形篇 概述概述 Direct Graphics vs. Object Graphics Direct Graphics: 创建2D图形有优秀表现,如:X-Y plot ,contours ,mapping等 可以在命令行使用,简单、快速 图形创建命令通常连同坐标系一起创建 图形生成时,针对当前图形设备 图形生成并输出后,不可修改或再用。如果需要修改或向其他设备输出,必 须重新输出。 后输出的项目总在先输出的项目的“上面” Object Graphics: 硬件加速的3D场景显示,灵活,交互性强 对象图形系统主要以程序方式使用 图形对象是功能性封装的。即独立的对象包含自己的方法,操作自己的数据 图形输出没有当前设备的概念,图形对象为层次结构,并使用输出目标概念 图形创建后,数据及其属性驻留内存,便于修改,反复使用 对象图形驻留内存,因此在退出时要释放内存,避免内存泄漏 对象图形篇对象图形篇 内容内容 LIVE_TOOLS工具集 一组预建的IDL组件应用程序,使用IDL的对象图形系统,可以构造高质量的可交互的 场景 每一个LIVE工具既可以做为单独的应用程序使用,也可以做为组件用于编程 LIVE工具可以既可以使用鼠标操纵,也可以编程操纵 图形对象系统(IDLxxYyyy) 一组预建的对象类,可用于构造高质量的2D、3D场景 使用最新的图形硬件加速技术 采用灵活的结构,可以多场景输出 使用IDL的过程或函数构造图形对象的层次结构 图形创建后,场景可以很容易操纵、修改 创建自己的图形对象类 利用IDL的面向对象编程概念和方法,程序员可以创建自己的对象类 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS LIVE_TOOLS共有15个例程,包括创建图形、图形文件输出、打印输出、标注以及控制。 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS Stand-Alone LIVE Tools LIVE_PLOT ,LIVE_CONTOUR ,LIVE_SURFACE ,LIVE_IMAGE 完整的IDL组件例程,窗口调整、属性设置均可通过鼠标操纵。可以从命令行直接运行 。 sincurve=sin(findgen(360)*!dtor) live_plot ,sincurve 可以通过调用时设置关键字参数,调整交互界面 live_plot ,sincurve ,/no_toolbar ,/no_status LIVE_OPLOT 向已经创建的LIVE窗口中叠加,只有适合已有坐标系的数据才会加入 sincurve=sin(findgen(360)*!dtor) live_plot ,sincurve for i=0.9 ,0.1 ,-0.1 do live_oplot ,sincurve*I 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS Multiple LIVE Tools and LIVE_OPLOT 完当同时启动多个LIVE时,LIVE_OPLOT就不知道应该向哪一个窗口叠加。 REFERENCE_OUT=ref 返回窗口信息,结构数据。其中win字段即为窗口标识。 WINDOW_IN=ref.win 指定叠加的窗口 sincurve=sin(findgen(360)*!dtor) live_plot ,sincurve ,reference_out=ref for i=0.9 ,0.1 ,-0.1 do live_oplot ,sincurve*i ,window_in=ref.win x=1.2,2.0,7.7,4.5,23.4 y=3.0*x+2.0 new_x=3.9,6.9,12.0,15.6 new_y=interpol(x,y,new_x) pProps=color:Light Blue,linestyle:2,symbol_size:0.05,symbol_type:2 pStyle = live_style(plot, GRAPHIC_PROPERTIES = pProps) live_plot, y, INDEPENDENT = x, REFERENCE_OUT = refout2, STYLE = pStyle live_oplot, new_y, INDEPENDENT = new_x, WINDOW_IN = refout2.win 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS LIVE_STYLE(contour | image | plot | surface , ) 设置LIVE的窗口风格。可以创建一个包括所有输出窗口的图形属性的结构数据,然 后传给所有准备创建的LIVE。IDL的灵活的结构数据的特点使得每一个LIVE只保留与之 相关的字段值并修改之。 a = findgen(40) a = sin(a/5) / exp(a/50) wave = a # a gp = bottom:Blue, color:Brown, shading:1, style:2 surfstyle = live_style(surface, GRAPHIC_PROPERTIES = gp) live_surface, wave, STYLE = surfstyle 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS Multiple Plots in One Window 通过设置图形在窗口中的位置和大小,可以实现在一个窗口中同时显示多个图形。 LOCATION:图形在窗口中的位置,normal坐标 DIMENSION:图形显示的大小,normal坐标 a = findgen(40) a = sin(a/5) / exp(a/50) wave = a # a live_image, wave, REFERENCE_OUT = refout, $ LOCATION = 0.0,0.5, DIMENSIONS = 1.0, 0.5 live_contour, wave, WINDOW_IN = refout.win, $ LOCATION = 0.0,0.0, DIMENSIONS = 0.5,0.5 live_surface, wave, WINDOW_IN = refout.win, $ LOCATION = 0.5,0.0, DIMENSIONS = 0.5,0.5 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS LIVE Annotations LIVE_TEXT ,LIVE_RECT ,LIVE_LINE 这些工具可以为一个已创建的LIVE在窗口内的任意位置添加标注。并可以在添加以 后仍然可以通过鼠标操纵修改。normal坐标。 data = alog10(findgen(100)+1) live_plot, data, REFERENCE_OUT = refout live_text, 对数曲线, WINDOW_IN = refout.win, $ LOCATION = .5, .9, ALIGNMENT = 0.5, $ FONTNAME = 隶书, FONTSIZE = 18, COLOR = Blue live_rect, WINDOW_IN = refout.win, COLOR = Light Green, $ LOCATION = .2, .87, DIMENSION = .6, .1 live_line, WINDOW_IN = refout.win, $ LOCATION = .2,.05, DIMENSION = .6,0, $ /ARROW_START, /ARROW_END 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS LIVE_DESTROY ,/ENVIRONMENT 关闭所有LIVE,释放所有与之相关的内存。 LIVE_DESTROY ,WINDOW_IN=ref.win , 关闭ref.win指定的LIVE或其中的图形元素。灵活使用REFERENCE_OUT和 WINDOW_IN,就可以去掉窗口内的指定图形元素。 data = alog10(findgen(100)+1) live_plot, data, REFERENCE_OUT = refout live_text, 对数曲线, LOCATION = .5, .9, ALIGNMENT = 0.5, $ FONTNAME = 隶书, FONTSIZE = 18, COLOR = Blue, $ WINDOW_IN = refout.win live_rect, LOCATION = .2, .87, DIMENSION = .6, .1, $ COLOR = Light Green, WINDOW_IN = refout.win live_line, LOCATION = .2,.05, DIMENSION = .6,0, $ WINDOW_IN = refout.win, /ARROW_START, /ARROW_END ; add a line that will be destroyed live_line, LOCATION = .5,.5, DIMENSIONS = 0.0, .25, $ WINDOW_IN = refout.win, REFERENCE_OUT = linerefout wait, 3 live_destroy, linerefout.graphic, WINDOW_IN = refout.win wait, 3 live_destroy, refout.graphic wait, 3 live_destroy, WINDOW_IN = refout.win 对象图形篇对象图形篇 LIVE_TOOLSLIVE_TOOLS Embedded LIVE Tools 除可以做为独立的例程使用之外,LIVE工具可以嵌入到IDL组件程序中,不仅保持 原有的功能,还与IDL的其他组件共同使用, PARENT_BASE LIVE_TOOLS ,PARENT_BASE=base_id 在应用程序中使用LIVE,通常为LIVE创建一个BASE将其嵌入。 Event Handling 在widget的用户数据里,通常必须保存LIVE的ref,这样在整个程序运行期间就可以 根据事件的需求对LIVE进行控制。 LIVE_CONTROL 在事件处理程序中,所有需要对LIVE进行控制的请求都通过LIVE_CONTROL实现 。其功能类似widget_control。 特别注意:任何时刻需要更新LIVE的数据时,只能用一个与初始化该LIVE时的数 据变量同名的变量来传递数据。 LIVE_INFO 用于获取指定的LIVE的属性,返回一个结构数据。功能类似widget_info。 LIVE_DESTROY 当widget结束时,必须将LIVE释放。 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 概述 IDL的对象图形系统是一个内建的对象类库,通过选择适当的内建对象、构造层次结构来 创建图形场景。层次结构描述各种图形元素在3D中的层次以及各层之间的关系。 IDL的图形对象类命名方式为IDLgrYyyy,其中Yyyy标识类的名称。 IDL的图形对象类如下: Container Objects: IDLgrScene, IDLgrView, IDLgrModel IDLgrViewgroup ,IDL_Container Graphical Atom Objects: IDLgrPlot, IDLgrPolyline, IDLgrPloygon, IDLgrContour, IDLgrSurface, IDLgrVolume, IDLgrImage, IDLgrAxis ,IDLgrText ,IDLgrLight Destination Objects: IDLgrWindow, IDLgrPrinter, IDLgrBuffer, IDLgrClipboard, IDLgrVRML Attrigute:(outside the hierarchy, be used when rendering graphic objects) IDLgrFont, IDLgrPalette, IDLgrSymbol Helper: (outside the hierarchy, alter data in useful ways or provide other services) IDLgrTessalator,Trackball Composite Objects: IDLgrColor,IDLgrLegend 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) The Object Graphics Hierarchy,对象图形的层次结构 Scene View Model grAtomgrAtomgrAtom Use if multi view Can root hierarchy Contain Graphic Atoms Graphic Atom objects 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) Create Hierarchy 对象图形场景必须以层次结构创建。基本的层次结构创建如下: 1. Creation of an IDLgrView object 2. Creation of an IDLgrModel object 3. Creation of a Graphical Atom 4. Add the Model to the View 5. Add Graphical Atom(s) to the Model 6. Creating a Destination Object 7. Drawing the View to the Destination Object 最简单的对象图形例程: oView=obj_new(IDLgrView, VIEWPLANE_RECT=-10,-2,380,4) oModel=obj_new(IDLgrModel) oPlot=obj_new(IDLgrSurface,sin(findgen(360)*!DtoR),THICK=3) oView-Add, oModel oModel-Add, oPlot oWindow=obj_new(IDLgrWindow, TITLE=The Simplest OG Plot) oWindow-Draw, oView 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 将IDLgrView或IDLgrScenen嵌入IDL的Widget程序 在建立了对象图形层次结构之后,可以将它输出到一个合法的目标类对象,比如一 个Window。Widget_draw就可以成为一个这样的Window。 基本方法 tlb=widget_base() draw=widget_draw(tlb ,uname=draw ,GRAPHICS_LEVEL=2 $ ,xsize=512 ,ysize=512 ,retain=2) widget_control ,tlb ,/realize widget_control ,draw ,get_value=oWin oWin-draw ,oView 注意: GRAPHICS_LEVEL=2和retain=2 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形对象操作概述 对象创建:任何一个对象必须从一个对象类中创建 oOBJ=Obj_new(IDLgrYyyyy) 对象属性:每个对象都有唯一的一组属性描述对象的特点。可以在创建对象时指定, 也可以在创建后修改。 oOBJ=Obj_new(IDLgrYyyyy ,color=255,0,0 ) 对象方法:每个对象都有一组自己的内建方法,用于操纵数据和属性。 oObj-GetProperty 获取对象的属性 oObj-SetProperty 设置对象的属性 oObj-add oObj-remove 对象注销:对象是驻留内存的,因此当一个图形对象不再使用时,应该注销,从内存 中释放。在应用程序的开发中尤其重要。 obj_destroy ,oOBJ 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形坐标 对象图形系统中的图形坐标是通过设置IDLgrView的属性实现的。 obj=OBJ_NEW(IDLgrView ,UNITS=0|1|2|3 ,DIMENSIONS=width,height ,LOCATION=x, y ,VIEWPLANE_RECT=x,y,width,height ,ZCLIP=near,far ) UNITS:设置坐标系 0:device(default) ,1:inches ,2:centimeters ,3:normal VIEWPLANE_RECT和ZCLIP:设置坐标系范围 当使用normal坐标系时: 3个坐标轴的默认范围均为-11 应对该view下的grAtom(s)的数据进行坐标变换 DIMENSIONS和LOCATION:设置图形的大小和位置 x y z 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形变换 图形变换指对图形的旋转、平移和缩放。 对象图形系统中的图形变换是通过设置IDLgrModel的变换矩阵实现的。IDLgrModel一经创 建,便产生一个44的变换矩阵,图形的变换操作是通过重新设置这个矩阵的值实现的。 设置方法: 1. 通过IDLgrModel的rotate、translate和scale方法设置。 2. 通过IDLgrModel的transform属性设置。 恢复初始状态: oModel- reset 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形变换旋转: 1. oModel- Rotate ,x,y,z ,Angle 2. oModel- GetProperty ,transform= t oModel- SetProperty ,transform= t * newT Rx = 1.0, 0.0, 0.0, 0.0, $ 0.0, cosa, -sina, 0.0, $ 0.0, sina, cosa, 0.0, $ 0.0, 0.0, 0.0, 1.0 Ry = cosa, 0.0, sina, 0.0, $ 0.0, 1.0, 0.0, 0.0, $ -sina, 0.0, cosa, 0.0, $ 0.0, 0.0, 0.0, 1.0 Rz = cosa, -sina, 0.0, 0.0, $ sina, cosa, 0.0, 0.0, $ 0.0, 0.0, 1.0, 0.0, $ 0.0, 0.0, 0.0, 1.0 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形变换平移: 1. oModel- Translate, dx, dy, dz 2. oModel- GetProperty ,transform= t oModel- SetProperty ,transform= t * newT transT = 1.0, 0.0, 0.0, dx, $ 0.0, 1.0, 0.0, dy, $ 0.0, 0.0, 1.0, dz, $ 0.0, 0.0, 0.0, 1.0 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) 图形变换比例缩放: 1. oModel- Scale ,sx ,sy ,sz 2. oModel- GetProperty ,transform= t oModel- SetProperty ,transform= t * newT scaleT = sx, 0.0, 0.0, 0.0, $ 0.0, sy, 0.0, 0.0, $ 0.0, 0.0, sz, 0.0, $ 0.0, 0.0, 0.0, 1.0 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) grAtom中数据的normal坐标转换 当IDLgrView使用normal坐标时,应该对grAtom(s)中的数据进行坐标转换以适应新的坐标系 。 oAtom=obj_new(IDLgrYyyy ,data ) Obji-GetProperty, XRANGE=xr, YRANGE=yr, ZRANGE=zr xc = -xr0/(xr1=xr0), 1/(xr1-xr0) yc = -yr0/(yr1=yr0), 1/(yr1-yr0) yc = -zr0/(zr1=zr0), 1/(zr1-zr0) Obji-SetProperty, XCOORD_CONV=xc, YCOORD_CONV=yc, ZCOORD_CONV=zc 事实上,在grAtom内部的计算方法为:normalized=so+s1*data 上述公式的转换结果为为01,如果IDLgrView中的坐标不是01,则可以根据需要对xc0 ,yc0,zc0进行计算,可以使图形在适当的位置显示。 如:data的值域为01,坐标为-11,则xc0=xc0-0.5即可。 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) Trackball Object 真正的交互式图形显示必须能让用户使用鼠标来操纵图形。 obj=OBJ_NEW(TrackBall ,Center ,Radius ,AXIS=0|1|2 ) 其中:center为鼠标作用区域的中心点、radius为鼠标作用区域的半径,均为device坐标。 axis标识旋转轴,0,1,2分别对应x,y,z轴,默认2。 注意:(1)TrackBall为Helper类,既无父类也无子类。因此,不能加入到任何一种图形对象 类,通常只做为widget的用户数据传递。 (2)TrackBall的事件一般只通过widget的事件处理程序处理。 TrackBall事件处理一般方法: TLB: oTrack=obj_new(Trackball, 200,200, 200) EH: widget_control ,event.top ,get_uvalue=pState bHaveXform=(*pState).oTrack-Update(event,TRANSFORM=TrackXform) if (bHaveXform) then begin (*pState).oModel-GetProperty,TRANSFORM=ModelXform (*pState).oModel-SetProperty,TRANSFORM=ModelXform#TrackXform (*pState).oWindow-Draw, (*pState).oView endif 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) Light Object 光源是IDL图形对象grAtom类之一,它可以加入到对象图形的层次结构中,从而可 以随对象图形的变换而变换(如:旋转、平移和缩放)。 IDL默认为环绕光,这会使3D图形看起来象2D图形一样。通过设置光源对象的属性 ,可以看到真正的3D图形。 obj=OBJ_NEW(IDLgrLight ,TYPE=0|1|2|3 ,LOCATION=x,y,z,COLOR=r,g,b) 其中:TYPE为光源类型。0为环绕光,1为点光源,2为平行光,3为聚光灯。 LOCATION为光源位置;COLOR为光源颜色。 多光源 由于光源可以随对象图形变换,因此为了从各个角度都能清楚地看到图形,就必 须设置多个光源。一个IDLgrView里最多可以放置8个光源。 让光源停在特定的位置 单独创建一个包含IDLgrLight的IDLgrModel,就可以控制它的动作。 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) Color Palettes Object 颜色的使用总是一件麻烦的事,在对象图形系统中,这个问题得到了较好的解决。 在对象图形系统中,无论以何种方式加载颜色表,IDL总是把颜色表的r,g,b值拷 贝到目标对象的颜色表中中。因此,索引表方式或真彩表方式的差别只是颜色的检索 方式的差别,都是静态颜色模式,不会出现动态颜色模式。 创建颜色模板对象的两种方法: (1) obj=OBJ_NEW(IDLgrPalette, aRed, aGreen, aBlue) (2) obj=OBJ_NEW(IDLgrPalette) obj-loadct ,33 注意:(1)IDLgrPalette不是grAtom类,因此不能加入到IDLgrModel里。它只能用于 目标类对象或用于grAtom类的PALETTE属性。(如IDLgrImage) (2)注意目标类对象的color_model。 对象图形篇对象图形篇 对象图形类(对象图形类(IDLgrYyyyIDLgrYyyy) Text and Font Objects 对图形输出而言,文本标注从来都是基本要求之一。 IDL提供高质量、可伸缩的文本用于输出。这些标注可以象图形一起加入层次结构 ,从而可以和其他图形一起重写、旋转、平移等。当然,也可以选择ONGLASS,这 样你总可以在屏幕上看见它们。 IDLgrText oText=obj_new(IDLgrText, string ,FONT=oFont ,/ONGLASS $ ,LOCATION=-1,0,0,COLOR=0,255,0 $ ,ALIGNMENT=0.5 ,vertical_alignment=0.5) 缺省设置:左对齐,与x轴平行,写在原点。 FONT属性设置字体,但该字体必须是IDLgrFont对象。 IDLgrFont oFont = obj_new(IDLgrFont, 隶书, SIZE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论