收藏 分享(赏)

IDL入门教程五.doc

上传人:精品资料 文档编号:11041577 上传时间:2020-02-05 格式:DOC 页数:19 大小:226KB
下载 相关 举报
IDL入门教程五.doc_第1页
第1页 / 共19页
IDL入门教程五.doc_第2页
第2页 / 共19页
IDL入门教程五.doc_第3页
第3页 / 共19页
IDL入门教程五.doc_第4页
第4页 / 共19页
IDL入门教程五.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、第五章 图形显示技巧本章概要在上一章节了学习了一些图形显示技术。在这一章节将学习几个新的图形显示技巧,以便让图形显示具有专业的感观效果。具体来说,将学会:1. 怎样让鼠标交互作用于图形显示2. 怎样从图形显示中删除注释3. 怎样在图形显示上画“橡皮条”4. 怎样在图形显示技巧中使用 Z 图形缓冲区将光标用于图形显示数据可视化显示的原因之一是用户可用不同的方式对数据进行交互式的操作。用户喜欢的一种对数据交互式操作的方式是使用光标去选择或者标注部分数据。这种交互作用在IDL 中用 Cursor 命令很容易完成。用 LoadData 命令装入 Time Series 数据集,可看到 Cursor 命

2、令是如何工作的。IDL curve = LoadData (1)输入下述命令,显示曲线:IDL Window, Xsize = 400, Ysize = 400IDL LoadCT, 0IDL TvLCT, 255,255,0,1IDL Plot, curveCursor 命令接受两个参数。这些参数必须是记录鼠标键按下时光标位置的变量。Cursor 命令要求光标位于当前图形窗口中。 (即被!D.Window 系统变量指向的窗口。 )例如,如果输入这个命令,IDL 将会等待光标被移动到当前图形窗口(如果输入的是上述命令,就是 0 号索引窗口)并单击鼠标键。当执行上述动作后,IDL 将光标位置返回

3、到变量xLocation 和 yLocation 中。输入:IDL Cursor, xLocation, yLocation如果打印出这些变量的值,将发现这些值被赋予的是数据坐标空间。xLocation 的数值从 0 到 100,yLocation 的数值从 0 到 30。 (如果是在图形边界内点击的鼠标,它们至少是这么多。如果不是在图形边界内点击的鼠标会怎么样?)缺省时,Cursor 命令返回数据坐标位置。IDL Print, xLocation, yLocation什么时候返回的光标位置?从上面的命令看,似乎鼠标键被按下时返回光标位置,但并非总是这样。事实上,Cursor 命令什么时候报告

4、光标的位置是由 Cursor 命令的关键字所决定的。这些关键字是:Change 当光标位置发生改变或用户移动光标时,返回光标位置。Down 当鼠标键被按下时,返回光标位置。NoWait 当 Cursor 命令执行时,光标位置被立即返回。没有任何延迟或等待鼠标的按键。这个关键字有时用于当对象正在显示窗口中被移动时的循环中。UP 不是在鼠标键被按下时,而是放开或释放后返回光标位置。Wait Cursor 命令等待鼠标键被按下后返回光标的位置。只要鼠标键被按下,此关键字对 Cursor 命令的作用就类似于用 NoWait 关键字调用 Cursor 命令。此关键字是 Cursor 命令的缺省状态。在

