IDL入门教程五Word文件下载.docx
- 文档编号:17570617
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:20
- 大小:53.37KB
IDL入门教程五Word文件下载.docx
《IDL入门教程五Word文件下载.docx》由会员分享,可在线阅读,更多相关《IDL入门教程五Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
如果不是在图形边界内点击的鼠标会怎么样?
)缺省时,Cursor命令返回数据坐标位置。
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命令的一种方法是允许用户交互地在线画图上放置符号标记。
例如,正确无误地输入下列命令。
当输完最后一个回车键后,在当前的图形窗口上单击鼠标五次。
五个符号将放置在窗口中。
(如果在输入下列代码时出现打字错误,必须从头开始重新输入。
)输入:
Forj=0,4DOBEGIN$
Cursor,xloc,yloc,/DOWN&
$
Plots,xloc,yloc,Psym=4,SymSize=2,Color=1&
ENDFOR
画方框
有时可能为了选取图形显示中的某部分,而在它的周围画上方框。
这里有些命令可用来选择由Cursor命令产生的方框的对角,画出该方框,并将图形缩放到该方框坐标范围。
首先画图:
接着,使用光标选择想画的方框的一角。
要确保在当前图形窗口上点击光标。
为确定哪个是当前窗口,并让它不被隐藏,可输入:
WShow
现在键入第一个Cursor命令。
在图形轴的范围内某处点击:
Cursor,x1,y1,/DOWN;
Selectonecornerofbox.
接着输入第二个Cursor命令。
Cursor,x2,y2,/DOWN;
Selectdiagonalcornerofbox.
上述Cursor命令返回的坐标是数据空间坐标。
按如下画方框:
Plots,[x1,x1,x2,x2,x1],[y1,y2,y2,y1,y1],color=1
输出结果应类似于图58中所示,尽管实际的图形上方框取决于在窗口中点击的位置。
为了放大这部分图形,必须保证方框坐标的正确顺序。
这是非常必要的,因为可能先选择的是方框的右下角,然后是左上角,这样x1将大于x2。
还可以想象其它的假设。
为了适应所有的情况,键入:
图58:
在部分数据周围画上方框的线画图。
用Cursor命令选择方框的坐标,用PlotS命令画方框。
Xmin=Min([x1,x2],Max=xmax)
Ymin=Min([y1,y2],Max=ymax)
最后,已经为放大对方框内的数据做好了准备。
除了正确地设置数据范围外,还必须设置<
XY>
Style关键字。
知道为什么吗?
如果不知道,可在不使用这两个关键字的情况下试试下面的命令。
将会发生什么呢?
Plot,curve,XRange=[xmin,xmax],Yrange=[ymin,ymax],$
Xstyle=1,Ystyle=1
在图像上使用Cursor命令
通常当在处理图像数据时使用Cursor命令,希望用设备坐标而不是数据坐标返回光标位置。
这是因为设备坐标和图像中对应的位置之间通常存在一种简单的关系(大多数是一对一的关系)。
为了解如何工作的,可用LoadData命令打开360*360的WorldElevation数据集,键入:
image=LoadData(7)
显示图像,并装入某些颜色。
如下:
topColor=!
D.Table_Size-1
LoadCT,3,Ncolors=!
TvLCT,255,255,0,TopColor
Window,XSize=360,YSize=360
TV,BytScl(image,Top=!
D.Table_Size-2)
利用光标在图像中选择某一特定行和列。
注意Cursor和PlotS命令中的Device关键字。
这是确保返回的坐标是设备坐标而不是数据坐标。
在该位置上画一个十字线。
(确保在输入Cursor命令后,在图像窗口中点击一下。
)键入:
S=Size(image)
Cursor,col,row,/Device;
Clickinthewindow!
Plots,[col,col],[0,s
(2)],/Device,Color=topColor
Plots,[0,s
(1)],[row,row],/Device,Color=topColor
注意,在图像中某一特定的行和列上获得图像数据是多么的容易。
例如,可以轻易地绘制出图像中行和列的数据剖面,键入:
Window,1,Xsize=500,Ysize=300
P.Multi=[0,2,1]
Plot,image[*,row],Title=’RowProfile’
Plot,image[col,*],Title=’ColumnProfile’
P.Multi=0
Wset,0
输出结果类似于图59所示。
在循环中使用Cursor命令
有时想在循环中使用Cursor命令。
例如,当用光标选择图像上的单个像素时,可能想知道它的像素值。
下面是个简单的循环程序,它将一直执行下去,直到单击右键或中键退出。
打开文本编辑器,准确无误地输入如下代码。
TopColor=!
TvLCT,255,255,0,topColor
TV,BytScl(image,Top=!
Mouse.Button=1
REPEATBEGIN
Cursor,col,row,/Down,/Device
Print,‘PixelValue:
’,image[col,row]
ENDREPUNTIL!
Mouse.ButtonNE1
END
图59:
用Cursor命令在图像中选择的行和列的剖面。
保存到loop1.pro文件中(此文件已经存在于下载的本书配套程序之中)。
编译,并运行这个小主程序,输入:
.RUNloop1
移动光标进入图像窗口,开始单击左键。
图像像素值就会出现在日志窗口中,直到点击其它键,而不是左键。
如果在Cursor命令中使用除了Down之外的其它关键字会发生什么呢?
实验一下,找出答案。
从显示中删除注释
当使用光标在图形显示上按照刚才使用的方法来添加注释时,也许会问:
“怎样才能删除刚放置在那儿的注释呢?
”有两种较好的方法删除注释。
称之为异或法和设备拷贝法。
笔者认为在两者之中设备拷贝法更能给出专业的感观效果。
两种方法都列举出来,但重点将集中在设备拷贝法上。
删除注释的异或法
异或法是在图形函数的基础上起作用的。
图形函数是两个数的位操作。
这两个数分别与已经显示出来的像素(称作所谓的目标像素)以及希望放置在同一位置的像素(称作所谓的源像素)相关联。
通常,IDL使用的图形函数称作源。
在这种图形函数里,IDL忽略了目标像素的值,仅仅在该像素位置上放置源像素的值。
但如果这种图形函数变成XOR(异或法),IDL将目标像素和源像素进行逐位比较。
这会产生反向目标像素的效果。
换句话说,如果像素的二进制表示为01100101,那么执行XOR命令后,像素的二进制表示为。
(实际的XOR过程远比这复杂,因为只有IDL在颜色索引表中的邻近位置上有256种颜色时,它才按这种方式运行,而这是一种少见的情形。
大多数人只是认为XOR法是用“相反的”颜色画,并保留原来的。
在实际的XOR法中,可能预测将会使用哪种颜色来画,但在大多数情形下并不是这样。
这就是为什么绝大多数IDL专业程序员宁愿采用设备拷贝法。
)
在任何时侯,图形函数的作用效果都是由Device命令和Set_Graphics_Function关键字设置的。
源模式下图形函数为3。
XOR模式下图形函数为6。
此时IDL处于系统缺省的源模式下。
当处于这种模式时,重新显示图像窗口中的图像。
现在,选择XOR模式:
Device,Set_Graphics_Function=6
在图像中画一个方框:
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命令很容易完成。
可以反复执行上面的命令,让方框随心所欲地出现或消失。
在继续下面的练习前,确保将图形函数设回到源模式。
键入:
Device,Set_Graphics_Function=3
在IDL程序中可容易地利用图形函数。
例如,打开以前写的loop1.pro主程序,按如下修改它。
这个程序将在图像窗口中每次点击的位置上画一个大的十字线。
以loop2.pro命名保存程序。
LoadCT,3,NColors=!
TvLCT,255,255,0,topColor
TV,BytScl(image,Top=!
!
;
GointoXORmode.
Device,Set_Graphics_Function=6
Getinitialcursorlocation.Drawcross-hair.
Cursor,col,row,/Device,/Down
PlotS,[col,col],[0,360],/Device,Color=topColor
PlotS,[0,360],[row,row],/Device,Color=topColor
Print,'
PixelValue:
'
image[col,row]
Loop.
REPEATBEGIN
Getnewcursorlocation.
Cursor,colnew,rownew,/Down,/Device
Eraseoldcross-hair.
PlotS,[col,col],[0,360],/Device,Color=topColor
PlotS,[0,360],[row,row],/Device,Color=topColor
Print,'
image(colnew,rownew)
Drawnewcross-hair.
PlotS,[colnew,colnew],[0,360],/Device,Color=topColor
PlotS,[0,360],[rownew,rownew],/Device,Color=topColor
Updatecoordinates.
col=colnew
row=rownew
ENDREPUNTIL!
;
Erasethefinalcross-hair.
Restorenormalgraphicsfunction.
Device,Set_Graphics_Function=3
保存到文件loop2.pro中。
(此文件已经存在于下载的本书配套程序之中。
)编译,并执行这个主程序,键入:
.RUNloop2
将光标放在图像窗口中,点击左键数次。
在每个光标位置上应该有一个十字线。
按右键或中间键终止程序。
删除注释的设备拷贝法
设备拷贝法利用像素映射窗口来删除已显示屏幕上的注释。
像素映射窗口和其它IDL图形窗口完全一样,除了它不显示在显示器上外。
事实上,它存在于显示设备的视频随机存储器中。
换句话说,它存在于存储器中。
从其它任何方面来说,它就象一个正常的IDL图形窗口一样:
可用Window命令创建,用WSet命令激活,用WDelete命令删除,等等。
在像素映射窗口内画图和在IDL正常的图形窗口内画图是完全一样的(例如,用Plot、Surface、TV和其它图形输出命令)。
设备拷贝技术就是从一个窗口(称为源窗口)拷贝一个矩形区,然后将矩形区传入另一个窗口(称为目的窗口)。
源窗口和目的窗口有时可以是同一个窗口,这点等会会看到。
图60是设备拷贝技术的图解。
实际的拷贝是通过Device命令和Copy关键字(设备拷贝技术的名字由此而来)完成。
命令的一般形式如下:
Device,Copy=[sx,sy,col,row,dx,dy,sourceWindowID]
在这个命令中,Copy关键字的组成元素是:
sx,sy源窗口矩形区左下角的设备坐标(矩形区是从源窗口拷贝的)
col从源窗口中拷贝的列数。
这是矩形区的宽度。
row从源窗口中拷贝的行数。
这是矩形区的高度。
dx,dy目标窗口中矩形区左下角的设备坐标。
(目标窗口是要将矩形区拷贝到的窗口。
目标窗口总是当前图形窗口。
sourceWindowID源窗口的窗口索引号。
矩形区从此窗口拷贝到当前图形窗口(由!
D.Window系统变量指定)。
源窗口可以是当前图形窗口,但多数情况下它是一个非当前图形窗口的窗口。
它通常是一个像素映射窗口。
要看其是如何工作的,先创建一个像素映射窗口,在里面显示一幅图像。
用带Pixmap关键字的Window命令来创建像素映射窗口,键入:
Window,1,/Pixmap,XSize=360,YSize=360
图60:
设备拷贝技术是将源窗口的一个矩形区拷贝到目标窗口的某个位置。
实际上可以拷贝整个窗口,而且源窗口和目标窗口可以是同一个窗口。
注意,当输入这些命令时没有任何可见的线索表明发生了什么。
这是因为像素映射窗口仅存在于视频随机存储器中,而不是在显示屏上。
为证明这个窗口内存有的内容,可打开第三个窗口,并将像素映射窗口的内容拷贝到第三个窗口中。
如果第三个窗口看起来象原来的图像窗口,那么已经输入的命令是正确的。
Window,2,Xsize=360,Ysize=360
Device,Copy=[0,0,360,360,0,0,1]
注意,已将像素映射窗口的全部内容拷贝到这个新的窗口中。
这种操作除了在速度上快几个数量级之外,其它方面与在此新窗口中重新显示图像类似了。
将像素映射窗口中的全部内容拷贝到了新的显示窗口是一种常见的做法,即使只是修改部分的显示窗口。
删除最后创建的两个窗口(包括像素映射窗口),如下:
Wdelete,1,2
当对像素映射窗口操作完成后,删除它们是很重要的。
它们会占用存储空间,这些存储空间可用于其它用途。
某些窗口管理器为这些像素映射窗口分配一个定量的存储空间。
如果像素映射窗口超过了视频存储器的容量,可以使用虚拟内存。
X终端给像素映射窗口留有非常小的存储空间。
要了解设备拷贝技术在实际中是如何运用的,修改主程序以前写的主程序文件loop2.pro。
可以拷贝到另一个文件,以loop3.pro命名。
修改代码如下:
Createapixmapwindowanddisplayimageinit.
Window,1,/Pixmap,Xsize=360,Ysize=360
Makethedisplaywindowthecurrentgraphicswindow.
Cursor,col,row,/Device,/Down
Plots,[col,col],[0,360],/Device,Color=topColor
Plots,[0,360],[row,row],/Device,Color=topColor
REPEATBEGIN
Cursor,colnew,rownew,/Device,/Down
Eraseoldcross-hair
Device,Copy=[0,0,360,360,0,0,1]
’,image[colnew,rownew]
Plots,[colnew,colnew],[0,360],/Device,Color=topColor
Plots,[0,360],[rownew,rownew],/Device,Color=topColor
Erasethefinalcross-hair.
END
以loop3.pro命名存档。
(此文件已经存在于下载的本书配套程序之中)编辑,并运行主程序,输入:
.RUNloop3
放置光标于图像窗口中,点击左键数次。
单击右或中间键终止程序。
注意十字线是用黄色绘制。
在继续下一次练习之前,删除像素映射窗口。
Wdelete,1
画一个橡皮筋方框
设备拷贝技术非常适用于在屏幕上画橡皮条选择方框和其它形状。
(橡皮条方框是指一角固定,另一角随着光标的变化而变化的方框)。
事实上,修改程序loop3.pro可以很容
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IDL 入门教程