IDL: [转载]图形显示技巧(二)
(2010-06-02 18:19:48)
标签:
it |
分类: IDL |
本章概要
在上一章节了学习了一些图形显示技 术。在这一章节将学习几个新的图形显示技巧,以便让图形显示具有专业的感观效果。
具体来说,将学会:
1.怎样让鼠标交互作用于图形显示
2.怎 样从图形显示中删除注释
3.怎样在图形显示上画“橡皮条”
4.怎样在图形显示技巧中使用Z图形缓冲区
将光标用于图形显示
数 据可视化显示的原因之一是用户可用不同的方式对数据进行交互式的操作。用户喜欢的一种对数据交互式操作的方式是使用光标去选择或者标注部分数据。这种交互 作用在IDL中用Cursor命令很容易完成。
用LoadData命令装入TimeSeries数据集,可看到Cursor命令是如何工作的。
IDL>curve = LoadData (1)
输 入下述命令,显示曲线:
IDL>Window, Xsize = 400, Ysize = 400
IDL>LoadCT, 0
IDL>TvLCT, 255,255,0,1
IDL>Plot, curve
Cursor 命令接受两个参数。这些参数必须是记录鼠标键按下时光标位置的变量。Cursor命令要求光标位于当前图形窗口中。(即被!D.Window系统变量指
向的窗口。)例如,如果输入这个命令,IDL将会等待光标被移动到当前图形窗口(如果输入的是上述命令,就是0号索引窗口)并单击鼠标键。当执行上述动作
后,IDL将光标位置返回到变量xLocation和yLocation中。输入:
IDL>Cursor, xLocation, yLocation
如 果打印出这些变量的值,将发现这些值被赋予的是数据坐标空间。xLocation的数值从0到100,yLocation的数值从0到30。(如果是在图 形边界内点击的鼠标,它们至少是这么多。如果不是在图形边界内点击的鼠标会怎么样?)缺省时,Cursor命令返回数据坐标位置。
IDL>Print, xLocation, yLocation
什 么时候返回的光标位置?
从上面的命令看,似乎鼠标键被按下时返回光标位置,但并非总是这样。事实上,Cursor命令什么时候报告光标的位置是由 Cursor命令的关键字所决定的。这些关键字是:
Change当光标位置发生改变或用户移动光标时,返回光标位置。
Down当鼠标 键被按下时,返回光标位置。
NoWait当Cursor命令执行时,光标位置被立即返回。没有任何延迟或等待鼠标的按键。这个关键字有时用于当
对象正在显示窗口中被移动时的循环中。
UP不是在鼠标键被按下时,而是放开或释放后返回光标位置。
WaitCursor命令等待鼠标
键被按下后返回光标的位置。只要鼠标键被按下,此关键字对Cursor命令的作用就类似于用NoWait关键字调用Cursor命令。此关键字是
Cursor命令的缺省状态。
在Cursor命令中,小心使用合适的关键字,特别是在循环过程中使用Cursor命令。用户有时习惯地认为 Cursor命令的缺省属性是只有鼠标键被按下时才返回光标的位置。其实不然,缺省属性只是等待一个单击动作,以后的行为就和NoWait关键字一样。在 循环中这个区别是至关重要的。
哪一个鼠标键和光标共同作用呢?
除了设置光标属性外,有时还想知道哪个鼠标键用于对Cursor命令作出反 应。例如,想要用鼠标左键做某件事,而做另外不同的事情要用鼠标右键Cursor命令作出的反应。可以检查系统变量!Mouse中的Button字段,
来判断哪一个鼠标键在和Cursor命令共同作用。(老版本的IDL是用系统变量!Err的值来判断的。)这个字段是一个整型位映象。Button这个字
段的有效值及其意义如下:
!Mouse.Button= 0 当前没有按键被使用
!Mouse.Button= 1 左键用于
Cursor命令
!Mouse.Button= 2 中间键用于Cursor命令
!Mouse.Button= 4 右键用于
Cursor命令
用光标标注图形输出
使用Cursor命令的一种方法是允许用户交互地在线画图上放置符号标记。例如,正确无误地输入下列 命令。当输完最后一个回车键后,在当前的图形窗口上单击鼠标五次。五个符号将放置在窗口中。(如果在输入下列代码时出现打字错误,必须从头开始重新输 入。)输入:
IDL>For j = 0, 4 DO BEGIN $
IDL>Cursor, xloc, yloc, /DOWN & $
IDL>Plots, xloc, yloc, Psym = 4, SymSize = 2, Color = 1 & ENDFOR
画 方框
有时可能为了选取图形显示中的某部分,而在它的周围画上方框。这里有些命令可用来选择由Cursor命令产生的方框的对角,画出该方框,并将 图形缩放到该方框坐标范围。首先画图:
IDL>Plot, curve
接着,使用光标选择想画的方框的一角。要确保在当前图形窗 口上点击光标。为确定哪个是当前窗口,并让它不被隐藏,可输入:
IDL>WShow
现在键入第一个Cursor命令。在图形轴的 范围内某处点击:
IDL>Cursor, x1,y1, /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中所示,尽管实际的图形上方框取决于在窗口中点击的位置。
为了放大这部分图形,必须保证方框坐标的正确顺序。这是非常必要 的,因为可能先选择的是方框的右下角,然后是左上角,这样x1将大于x2。还可以想象其它的假设。为了适应所有的情况,键入:
图58:在部分数据 周围画上方框的线画图。用Cursor命令选择方框的坐标,用PlotS命令画方框。
IDL>Xmin = Min([x1,x2], Max = xmax)
IDL>Ymin = Min([y1,y2], Max = ymax)
最 后,已经为放大对方框内的数据做好了准备。除了正确地设置数据范围外,还必须设置Style关键字。知道为什么吗?如果不知道,可在不使用这两个关键字的 情况下试试下面的命令。将会发生什么呢?
IDL>Plot, curve, XRange = [xmin, xmax], Yrange = [ymin, ymax], $
Xstyle= 1, Ystyle = 1
在 图像上使用Cursor命令
通常当在处理图像数据时使用Cursor命令,希望用设备坐标而不是数据坐标返回光标位置。这是因为设备坐标和图像中 对应的位置之间通常存在一种简单的关系(大多数是一对一的关系)。为了解如何工作的,可用LoadData命令打开360*360的 WorldElevation数据集,键入:
IDL>image = LoadData(7)
显示图像,并装入某些颜色。如 下:
IDL>topColor = !D.Table_Size-1
IDL>LoadCT, 3, Ncolors = !D.Table_Size-1
IDL>TvLCT,255,255,0, TopColor
IDL>Window, XSize = 360, YSize = 360
IDL>TV, BytScl (image, Top = !D.Table_Size-2)
利 用光标在图像中选择某一特定行和列。注意Cursor和PlotS命令中的Device关键字。这是确保返回的坐标是设备坐标而不是数据坐标。在该位置上 画一个十字线。(确保在输入Cursor命令后,在图像窗口中点击一下。)键入:
IDL>S = Size(image)
IDL>Cursor, col, row, / Device; Click in the window!
IDL>Plots, [col, col], [0,s (2) ], / Device, Color = topColor
IDL>Plots, [0,s (1) ], [row, row ], / Device, Color = topColor
注 意,在图像中某一特定的行和列上获得图像数据是多么的容易。例如,可以轻易地绘制出图像中行和列的数据剖面,键入:
IDL>Window, 1, Xsize = 500, Ysize = 300
IDL>!P.Multi = [0, 2, 1]
IDL>Plot, image [*, row], Title =’ Row Profile’
IDL>Plot, image [col, *], Title =’ Column Profile’
IDL>!P.Multi = 0
IDL>Wset, 0
输 出结果类似于图59所示。
在循环中使用Cursor命令
有时想在循环中使用Cursor命令。例如,当用光标选择图像上的单个像素时,可 能想知道它的像素值。下面是个简单的循环程序,它将一直执行下去,直到单击右键或中键退出。打开文本编辑器,准确无误地输入如下代码。
TopColor= !D.Table_Size-1
LoadCT,3, Ncolors = !D.Table_Size-1
TvLCT,255, 255, 0, topColor
TV,BytScl (image, Top =!D.Table_Size-2)
!Mouse.Button= 1
REPEATBEGIN
Cursor,col, row, /Down, /Device
Print,‘Pixel Value:’, image[col,
在上一章节了学习了一些图形显示技 术。在这一章节将学习几个新的图形显示技巧,以便让图形显示具有专业的感观效果。
具体来说,将学会:
1.
2.
3.
4.
将光标用于图形显示
数 据可视化显示的原因之一是用户可用不同的方式对数据进行交互式的操作。用户喜欢的一种对数据交互式操作的方式是使用光标去选择或者标注部分数据。这种交互 作用在IDL中用Cursor命令很容易完成。
用LoadData命令装入Time
IDL>
输 入下述命令,显示曲线:
IDL>
IDL>
IDL>
IDL>
Cursor 命令接受两个参数。这些参数必须是记录鼠标键按下时光标位置的变量。Cursor命令要求光标位于当前图形窗口中。(即被!D.Window
IDL>
如 果打印出这些变量的值,将发现这些值被赋予的是数据坐标空间。xLocation的数值从0到100,yLocation的数值从0到30。(如果是在图 形边界内点击的鼠标,它们至少是这么多。如果不是在图形边界内点击的鼠标会怎么样?)缺省时,Cursor命令返回数据坐标位置。
IDL>
什 么时候返回的光标位置?
从上面的命令看,似乎鼠标键被按下时返回光标位置,但并非总是这样。事实上,Cursor命令什么时候报告光标的位置是由 Cursor命令的关键字所决定的。这些关键字是:
Change
Down
NoWait
UP
Wait
在Cursor命令中,小心使用合适的关键字,特别是在循环过程中使用Cursor命令。用户有时习惯地认为 Cursor命令的缺省属性是只有鼠标键被按下时才返回光标的位置。其实不然,缺省属性只是等待一个单击动作,以后的行为就和NoWait关键字一样。在 循环中这个区别是至关重要的。
哪一个鼠标键和光标共同作用呢?
除了设置光标属性外,有时还想知道哪个鼠标键用于对Cursor命令作出反 应。例如,想要用鼠标左键做某件事,而做另外不同的事情要用鼠标右键
!Mouse.Button
!Mouse.Button
!Mouse.Button
!Mouse.Button
用光标标注图形输出
使用Cursor命令的一种方法是允许用户交互地在线画图上放置符号标记。例如,正确无误地输入下列 命令。当输完最后一个回车键后,在当前的图形窗口上单击鼠标五次。五个符号将放置在窗口中。(如果在输入下列代码时出现打字错误,必须从头开始重新输 入。)输入:
IDL>
IDL>
IDL>
画 方框
有时可能为了选取图形显示中的某部分,而在它的周围画上方框。这里有些命令可用来选择由Cursor命令产生的方框的对角,画出该方框,并将 图形缩放到该方框坐标范围。首先画图:
IDL>
接着,使用光标选择想画的方框的一角。要确保在当前图形窗 口上点击光标。为确定哪个是当前窗口,并让它不被隐藏,可输入:
IDL>
现在键入第一个Cursor命令。在图形轴的 范围内某处点击:
IDL>
接 着输入第二个Cursor命令。在图形轴的范围内某处点击:
IDL>
上 述Cursor命令返回的坐标是数据空间坐标。按如下画方框:
IDL>
输 出结果应类似于图58中所示,尽管实际的图形上方框取决于在窗口中点击的位置。
为了放大这部分图形,必须保证方框坐标的正确顺序。这是非常必要 的,因为可能先选择的是方框的右下角,然后是左上角,这样x1将大于x2。还可以想象其它的假设。为了适应所有的情况,键入:
图58:在部分数据 周围画上方框的线画图。用Cursor命令选择方框的坐标,用PlotS命令画方框。
IDL>
IDL>
最 后,已经为放大对方框内的数据做好了准备。除了正确地设置数据范围外,还必须设置Style关键字。知道为什么吗?如果不知道,可在不使用这两个关键字的 情况下试试下面的命令。将会发生什么呢?
IDL>
Xstyle
在 图像上使用Cursor命令
通常当在处理图像数据时使用Cursor命令,希望用设备坐标而不是数据坐标返回光标位置。这是因为设备坐标和图像中 对应的位置之间通常存在一种简单的关系(大多数是一对一的关系)。为了解如何工作的,可用LoadData命令打开360*360的 World
IDL>
显示图像,并装入某些颜色。如 下:
IDL>
IDL>
IDL>TvLCT,
IDL>
IDL>
利 用光标在图像中选择某一特定行和列。注意Cursor和PlotS命令中的Device关键字。这是确保返回的坐标是设备坐标而不是数据坐标。在该位置上 画一个十字线。(确保在输入Cursor命令后,在图像窗口中点击一下。)键入:
IDL>
IDL>
IDL>
IDL>
注 意,在图像中某一特定的行和列上获得图像数据是多么的容易。例如,可以轻易地绘制出图像中行和列的数据剖面,键入:
IDL>
IDL>
IDL>
IDL>
IDL>
IDL>
输 出结果类似于图59所示。
在循环中使用Cursor命令
有时想在循环中使用Cursor命令。例如,当用光标选择图像上的单个像素时,可 能想知道它的像素值。下面是个简单的循环程序,它将一直执行下去,直到单击右键或中键退出。打开文本编辑器,准确无误地输入如下代码。
TopColor
LoadCT,
TvLCT,
TV,
!Mouse.Button
REPEAT
Cursor,
Print,

加载中…