5、Cursor 命令中,小心使用合适的关键字,特别是在循环过程中使用 Cursor 命令。用户有时习惯地认为 Cursor 命令的缺省属性是只有鼠标键被按下时才返回光标的位置。其实不然,缺省属性只是等待一个单击动作,以后的行为就和 NoWait 关键字一样。在循环中这个区别是至关重要的。哪一个鼠标键和光标共同作用呢?除了设置光标属性外,有时还想知道哪个鼠标键用于对 Cursor 命令作出反应。例如,想要用鼠标左键做某件事,而做另外不同的事情要用鼠标右键 Cursor 命令作出的反应。可以检查系统变量!Mouse 中的 Button 字段,来判断哪一个鼠标键在和 Cursor 命令共同作用。(老版

6、本的 IDL 是用系统变量!Err 的值来判断的。 )这个字段是一个整型位映象。Button 这个字段的有效值及其意义如下:!Mouse.Button = 0 当前没有按键被使用!Mouse.Button = 1 左键用于 Cursor 命令!Mouse.Button = 2 中间键用于 Cursor 命令!Mouse.Button = 4 右键用于 Cursor 命令用光标标注图形输出使用 Cursor 命令的一种方法是允许用户交互地在线画图上放置符号标记。例如,正确无误地输入下列命令。当输完最后一个回车键后,在当前的图形窗口上单击鼠标五次。五个符号将放置在窗口中。 (如果在输入下列代码时出

7、现打字错误,必须从头开始重新输入。)输入:IDL For j = 0, 4 DO BEGIN $IDL Cursor, xloc, yloc, /DOWN Select one corner of box.接着输入第二个 Cursor 命令。在图形轴的范围内某处点击:IDL Cursor, x2,y2, /DOWN; Select diagonal corner of box.上述 Cursor 命令返回的坐标是数据空间坐标。按如下画方框:IDL Plots, x1,x1,x2,x2,x1,y1,y2,y2,y1,y1, color = 1输出结果应类似于图 58 中所示,尽管实际的图形上方框

8、取决于在窗口中点击的位置。为了放大这部分图形,必须保证方框坐标的正确顺序。这是非常必要的,因为可能先选择的是方框的右下角,然后是左上角,这样 x1 将大于 x2。还可以想象其它的假设。为了适应所有的情况,键入:图 58:在部分数据周围画上方框的线画图。用 Cursor 命令选择方框的坐标,用 PlotS 命令画方框。IDL Xmin = Min(x1,x2, Max = xmax)IDL Ymin = Min(y1,y2, Max = ymax)最后,已经为放大对方框内的数据做好了准备。除了正确地设置数据范围外,还必须设置Style 关键字。知道为什么吗?如果不知道,可在不使用这两个关键字的情

9、况下试试下面的命令。将会发生什么呢?IDL Plot, curve, XRange = xmin, xmax, Yrange = ymin, ymax, $ Xstyle = 1, Ystyle = 1 在图像上使用 Cursor 命令通常当在处理图像数据时使用 Cursor 命令,希望用设备坐标而不是数据坐标返回光标位置。这是因为设备坐标和图像中对应的位置之间通常存在一种简单的关系(大多数是一对一的关系) 。为了解如何工作的,可用 LoadData 命令打开 360*360 的 World Elevation 数据集,键入:IDL image = LoadData(7)显示图像,并装入某些颜

10、色。如下:IDL topColor = !D.Table_Size-1IDL LoadCT, 3, Ncolors = !D.Table_Size-1IDLTvLCT, 255,255,0, TopColorIDL Window, XSize = 360, YSize = 360IDL TV, BytScl (image, Top = !D.Table_Size-2)利用光标在图像中选择某一特定行和列。注意 Cursor 和 PlotS 命令中的 Device 关键字。这是确保返回的坐标是设备坐标而不是数据坐标。在该位置上画一个十字线。 (确保在输入Cursor 命令后,在图像窗口中点击一下。

11、 )键入:IDL S = Size(image)IDL Cursor, col, row, / Device; Click in the window!IDL Plots, col, col, 0,s (2) , / Device, Color = topColorIDL Plots, 0,s (1) , row, row , / Device, Color = topColor注意,在图像中某一特定的行和列上获得图像数据是多么的容易。例如,可以轻易地绘制出图像中行和列的数据剖面,键入:IDL Window, 1, Xsize = 500, Ysize = 300IDL !P.Multi =

