2022年IDL入门教程九 .pdf
《2022年IDL入门教程九 .pdf》由会员分享,可在线阅读,更多相关《2022年IDL入门教程九 .pdf(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第九章编写IDL 程序本章概述尽管 IDL 是一个程序语言,但在官方的IDL 文档里是不可能发现如何编写IDL 程序的方法。当然,这并不意味着只有一个正确的方法。任何人,只要了解过那些和我一样的IDL程序员,都知道一个优秀的IDL 程序员和一个不是那么优秀的程序之间的差距是很明显的。作为和 IDL 程序初学者长期打交道的人,作者见过了很多不是很好的程序。出现这个问题,可以肯定是由于对IDL信息缺乏了解。因为大多数这样的人毕竟是科学家, 而不是电脑程序员。他们很聪明,并且在干自己的本行,但他们并不是去编写优秀的电脑程序。如果只要遵循几条基本的原理,他们编写的程序就会出色,而且对他们自己也更有用。
2、因此,本章就是阐述这几个原理。本章的任务就是展示怎样编写一个合理的复杂图形演示程序。而且这个程序能从IDL命令行上调用。同时也希望该程序能够将数据显示在可改变大小图形窗口中,从IDL 命令行上直接打印,或者直接传送到PostScript 文件中。此外,这个程序能够轻松将数据文件保存成 GIF 或 JPEG 文件。即使这写程序采用不同的颜色,这个程序应该是具有颜色敏感功能,而且能够和其他程序共存。而且, 在程序中增加一个图形界面应该很简单,即使那些对该程序一知半解的用户也可以容易掌握。再者,这个程序应该维护简单,易扩展。简而言之,该程序应当以模块化方式来编写。尽管可能不清楚为什么要这样做,这里还
3、是有必要介绍以一下面向对象编程的概念,特别是自身模块和方法的概念。如果已经了解这个程序的原理,那么就能够毫无困难地理解在IDL5 中引进的对象类和方法方面的复杂知识。基本的 ImageBar程序这个基本程序的思路很简单,即显示图像, 在图像周围显示坐标轴。并在此图像的上方绘制一个颜色栏,用来表示图像色彩与其值的相关性。将这个程序取名为Imagebar。结果与图 80 相似。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 图片
4、82:此程序显示了一个由轴环绕的图象,图象上方的色彩栏标出了图像值的范围。这个程序的基本框架很简单。图像用一个类似于Tvimage 的命令来显示。(程序Tvimage,如果带关键字Position 就可用来定位显示图像。此外,它还可以根据图像输出设备的不同而输出不同大小的图像。详细信息请参阅72 页的“用标准化坐标来定位图像”。 )坐标轴是用带关键字NoData 的 Plot 命令绘制,色彩栏用Colorbar 命令显示的。 (程序Coloebar 是并与本书配套使用的程序之一。)注意,如果是在24 位颜色环境中运行这个程序,色彩分解应处于关闭状态。详细信息请参阅 87 页的“在 24 位颜色
5、环境中指定分解颜色”。要使颜色分解处于关闭状态,键入:IDLDevice, Get_Visual_Depth=thisDepth IDLIF thisDepth GT 8 THEN Device, Decomposed=0 如果愿意,也可将上述代码添加到下面的Imagebar 程序中。新建一个文本编辑窗口,并且给程序命名为ImageBar。其定义如下所示:PRO ImageBar, image其中, image 是要显示的二维图像。作者喜欢编写简单易懂程序,即使那些不清楚程序如何工作的用户也能够看懂。如果那样,即使用户不知道要将图像作为程序的第一个参数,程序也可以让用户有机会打开并读取一个图像
6、文件。编写这个程序的目的之一就是能够在Z 图形缓冲区或在PostScript 文件中输出显示图形。那两个图形输出设备既不支持窗口,也不支持组件程序。因此,程序要生成一个命令,类似于 Window 或一个在支持窗口的图形设备中创建窗口的命令。为达到这个目的,可以使用!D.Flags 系统变量。如果在这个变量的第八位的值不为0,那么当前图形设备就支持窗口。用256 和这个系统变量进行逻辑AND 运算,如果返回值为0,那么当前的图形设备就不支持窗口。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
7、- 第 2 页,共 11 页 - - - - - - - - - 这些代码让用户有机会在支持窗口的图形设备上打开图像文件。从这个意义上说, 参数image 可以说是一个可供选择的参数。如果设置不支持窗口,参数image 就是一个必须的参数了。增加了逻辑判断的代码如下:IF N_Params( ) EQ 0 THEN BEGIN IF (!D.Flags AND 256) NE 0 THEN BEGIN Image = GetImage ( Cancel= canceld, m51.dat ,$Xsize=340,Ysize=440) IF CANCELD then return ENDIF e
8、lse begin Message, Please supply an image argument, ,/Continue RETURN ENDELSE ENDIF 注意, GetImage 命令用来打开图像文件。程序getimage.pro 是和本书配套使用的文件之一。 GetImage 是用来读取无格式数据文件的一个通用程序。它是一个对话框程序。详细信息请参阅291 页的“创建模态对话框程序”。下一步,就是检查图像参数是必须是一个2 D 图像。注意,当出现错误时, 用 Message 命令而不是 Dialog_Message 命令来提示错误信息。这是因为Dialog_Message 是个
9、组件命令。同时在Z 或 PostScrippt 设备里用Dialog_Message 会导致错误。S= Size (image) IF S 0NE 2 THEN BEGIN Message, Image argument must be 2D. , /ContinueRETURN ENDIF 最后, 要定义 X 轴和 Y 轴矢量的默认值。 (在现实的应用程序里,这些矢量可能代表确切的物理含义, 并且作为固定参数传递到程序中。但是, 如果在这里也这么做,只会使例子更加复杂,而对增加程序原理的理解毫无裨益。)X=FindGen ( 1) Y=FindGen( 2) 下一步,就可以绘制图形了。这个图
10、像显示在窗口的偏下部分,而窗口的上部分用来显示颜色栏。注意,窗口不是专门为显示图形而建立的。这是又能输出到Postscript 文件,又能输出到可改变大小的窗口的图形程序的重要特点。如果程序要能够在任何图形显示窗口或设备上正常工作,应当如下所示:imagePos= 0.15,0.15.0.9,0.75 TVImage, image, Position=imagePos 接着,运用带关键字NoData 的 Plot 命令图像周围画轴。记住,要使用相同的定位参数,以确保坐标轴的范围与图像范围一致。此外,必须设置关键字NoErase,否则 Plot 命令会擦除刚才显示的的图像。键入:Plot,X,Y
11、, /NoDATA,xstyle=1,Ystyle=1,Position=imagePos, /NoEase 最后,在图像上方绘制颜色栏。通过变量imagePos 可以计算出颜色栏的位置,还应该稍微地延伸图像的长度,并颜色栏定位在图像上方。键入:barPos=imageposo,(imagepos3+0.15,imagepos2,$ (imagepos3+0.15)+0.05 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - C
12、olorbar,Position=barpos END 整个ImageBar 程序的源代码如下所示。(在与本书配套使用的文件中,可以找到本程序的源代码,文件名称为ImageBar.1.pro.)PRO ImageBar , image IF N_Params ( ) EQ 0 THEN BEGIN IF (! D. Flags AND 256 )NE 0 THEB BEGIN Image = Get Image ( Canceled, m 51.dat . $XSize=340, Ysize=440) IF canceled THEN RETURN ENDIF ELSE BEGIN Messa
13、ge, please supply an image argument. , ?ContimueRETURN ENDELSE ENDIF S =Size (image) IF s 0 NE 2 THEN BEGIN Message, Image argment must be 2D. , /ContinueRETUEN ENDIF X =FIndGen (s 1 ) Y= FIndGen (s 2 ) Image Pos = 0.15, 0.15, 0.9, 0.75 TVImage, image, Position =image Pos Plot, x, y, /NoData, XStyle
14、 =1, YStyle=1,$ Position = imagePos, / NoErase BarPos = imagepos0, (imagepos3+0.15), imagepos2, $ (immagepos 3 +0.15)+0.05 Colorbar, Position =barPos END 保存并编译这个程序,如果程序编译失败,在继续之前应该修订错误。IDL .Compile ImageBar 程序编译完后,打开银河系图像M51 和程序一起运行,键入:IDLimage =LoadData(12) IDLWindow IDLImageBar, image 如果程序在运行时出现程序
15、崩溃,需要对程序作一些修改。在每次修改程序时,要保存并重新编译文件。注意,这个程序可以在任何尺寸的窗口中显示图像,如下所示:IDLWindow, /Free, XSize=500, YSize =250 IDL ImageBar, image IDLWindow, /Free, XSize=300, YSize =600 IDL ImageBar, image 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 给程序 Image
16、Bar 增加一个“先擦除”功能注意,如果只是用鼠标改变图形窗口(而不是新建一个窗口),并重新执行ImageBar命令, 这时图像绘制在原有窗口的上面。这与 TV 或 TVScl 命令的效果相似,但在这里并不合适。在这个程序的TVImage 命令之前,可以增加一个永久性的擦除命令,但是在每次程序运行时都将擦除窗口里的内容。在显示设置上,这可能不是问题,但是如果是在创建PostScript 文件,这个永久性的删除命令就会将输出结果输出到第二页中。这样,每次创建一个 ImageBar 程序的 PostScript 文件,就有输出两页,第一页是空白的。为避免这一点, 可以把擦除功能作为可选择的关键字增
17、加到程序中。通过修改ImageBar程序的定义语句,可以给擦除关键字定义如下:PRO ImageBar, image, EraseFirst=erasefirst 这个EraseFirst 关键字可以设置也可以不设置,即有双重属性,这也意味着可以用Keyword_Set 命令来检查它是否存在。(详细信息请参阅213 页的“处理具有双重属性的关键字” 。 )在 TVImage 命令之前增加该行语句,如下所示。增加部分已用粗体字标出。ImagePos = 0.15, 0.15. 0.9, 0.75 IF Keyword_Set (eradefurst) THEN Erase TVImage, im
18、age, Position =imagePos 保存并重新编译ImageBar,并重新执行该程序,如下:IDL ImageBar, image ,/EraseFirst 注意,这是可以用鼠标来改变图形窗口的大小,并重新执行ImageBar 命令来重画图形。当进入到下一章时,就可以用一个方法自动处理这个过程。因此,当窗口改变大小时,图形就自动重画。向 ImageBar 程序增加颜色敏感功能颜色识别,是作者定义的一个术语,就是程序可以确切地知道哪部分颜色表可以使用。(详细信息请参阅67 页的“将图像缩放成颜色表的不同部分”)Xload 或 Xcolors 是颜色识别的最好例子。这两个例子分别通过使
19、用关键字Ncolors 和 Bottom 来计算出当前应用程序使用多少色彩以及这些色彩索引的开始位置。IDL Xcoloes, Ncolors=100 Bottoms=100 颜色识别命令可以通过不同方式一起使用来开发整个颜色识别的IDL 应用程序。要使ImageBar 程序能识别色彩。首先,给程序中的关键字Ncolors 和 Bottom 下定义,如:PRO ImageBar, image, EraseFirst=erasefirst, Ncolors=ncolors, Botttom =bottom下一步,检查关键词,若需要定义它们的默认值,键入如下:IF N Elements (Ncol
20、ors)EQ 0 THEN $ Ncolors = ! d. .Table_Size IF N_Elements (bottom)EQ 0 THEN bottom=0 这时, 再定义绘制颜色这个关键字或许是个好主意。现在, 并将它作为色彩表的最顶层颜色。然后将下面一行代码紧放在上述两行代码的后面:drawColor = ncolors 1 + bottom 下一步,修改程序TVImage ,使得图像合适地缩放到指定的颜色数。同时,也对刚才定义用来绘制颜色地Plot 命令。键入下面的黑体部分:TVImage, BytScl (image,Top=ncolors-1)+bottom,Positio
21、n=ImagePos 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - Plot,X,Y, /NoData,XStyle=1, Ystyle=1,Psition=imagePos, /NoErase, Color=drawColor最后,修改ColorBar 。幸运的是,ColorBar 已经是按照颜色识别的方式写的,只要将nColors 和 bottom 变量传递到程序中即可,如下所示:ColorBar,Postion=bar
22、Pos, Ncolors=ncolors,Bottom=bottom,Color=drawColor这时程序ImageBar 变成如下所示。 (在与本书配套的文件中可以找到这个程序的源代码,名称是ImageBar2.pro)PRO ImageBar ,image, EraseFirst=erasefirst ,Ncolors=ncolors, Botttom =bottom If N_Params() EQ 0 Then Begin IF (!D.Flags AND 256) NE 0 THEN BEGIN Image = GetImage ( Cancel= canceld, m51.dat
23、 ,Xsize=340,Ysize=440) IF Canceld THEN RETURN ENDIF ELSE BEGIN Message, Please supply an image argument, ,/Continue RETURN ENDELSE ENDIF S =Size (image) IF s 0 NE 2 THEN BEGIN Message, Image argment must be 2D. , /Continue RETURN ENDF X =FIndGen (s 1 ) Y= FIndGen (s 2 ) Image Pos = 0.15, 0.15, 0.9,
24、0.75 TVImage, image, Position =image Pos Plot,X,Y, /NoData,XStyle=1, Ystyle=1, Position = imagePos, / NoErase BarPos = imagepos0, (imagepos3+0.15), imagepos2, $ (immagepos 3 +0.15)+0.05 Colorbar, Position =barPos Ncoloes=ncolors,Botttom =bottom, Color=drawColor END 查看这时程序是否能够色彩识别,保存并重新编译,然后键入下面的命令:I
25、DLLoadCT,1,Ncolors=75,Bottom=0 IDLLoadCT,3, Ncolors=75,Bottom=75 IDLwindow,1 IDLImageBar, image, Ncolors=75, Bottom=0 IDLWindow, 2 IDLImageBar, image, Ncolors=75, Bottom=75 这时,第一个窗口的图像应该是蓝色的,第二窗口是红色的。要改变第一窗口的颜色,可以键入:IDLXcoloes, Ncolors=75, Title= Window 1 Colors要改变第二窗口的色彩,键入:IDLXcoloes, Ncolors=75,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年IDL入门教程九 2022 IDL 入门教程
限制150内