IDL 直接图形法 VS 对象图形法

直接图形法 VS 对象图形法 -->   itt 最新的IDL泄露培训教材

本文主要内容来着里面的一篇文章,觉得总结的挺好。写出来分享一下。

直接图形法和对象图形法是IDL中用于显示图形图像的两个独立系统,在写程序的时候是用直接图形还是对象法,什么时候用,各有什么特点呢?也是很多人关心的问题。

IDL语言 有两套完全独立的图形体系:直接图形法和对象图形法。这两套系统互不兼容,直接图形窗口里不能显示对象图形,相反同样如此。虽然对象图形法更现代一些,但并不意味着直接图形法可以抛弃了。每个系统都有它自己的优缺点。下面对主要特点做一归纳:

类别

直接图形法

对象图形法

持续性(persistence

直接图形法命令信息是不被保存下来的,所以如果你要改变所显示的图形,一系列的直接图形法命令必须重新执行一遍。

显示对象图形是需要对象层次,对象层次里面存储了再次绘制所需的所有信息。当一个对象改变,整个层次重新刷新

开销(overhead

直接图形法消耗很小,一个简单的绘图一个命令就可以完成。对于一些交互和一些简单使用是非常便利的

不管多么简单的图形,都需要一个对象层次和一个图形输出地(窗口或buffer 等)。

 

速度(speed

直接图形法可以非常快速的显示图像和简单的图形。特别是使用了pixmap 这一类的技术

复杂的3d 图形可以相当快速的绘制出来。特别是有一个支持opengl 的好的显卡提供硬件支持的时候

3d

默认的,直接图形法像是在帆布上作画。没有数据位置在3d 空间,执行的程序决定谁在最上面。Zbuffer 常用于隐藏线的移动,但是需要使用者更多的准备和工作

对象图形本质是就是3 维的,左右的操作都在3 维中

接口(interface

直接图形用简单的程序接口 可以 适当进行交互使用或编程。

对象图形用面向对象的程序接口,数据存储在内存堆栈中,为了避免内存泄露和高效的使用,必须要程序员去管理

设备(device )(PS ,printer,window 等)

不同的设备需要不同的参数设置。发送一个直接图像场景去几个设备需要执行一系列的命令

对象图形层次独立于任何驱动。对象场景被创建和传输在不同的驱动间

总结这两个系统间的不同,最基本的公理是:

 

直接图形法做简单的事容易,对象图形法使复杂的事变成可能。

 

IDL可视化效率分析与注意要点(对像图形法)

大家谈IDL数据处理效率,内存管理比较多。

有时候IDL程序慢不仅仅是数据处理上,很多情况上是在数据可视化,系统显示和刷新出现了问题
这里谈谈IDL如何提高可视化效率以及需要注意的事项。

呵呵本文主要起抛砖引玉的作用,大家一起讨论讨论。主要内容是7月在北师做的培训,以及一些基本思想来自hh,cg的''谆谆教诲''。

==============================================================================

用IDL进行数据可视化只要注意以下4点,基本在效率上不会出现大的问题

1 : 控制视图的刷新(IDLgrWindow::Draw),减少不必要的刷新
在IDL中刷新视图用IDLgrwindow的draw的方法,draw重新绘制整个显示内容。是比较费时间的一个过程。所以尽量减少draw的次数,只有在我们的视图内容改变我们才去draw。
2 : retain 属性
retain是组件widget_draw和IDLgrwindow类里面的一个属性参数(在程序中其中一个设置就可以了)。
retain 是控制backing store(存储备份)的参数。是IDL可视化效率影响最大的关键之一
retain 3个可选值0,1,2
retain等于0 是不进行存储备份,1是当前系统提供存储备份,2是IDL自己提供存储备份。
retain=0时IDL可视化效率最高,等于1和2时,内存里时时在对当前视图显示做临时备份,所以效率非常低

注:用retain=0时要与widget_draw 的expose_event事件一起用。因为在retain=0时视图在程序最大最小化以及移出移进桌面的时候不会自动更新,需要在expose_event里手动draw一下,更新一下视图
3:       select方法
select是IDLgrwindow的一个方法。用于对视图中的对象进行选择,这也是IDL中最影响效率的关键之一。
当前显示的对象越多,select的时候速度越慢。所以要减少select方法和选择的对象个数。
解决方法:
例如我们系统中有下面几层
vectorlayer:用于存储矢量的model
imagelayer:用于存储矢量的model
annotationlayer:用于存储标注的model
targerlayer::用于目标矢量的model

在我们实际系统中,选择对象的时候只是选择某一类对象。选择对象,我们可以隐藏别的不需要对象层。
例如当我们选择标注的时候,只需要对标注层操作,我们就可以先隐藏vectorlayer:imagelayer:targerlayer:3个层再选择,选择完再hide=0:
vectorlayer->setproperty,hide=1
imagelayer->setproperty,hide=1
targerlayer->setproperty,hide=1
Result = owindow ->select(oview,[ev.x,ev.y])
vectorlayer->setproperty,hide=0
imagelayer->setproperty,hide=0
targerlayer->setproperty,hide=0
这样操作大大减少系统处理时间

4:减少不必要的IDLgrmodel数量
model是最小的容器用于存放所需的图形原子,不仅如此 使用model容器的嵌套容易方便的建立其系统的对象层次和清晰的结构,很轻松的进行分层管理。这是IDl特色与优点之一。
但是不意味着model可以滥用。model虽然是只是容器也是消耗系统资源的,而且比单独的图形原子要耗系统资源的多,
在model过多会严重影响系统刷新效率.如果个体没有特殊操作(编辑,选择,平移,旋转...),能放在一个model里的对象图形原子最好不要放在多个model
例子:
有两条线需要放在对象体系中
oline1 = obj_new('IDLgrpolyline',data=[[0,0],[1,0]])
oline2 = obj_new('IDLgrpolyline',data=[[1,1],[2,1]])
;
方式1
omodel1->add,oline1
omodel2->add,oline2
otopmodel->add,omodel1
otopmodel->add,omodel2
;
方式2
otopmodel->add,[oline1,oline2]

方式1比方式2多用2个model,刷新效率上就要低一丁点丁点丁点丁点丁点丁点。。。。。。。。。。。。。。。。。。。。。。。。。
--------------------------------------------
其他情况:
RENDERER 属性

RENDERER       是组件widget_draw 的属性。等于0是基于opengl硬件渲染,等于1是IDL本身软件渲染。
一般情况硬件渲染速度比软件渲染速度要快的多。

REJECT 属性
REJECT 是图形对象原子IDLgrpolygon的属性,对填充polygon有效(style=2)
一般情况在显示的图形中,系统都会把所有的面都渲染出来。但让系统渲染我们看不见的面是没有意义和消耗系统时间的。
reject=0 渲染出所有的面
reject=1 根据法线不渲染背向我们的面
reject=2 根据法线不渲染面向我们的面

 

[对象图形法]IDL中draw,view,image坐标体系与关系论

本文讨论是IDL对象图形法情况,也就是WIDGET_DRAW 的参数GRAPHICS_LEVEL=2 时候的情况。

---------------------------------------------------------------------------------------------------

在IDL的各种元素的关系和参数设置中,最复杂的莫过于widget_draw,IDLgrview,IDLgrimage,也就是下文简称的 draw,view和image。对与这3样,用过IDL再熟悉不过了,很多人都会用一点,但可能很少人能完全搞明白它们之间的差数设置和坐标关系。

1 .

draw的坐标设置(也就是大小)比较简单,就两种参数xsize和ysize,x_scroll_size 和y_scroll_size.简言之,xsize和ysize是draw的实际大小,也决定着draw的坐标范围 (event.x,event.y);x_scroll_size 和y_scroll_size决定这draw实际显示的大小。

2.

view与坐标相关的参数有3个:dimensions,location,viewplane_rect。其中前两个 (dimensions,locaton)是与draw的坐标体系(xsize,ysize)相关,分别表示的是view在draw中显示的大小和左下点 在draw里的位置。dimensions如果小于或大于draw的大小,view里的东西(model)就会缩放。viewplane_rect是 view自己的虚拟空间的坐标。vewplane_rect是一个含有4个元素的1维数组,前两个表示建立的虚拟坐标左下角的坐标,后两个表示这个虚拟坐 标系的范围大小。

所以本质上来说viewplane_rect与dimenstions和location没有任何关系。

3.image 做为对象原子和IDLGRPOLGYGON等等一样是不能直接放在view里面,image必须放在上一层的容器里(IDlgrmodel),然后 model在放进view里。image与坐标相关的参数有2个:dimensions和location。这里的 dimensions,location与view相同的两个参数也有本质的区别,image中的dimension表示的是在图像在view的虚拟坐标 体系(由viewplane_rect建立)中的大小范围,location也表示的是图像左下角在view的虚拟坐标体系中的位置。

-------------------------------------------------------------------------------------------------------------------------------

实际上view里存放的东西坐标都于view的虚拟坐标体系(viewplane_rect)有关,包括image,polygon,polyline。。这里举image的例子。

view本身的位置是与draw坐标(xsize,ysize)有关。

-------------------------------------------------------------------------------------------------------------------------

例子1:

1最简单的例子是view坐标采用影像的像素坐标,在窗口中显示影像全图。以窗口大小(800,600),图像大小(1000,1000)为例。

这时候draw的 xsize=800,ysize=600

IDLgrview的 viewplane_rect =[0,0,1000,1000](意思是在view中建立与影像大小一样大,左下点坐标是[0,0]的),location 默认就是0,0

idlgrimage dimension =[1000,1000](全图显示),location 默认就是0,0

-------------------------------------------------------------------------------------------------------------------------

2    接着上面的例子,窗口(800,600),图像(1000,1000)

如果想显示原始比例大小的图像:2 种设置方法

a   就在上个例子里idlgrimage 的dimension 设为【1000,1000】或什么都不设为默认[1000,1000],IDLgrview,dimension=[800,600]和窗口大小一样,不 缩放,viewplane_rect =[0,0,800,600]

b   idlgrimage 的dimension [1000,1000],IDLgrview,dimension=[1000,1000],viewplane_rect =[0,0,1000,1000]

3 使用归一化坐标体系。归一化坐标就是view的坐标范围是一个坐标范围之间,常用0-1之间,所有对象原子的都要归一化到0-1之间。是IDl中用的非常广,非常方便的一种坐标系统。

同上面例子,用这种坐标体系

显示原始大小  

oview = obj_new('IDLgrview',viewp=[0,0,1,1],dimension=[1000,1000] )
oimage = obj_new('IDLgrimage',data=img,dimensions=[1,1])

显示全图

oview = obj_new('IDLgrview',viewp=[0,0,1,1],dimension=[800,600 )
oimage = obj_new('IDLgrimage',data=img,dimensions=[1,1])

用这种坐标系,大家可以看到,view的dimension和上面两个例子是一样的。但是vewiplane_rect和image的dimension变了。viewp定义了坐标范围,image的dimension和viewp的坐标一样的。

4 envi的坐标方式:

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值