12、0, 2, 1IDL Plot, image *, row, Title = Row ProfileIDL Plot, image col, *, Title = Column ProfileIDL !P.Multi = 0IDL Wset, 0输出结果类似于图 59 所示。在循环中使用 Cursor 命令有时想在循环中使用 Cursor 命令。例如,当用光标选择图像上的单个像素时,可能想知道它的像素值。下面是个简单的循环程序,它将一直执行下去,直到单击右键或中键退出。打开文本编辑器,准确无误地输入如下代码。TopColor = !D.Table_Size-1LoadCT, 3, Ncolor

13、s = !D.Table_Size-1TvLCT, 255, 255, 0, topColorTV, BytScl (image, Top =!D.Table_Size-2)!Mouse.Button = 1REPEAT BEGINCursor, col, row, /Down, /DevicePrint, Pixel Value:, imagecol, rowENDREP UNTIL !Mouse.Button NE 1END图 59:用 Cursor 命令在图像中选择的行和列的剖面。保存到 loop1.pro 文件中(此文件已经存在于下载的本书配套程序之中) 。编译,并运行这个小主程序,输

14、入:IDL .RUN loop1移动光标进入图像窗口,开始单击左键。图像像素值就会出现在日志窗口中,直到点击其它键,而不是左键。如果在 Cursor 命令中使用除了 Down 之外的其它关键字会发生什么呢?实验一下,找出答案。从显示中删除注释当使用光标在图形显示上按照刚才使用的方法来添加注释时,也许会问:“怎样才能删除刚放置在那儿的注释呢?”有两种较好的方法删除注释。称之为异或法和设备拷贝法。笔者认为在两者之中设备拷贝法更能给出专业的感观效果。两种方法都列举出来,但重点将集中在设备拷贝法上。删除注释的异或法异或法是在图形函数的基础上起作用的。图形函数是两个数的位操作。这两个数分别与已经显示出来

15、的像素(称作所谓的目标像素)以及希望放置在同一位置的像素(称作所谓的源像素)相关联。通常,IDL 使用的图形函数称作源。在这种图形函数里,IDL 忽略了目标像素的值,仅仅在该像素位置上放置源像素的值。但如果这种图形函数变成 XOR(异或法) ,IDL 将目标像素和源像素进行逐位比较。这会产生反向目标像素的效果。换句话说,如果像素的二进制表示为 01100101,那么执行 XOR 命令后,像素的二进制表示为 10011010。(实际的 XOR 过程远比这复杂,因为只有 IDL 在颜色索引表中的邻近位置上有 256种颜色时,它才按这种方式运行,而这是一种少见的情形。大多数人只是认为 XOR 法是用

16、“相反的”颜色画,并保留原来的。在实际的 XOR 法中,可能预测将会使用哪种颜色来画,但在大多数情形下并不是这样。这就是为什么绝大多数 IDL 专业程序员宁愿采用设备拷贝法。 )在任何时侯,图形函数的作用效果都是由 Device 命令和 Set_Graphics_Function 关键字设置的。源模式下图形函数为 3。XOR 模式下图形函数为 6。此时 IDL 处于系统缺省的源模式下。当处于这种模式时,重新显示图像窗口中的图像。输入:IDL TV, BytScl (image, Top =!D.Table_Size-2)现在,选择 XOR 模式:IDL Device, Set_Graphics

17、_Function = 6 在图像中画一个方框:IDL Plots, 0.2, 0.2, 0.8, 0.8, 0.2, Color = topColor,$ 0.2, 0.8, 0.8, 0.2, 0.2, /Normal注意,方框线的颜色不是预测的黄色。取而代之是多彩的,尽管它显得也很合理。在这个模式下线下的像素已经被翻转了。要删除方框,只须将底下的像素值翻转回它们的原值。再次用 PlotS 命令很容易完成。IDL Plots, 0.2, 0.2, 0.8, 0.8, 0.2, Color = topColor,$ 0.2, 0.8, 0.8, 0.2, 0.2, /Normal可以反复执行

18、上面的命令,让方框随心所欲地出现或消失。在继续下面的练习前,确保将图形函数设回到源模式。键入:IDL Device, Set_Graphics_Function = 3 在 IDL 程序中可容易地利用图形函数。例如,打开以前写的 loop1.pro 主程序,按如下修改它。这个程序将在图像窗口中每次点击的位置上画一个大的十字线。以 loop2.pro 命名保存程序。键入:topColor = !D.Table_Size-1LoadCT, 3, NColors=!D.Table_Size-1TvLCT, 255, 255, 0, topColorTV, BytScl(image, Top=!D.T

19、able_Size-2)!Mouse.Button = 1; Go into XOR mode.Device, Set_Graphics_Function=6; Get initial cursor location. Draw cross-hair.Cursor, col, row, /Device, /DownPlotS, col,col, 0,360, /Device, Color=topColorPlotS, 0,360, row,row, /Device, Color=topColorPrint, Pixel Value: , imagecol, row; Loop.REPEAT B

20、EGIN; Get new cursor location.Cursor, colnew, rownew, /Down, /Device; Erase old cross-hair.PlotS, col,col, 0,360, /Device, Color=topColorPlotS, 0,360, row,row, /Device, Color=topColorPrint, Pixel Value: , image(colnew, rownew); Draw new cross-hair.PlotS, colnew,colnew, 0,360, /Device, Color=topColor

21、PlotS, 0,360, rownew,rownew, /Device, Color=topColor; Update coordinates.col = colnewrow = rownewENDREP UNTIL !Mouse.Button NE 1;Erase the final cross-hair.PlotS, col,col, 0,360, /Device, Color=topColorPlotS, 0,360, row,row, /Device, Color=topColor; Restore normal graphics function.Device, Set_Graph

22、ics_Function=3END保存到文件 loop2.pro 中。 (此文件已经存在于下载的本书配套程序之中。 )编译,并执行这个主程序,键入:IDL .RUN loop2将光标放在图像窗口中,点击左键数次。在每个光标位置上应该有一个十字线。按右键或中间键终止程序。删除注释的设备拷贝法设备拷贝法利用像素映射窗口来删除已显示屏幕上的注释。像素映射窗口和其它 IDL图形窗口完全一样,除了它不显示在显示器上外。事实上,它存在于显示设备的视频随机存储器中。换句话说,它存在于存储器中。从其它任何方面来说,它就象一个正常的 IDL图形窗口一样:可用 Window 命令创建,用 WSet 命令激活,用

23、WDelete 命令删除,等等。在像素映射窗口内画图和在 IDL 正常的图形窗口内画图是完全一样的(例如,用Plot、Surface、TV 和其它图形输出命令) 。设备拷贝技术就是从一个窗口(称为源窗口)拷贝一个矩形区,然后将矩形区传入另一个窗口(称为目的窗口) 。源窗口和目的窗口有时可以是同一个窗口,这点等会会看到。图 60 是设备拷贝技术的图解。实际的拷贝是通过 Device 命令和 Copy 关键字(设备拷贝技术的名字由此而来)完成。命令的一般形式如下:Device, Copy = sx, sy, col, row, dx, dy, sourceWindowID在这个命令中,Copy 关

24、键字的组成元素是:sx, sy 源窗口矩形区左下角的设备坐标(矩形区是从源窗口拷贝的)col 从源窗口中拷贝的列数。这是矩形区的宽度。row 从源窗口中拷贝的行数。这是矩形区的高度。dx, dy 目标窗口中矩形区左下角的设备坐标。 (目标窗口是要将矩形区拷贝到的窗口。目标窗口总是当前图形窗口。 )sourceWindowID 源窗口的窗口索引号。矩形区从此窗口拷贝到当前图形窗口(由!D.Window 系统变量指定) 。源窗口可以是当前图形窗口,但多数情况下它是一个非当前图形窗口的窗口。它通常是一个像素映射窗口。要看其是如何工作的,先创建一个像素映射窗口,在里面显示一幅图像。用带 Pixmap关

25、键字的 Window 命令来创建像素映射窗口,键入:IDL Window, 1, /Pixmap, XSize = 360, YSize = 360IDL TV, BytScl (image, Top =!D.Table_Size-2)图 60:设备拷贝技术是将源窗口的一个矩形区拷贝到目标窗口的某个位置。实际上可以拷贝整个窗口,而且源窗口和目标窗口可以是同一个窗口。注意,当输入这些命令时没有任何可见的线索表明发生了什么。这是因为像素映射窗口仅存在于视频随机存储器中,而不是在显示屏上。为证明这个窗口内存有的内容,可打开第三个窗口,并将像素映射窗口的内容拷贝到第三个窗口中。如果第三个窗口看起来象原

26、来的图像窗口,那么已经输入的命令是正确的。键入:IDL Window, 2, Xsize = 360, Ysize = 360IDL Device, Copy =0, 0, 360, 360, 0, 0, 1注意,已将像素映射窗口的全部内容拷贝到这个新的窗口中。这种操作除了在速度上快几个数量级之外,其它方面与在此新窗口中重新显示图像类似了。将像素映射窗口中的全部内容拷贝到了新的显示窗口是一种常见的做法,即使只是修改部分的显示窗口。删除最后创建的两个窗口(包括像素映射窗口) ,如下:IDL Wdelete, 1, 2当对像素映射窗口操作完成后,删除它们是很重要的。它们会占用存储空间,这些存储空间

27、可用于其它用途。某些窗口管理器为这些像素映射窗口分配一个定量的存储空间。如果像素映射窗口超过了视频存储器的容量,可以使用虚拟内存。X 终端给像素映射窗口留有非常小的存储空间。要了解设备拷贝技术在实际中是如何运用的,修改主程序以前写的主程序文件loop2.pro。可以拷贝到另一个文件,以 loop3.pro 命名。修改代码如下:TopColor = !D.Table_Size-1LoadCT, 3, Ncolors = !D.Table_Size-1TvLCT, 255, 255, 0, topColorTV, BytScl (image, Top =!D.Table_Size-2)!Mouse

28、.Button = 1; Create a pixmap window and display image in it.Window, 1, /Pixmap, Xsize = 360, Ysize = 360TV, BytScl (image, Top =!D.Table_Size-2); Make the display window the current graphics window.源窗口 目标窗口(sx,sy) colrow(dx,dy)Wset, 0; Get initial cursor location. Draw cross-hair.Cursor, col, row, /

29、Device, /DownPlots, col, col, 0, 360 , / Device, Color = topColorPlots, 0, 360 , row, row , / Device, Color = topColorPrint, Pixel Value:, imagecol, row; Loop.REPEAT BEGIN ; Get new cursor location.Cursor, colnew, rownew, /Device, /Down; Erase old cross-hairDevice, Copy = 0, 0, 360, 360, 0, 0, 1Prin

30、t, Pixel Value:, imagecolnew, rownew; Draw new cross-hair.Plots, colnew, colnew, 0, 360 , / Device, Color = topColorPlots, 0, 360 , rownew, rownew , / Device, Color = topColorENDREP UNTIL !Mouse.Button NE 1; Erase the final cross-hair.Device, Copy = 0, 0, 360, 360, 0, 0, 1END以 loop3.pro 命名存档。 (此文件已经

31、存在于下载的本书配套程序之中)编辑,并运行主程序,输入:IDL .RUN loop3放置光标于图像窗口中,点击左键数次。单击右或中间键终止程序。注意十字线是用黄色绘制。在继续下一次练习之前,删除像素映射窗口。输入:IDL Wdelete, 1画一个橡皮筋方框设备拷贝技术非常适用于在屏幕上画橡皮条选择方框和其它形状。 (橡皮条方框是指一角固定,另一角随着光标的变化而变化的方框) 。事实上,修改程序 loop3.pro 可以很容易实现。将 loop3.pro 拷贝到文件 rubberbox.pro。 (loop3.pro 文件已经存在于下载的本书配套程序之中。 )作如下修改,看看创建一个橡皮条方框

32、是多么容易。topColor = !D.Table_Size-1LoadCT, 3, NColors=!D.Table_Size-1TvLCT, 255, 255, 0, topColorTV, BytScl(image, Top=!D.Table_Size-2)!Mouse.Button = 1; Create a pixmap window and display image in it.Window, 1, /Pixmap, XSize=360, YSize=360TV, BytScl(image, Top=!D.Table_Size-2);Make the display window

33、 the current graphics window.WSet, 0; Get initial cursor location (static corner of box).Cursor, sx, sy, /Device, /Down; Loop.REPEAT BEGIN; Get new cursor location (dynamic corner of box).Cursor, dx, dy, /Wait, /Device; Erase the old box.Device, Copy=0, 0, 360, 360, 0, 0, 1; Draw the new box.PlotS,

34、sx,sx,dx,dx,sx, sy,dy,dy,sy,sy, /Device, $Color=topColorENDREP UNTIL !Mouse.Button NE 1;Erase the final box.Device, Copy=0, 0, 360, 360, 0, 0, 1END运行程序,输入:IDL .RUN rubberbox在继续下一次练习之前,删除像素映射窗口。输入:IDL Wdelete,1图形窗口的滚动设备拷贝技术的另一个有效应用是实现图形窗口的滚动。在这个示例中将运用设备拷贝技术让图形显示窗口中的图像滚动起来。图像从左至右每次滚动四列。使用的算法如下:(1)将窗口右

35、边最后四列拷贝到一个仅有四列宽和 360 行高的小像素映射窗口。 (2)将整个显示窗口的内容(减去已经拷贝的四列)在同一窗口(也就是说,源窗口和目标窗口是同一个窗口)内向右边移动四列。 (3)将像素映射窗口的内容拷贝到显示窗口左边头四列。打开文本编辑器,输入下列命令。以 scroll.pro 命名(此文件已经存在于下载的本书配套程序之中) 。; Open a pixmap window 4 columns wide.Window, 1, /Pixmap, XSize=4, YSize=360FOR j=0,360/4 DO BEGIN; Copy four columns on right o

36、f display into pixmap.Device, Copy=356, 0, 4, 360, 0, 0, 0; Make the display window the active window.WSet, 0; Move window contents over 4 columns.Device, Copy=0, 0, 356, 360, 4, 0, 0; Copy pixmap contents into display window on left.Device, Copy=0, 0, 4, 360, 0, 0, 1ENDFOREND运行程序,输入:IDL .RUN scroll

37、程序每次滚动一次。再次运行程序,输入:IDL .Go能修改程序让它一直滚动,直到让它停止吗?在继续下一次练习之前删除像素映射窗口。输入:IDL Wdelete,1Z 图形缓冲区中的图形显示技巧可以把 IDL 中的 Z 图形缓冲区想象成一个三维盒子,3D 对象可以被堆积在里面而不用关心它们的“实体”性质。这个盒子能用 16 位深度缓冲区来记录每个对象的深度。盒子的一边是投影平面。可以想象光线通过投影平面的每一个像素最终遇到盒子内实体对象。光线遇到的像素值就是投影到投影平面的值。用这种方法,Z 图形缓冲区就可以处理曲面和线条的自动消隐。图 61 就是此概念的图解说明。图 61:Z 图形缓冲区可以被

38、想象作一个能保留深度信息的 3D 盒子。光线射到 Z 图形缓冲区中的物体时,它们的像素值反过来被投影到投影平面上。其概念是,当物体被装入三维盒子里时,就可以得到投影平面的一幅快照或一幅图像。这是盒子中三维物体的二维投影。处在其它物体后面的物体就不被显示。 (这种属性可以在一些 IDL 图形命令中用 Transparent 关键字来改变,以后将会看到。 )快照实际上就是利用Z 图形缓冲区TVRD 命令对投影平面的屏幕转储。Z 图形缓冲区的实现在 IDL 中,Z 图形缓冲区是用软件方式作为另一中图形输出设备实现的,类似于PostScript 设备或 X 窗口,Win 或 Mac 设备。因此,要在

39、Z 图形缓冲区中画图形,必须用Sep_Plot 命令将其变成当前的图形输出设备。和其它图形输出设备一样,Z 图形缓冲区可用 Device 命令和适当的关键字来配置。常用于 Z 图形缓冲区的两个关键字是 Set_Colors 和 Set_Resolution。这两个关键字定义如下:Set_Colors Z 图形缓冲区中的颜色数。在缺省情况下,Z 图形缓冲区使用 256 种颜色。在 IDL 运行中,这是个非常少的颜色数目。如果希望 Z 图形缓冲区的输出具有和显示设备相同的颜色数目,就须设置这个关键字。Set_Resolution Z 图形缓冲区投影平面通常设置为 640 像素宽和 480 像素高。

40、如果要在图形窗口显示 Z 图形缓冲区的输出结果,就应该将 Z 图形缓冲区的大小设置成图形窗口的大小。例如:DEVICE, Set_Resolution=400,400一个 Z 图形缓冲区实例:两个曲面要了解 Z 图形缓冲区是怎样工作的,先按如下创建两个名为 peak 和 saddle 的物体。(完成此例的命令可以在下载的本书配套程序中的文件 twosurf.pro 中找到。 )IDLpeak=shift(dist(20,16),10,8)IDLpeak=Exp(-(peak/5)2)IDLsaddle=shift(peak,6,0)+shift(peak,-6,0)/2B要在 Z 图形缓冲区中

41、组合两个 3D 物体,首先看看这两个物体的各自形状。可以让它们在两个窗口中以不同的颜色表显示。首先,在颜色查询表中的不同部位装入蓝色和红色色谱表:IDLcolors=!D.Table_Size/2IDLLoadCT, 1, ncolors=colorsIDLLoadCT, 3, ncolors=colors, Bottom=colors-1创建一个窗口,显示第一个物体的阴影曲面图。要注意的是,Set_shading 命令是用来将阴影处理的值限制在颜色查询表中特定部位。键入:IDLwindow, 1, xsize=300, ysize=300IDLset_shading, value=0,col

42、oe-1IDLshade_surf, peak, zrange=0.0,1.2接着将第二物体显示在它自己的显示窗口中。用颜色查询表的不同部位作为阴影处理参数。键入:IDLwindow, 2, xsize=300,ysize=300IDLset_shading, value=colors, 2*colors-1IDLshade_surf, saddle, zrange=0.0,1.2使 Z 图形缓冲区成为当前设备为了在 Z 图形缓冲区中组合两个物体,必须使 Z 图形缓冲区成为当前的图形显示设备。这可用 Set_Plot 命令来实现。Copy 这个关键字可将当前的颜色表复制到 Z 缓冲区中。保存当

43、前图形显示设备的名字,以便能方便地返回。键入:IDLthisDevice=!D.NameIDLSet_Plot,z,/Copy配置 Z 图形缓冲区接下来,必须将 Z 图形设备配置成具体的规格。在这个例子中,要限制颜色的数目,还要使缓冲区的分辨率与当前图形显示窗口尺寸相等。键入:IDLDevice,Set_colors=2*colors, Set_Resolution=300,300将物体装入到 Z 图形缓冲区中现在,将两个物体装入到 Z 图形缓冲区中。要注意的是,键入这些命令时,将看不到任何事发生。因为输出已进入内存中的 Z 图形缓冲区里面,而不是显示设备。IDLSet_shading,val

44、ues=0,color-1IDLShade_surf,peak,zrange=0.0,1.2IDLSet_shading,values=colors,2*colors-1IDLshade_surf,saddle,zrange=0.0,1.2,/noerase对投影面进行拍照接着,对投影表面进行快照。可通过 TVRD 命令实现。IDLpicture=TVRD ()在显示设备上显示结果最后,返回到显示设备。打开一个新的窗口来显示“图像” ,如下:IDLSet_Plot, thisdeviceIDLWindow, 3, xsize=300,ysize=300IDLTV, picture 输出结果应如

45、图 62 所示。图 62:Z 图形缓冲区可以通过曲面的自动消隐来组合 3D 物体。Z 图形缓冲区的一些奇怪特点仔细查看窗口 1 和 3 的输出。特别注意观察那些坐标轴的标记。可以注意到窗口3(也就是来自 Z 图形缓冲区的输出)的轴的标记要稍微大些。由于某种原因,Z 图形缓冲区使用了一种缺省的不同于 IDL 在显示窗口中显示图形时所用的字符尺寸。这种简单的事实,如果不意识到的话,会导致在 Z 图形缓冲区中建立一个 3D 坐标空间以及组合 IDL 图形命令时,造成大量的时间浪费。这主要是因为图形边缘的建立是基于缺省的字符尺寸,并且图形边缘在显示设备上和在 Z 图形缓冲区中是有差异的。它们差不多是一

46、样的。但就是 “差不多”将使读者焦头烂额。一种笨规则非常有用,就是,当要在 Z 图形缓冲区中画图时,总是设置!P.Charsize 系统变量。例如:IDL!P.Charsize=1.0这里只是提供一个例子,查看图 62 中的图示。这幅图上的轴不是在 Z 图形缓冲区中创建的,因为那时它们将以屏幕分辨率被着色处理(也就是说,作为一幅图像)而且可用PostScript 的分辨率对它们进行着色处理。如果!P.Charsize 关键字没有在对阴影曲面进行着色处理和随后坐标轴的添加之前被设置的话,就不可能在最后的输出中使坐标轴线对应在正确的位置上。用 Z 图形缓冲区使图像变形使用 Z 图形缓冲区另一种更强

47、大的技术是用于三维数据的切片显示。这是可行的,因为 Z 图形缓冲区具有将图像变形到一个多边形平面上的能力。要了解是如何工作的,先用LoadData 命令打开 80*100*57 的 3D MRI Head Scan 数据集。如下:IDLhead=LoadData(8)也许希望能在输入代码时开一个日志文件去截获这些命令,因为这些命令数量很多,而且必须正确无误地找到它们。日志文件将使读者很轻松地改变并重新运行这些命令。 (这种日志文件已经创建好了,可以下载的本书配套程序中找到 warping.pro 文件。 )IDLJournal, warping.pro一般来说,在 IDL 中用 Size 命令

48、可以获得变量的维数和大小。为定义正确的图像平面,需要知道三维的尺寸。在这个例子中, “尺寸值”将比真实的维数值小 1,因为要用这个数值作为数组的索引号。IDL 的索引是号从零开始的。IDLs=Size(head)IDLxs=s1-1IDLys=s2-1IDLzs=s3-1假若想在这个数据集的中心显示三个正交切片,也就是说通过三维点(40,50,27) 。可以用下述方法定义这些点:IDLxpt=40IDLypt=50IDLzpt=27接着,可以构建用来描绘这三个图像切片或平面的各个多边形。此例子中,每个多边形将是有四个点(矩形的四个角)的简单矩形。矩形的每点都要用一个(x,y,z)三位值描述。换

49、句话说,每个平面都将是 3*4 的多边形。键入:IDLxplane= xpt,0,0,xpt,0,zs,xpt,ys,zs,$xpt,ys,0 IDLyplane= 0,ypt,0,0,ypt,zs,xs,ypt,zs,$xs,ypt,0 IDLzplane= 0,0,zpt,xs,0,zpt,xs,ys,zpt,$0,ys,zpt下一步是获得与每个图像平面相对应的图像数据。这在 IDL 中用数组下标很容易做到。IDLximage=headxpt,*,*IDLyimage=head*,ypt,*IDLzimage=head*,*,zpt要注意的是这些图形都是 3D 图像(其中有一维是 1) 。所关心的是与每个图像平面相关的 2D 图像,因此必须用 Reform 命令将

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报