




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第五章圖形顯示技巧本章概要在上一章節(jié)了學習了一些圖形顯示技術。在這一章節(jié)將學習幾個新的圖形顯示技巧,以便讓圖形顯示具有專業(yè)的感觀效果。具體來說,將學會:1. 怎樣讓鼠標交互作用于圖形顯示2. 怎樣從圖形顯示中刪除注釋3. 怎樣在圖形顯示上畫“橡皮條”4. 怎樣在圖形顯示技巧中使用Z圖形緩沖區(qū)將光標用于圖形顯示數(shù)據(jù)可視化顯示的原因之一是用戶可用不同的方式對數(shù)據(jù)進行交互式的操作。用戶喜歡的一種對數(shù)據(jù)交互式操作的方式是使用光標去選擇或者標注部分數(shù)據(jù)。這種交互作用在IDL中用Cursor命令很容易完成。用LoadData命令裝入Time Series數(shù)據(jù)集,可看到Cursor命令是如何工作的。 IDL
2、> curve = LoadData (1)輸入下述命令,顯示曲線: IDL> Window, Xsize = 400, Ysize = 400 IDL> LoadCT, 0 IDL> TvLCT, 255,255,0,1 IDL> Plot, curveCursor命令接受兩個參數(shù)。這些參數(shù)必須是記錄鼠標鍵按下時光標位置的變量。Cursor命令要求光標位于當前圖形窗口中。(即被!D.Window系統(tǒng)變量指向的窗口。)例如,如果輸入這個命令,IDL將會等待光標被移動到當前圖形窗口(如果輸入的是上述命令,就是0號索引窗口)并單擊鼠標鍵。當執(zhí)行上述動作后,IDL將光標
3、位置返回到變量xLocation和yLocation中。輸入: IDL> Cursor, xLocation, yLocation如果打印出這些變量的值,將發(fā)現(xiàn)這些值被賦予的是數(shù)據(jù)坐標空間。xLocation的數(shù)值從0到100,yLocation的數(shù)值從0到30。(如果是在圖形邊界內(nèi)點擊的鼠標,它們至少是這么多。如果不是在圖形邊界內(nèi)點擊的鼠標會怎么樣?)缺省時,Cursor命令返回數(shù)據(jù)坐標位置。 IDL> Print, xLocation, yLocation什么時候返回的光標位置?從上面的命令看,似乎鼠標鍵被按下時返回光標位置,但并非總是這樣。事實上,Cursor命令什么時候報告
4、光標的位置是由Cursor命令的關鍵字所決定的。這些關鍵字是: Change 當光標位置發(fā)生改變或用戶移動光標時,返回光標位置。 Down 當鼠標鍵被按下時,返回光標位置。 NoWait 當Cursor命令執(zhí)行時,光標位置被立即返回。沒有任何延遲或等待鼠標的按鍵。這個關鍵字有時用于當對象正在顯示窗口中被移動時的循環(huán)中。 UP 不是在鼠標鍵被按下時,而是放開或釋放后返回光標位置。 Wait Cursor命令等待鼠標鍵被按下后返回光標的位置。只要鼠標鍵被按下,此關鍵字對Cursor命令的作用就類似于用NoWait關鍵字調(diào)用Cursor命令。此關鍵字是Cursor命令的缺省狀態(tài)。在Cursor命令中
5、,小心使用合適的關鍵字,特別是在循環(huán)過程中使用Cursor命令。用戶有時習慣地認為Cursor命令的缺省屬性是只有鼠標鍵被按下時才返回光標的位置。其實不然,缺省屬性只是等待一個單擊動作,以后的行為就和NoWait關鍵字一樣。在循環(huán)中這個區(qū)別是至關重要的。哪一個鼠標鍵和光標共同作用呢?除了設置光標屬性外,有時還想知道哪個鼠標鍵用于對Cursor命令作出反應。例如,想要用鼠標左鍵做某件事,而做另外不同的事情要用鼠標右鍵Cursor命令作出的反應??梢詸z查系統(tǒng)變量!Mouse中的Button字段,來判斷哪一個鼠標鍵在和Cursor命令共同作用。(老版本的IDL是用系統(tǒng)變量!Err的值來判斷的。)這個
6、字段是一個整型位映象。Button這個字段的有效值及其意義如下: !Mouse.Button = 0 當前沒有按鍵被使用 !Mouse.Button = 1 左鍵用于Cursor命令 !Mouse.Button = 2 中間鍵用于Cursor命令 !Mouse.Button = 4 右鍵用于Cursor命令用光標標注圖形輸出使用Cursor命令的一種方法是允許用戶交互地在線畫圖上放置符號標記。例如,正確無誤地輸入下列命令。當輸完最后一個回車鍵后,在當前的圖形窗口上單擊鼠標五次。五個符號將放置在窗口中。(如果在輸入下列代碼時出現(xiàn)打字錯誤,必須從頭開始重新輸入。)輸入: IDL> For j
7、 = 0, 4 DO BEGIN $ IDL> Cursor, xloc, yloc, /DOWN & $ IDL> Plots, xloc, yloc, Psym = 4, SymSize = 2, Color = 1 & ENDFOR畫方框有時可能為了選取圖形顯示中的某部分,而在它的周圍畫上方框。這里有些命令可用來選擇由Cursor命令產(chǎn)生的方框的對角,畫出該方框,并將圖形縮放到該方框坐標范圍。首先畫圖: IDL> Plot, curve接著,使用光標選擇想畫的方框的一角。要確保在當前圖形窗口上點擊光標。為確定哪個是當前窗口,并讓它不被隱藏,可輸入: ID
8、L> WShow現(xiàn)在鍵入第一個Cursor命令。在圖形軸的范圍內(nèi)某處點擊: IDL> Cursor, x1,y1, /DOWN; Select one corner of box.接著輸入第二個Cursor命令。在圖形軸的范圍內(nèi)某處點擊: IDL> Cursor, x2,y2, /DOWN; Select diagonal corner of box.上述Cursor命令返回的坐標是數(shù)據(jù)空間坐標。按如下畫方框: IDL> Plots, x1,x1,x2,x2,x1,y1,y2,y2,y1,y1, color = 1輸出結果應類似于圖58中所示,盡管實際的圖形上方框取決于
9、在窗口中點擊的位置。為了放大這部分圖形,必須保證方框坐標的正確順序。這是非常必要的,因為可能先選擇的是方框的右下角,然后是左上角,這樣x1將大于x2。還可以想象其它的假設。為了適應所有的情況,鍵入:圖58:在部分數(shù)據(jù)周圍畫上方框的線畫圖。用Cursor命令選擇方框的坐標,用PlotS命令畫方框。 IDL> Xmin = Min(x1,x2, Max = xmax) IDL> Ymin = Min(y1,y2, Max = ymax)最后,已經(jīng)為放大對方框內(nèi)的數(shù)據(jù)做好了準備。除了正確地設置數(shù)據(jù)范圍外,還必須設置<XY>Style關鍵字。知道為什么嗎?如果不知道,可在不使用
10、這兩個關鍵字的情況下試試下面的命令。將會發(fā)生什么呢? IDL> Plot, curve, XRange = xmin, xmax, Yrange = ymin, ymax, $ Xstyle = 1, Ystyle = 1 在圖像上使用Cursor命令通常當在處理圖像數(shù)據(jù)時使用Cursor命令,希望用設備坐標而不是數(shù)據(jù)坐標返回光標位置。這是因為設備坐標和圖像中對應的位置之間通常存在一種簡單的關系(大多數(shù)是一對一的關系)。為了解如何工作的,可用LoadData命令打開360*360的World Elevation數(shù)據(jù)集,鍵入: IDL> image = LoadData(7)顯示圖像
11、,并裝入某些顏色。如下: 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關鍵字。這是確保返回的坐標是設備坐標而不是數(shù)據(jù)坐標。在該位置上畫一個十字線。(確保
12、在輸入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注意,在圖像中某一特定的行和列上獲得圖像數(shù)據(jù)是多么的容易。例如,可以輕易地繪制出圖像中行和列的數(shù)據(jù)剖面,鍵入: IDL> Wi
13、ndow, 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所示。在循環(huán)中使用Cursor命令有時想在循環(huán)中使用Cursor命令。例如,當用光標選擇圖像上的單個像素時,可能想知道它的像素值。下面是個簡單的循環(huán)程序,它將一直執(zhí)行下去,直到單擊右鍵或中
14、鍵退出。打開文本編輯器,準確無誤地輸入如下代碼。 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 REPEAT BEGIN Cursor, col, row, /Down, /Device Print, Pixel Value:, imagecol, row ENDREP UNTIL !Mouse.Button NE 1END圖59:用Cur
15、sor命令在圖像中選擇的行和列的剖面。保存到文件中(此文件已經(jīng)存在于下載的本書配套程序之中)。編譯,并運行這個小主程序,輸入: IDL> .RUN loop1移動光標進入圖像窗口,開始單擊左鍵。圖像像素值就會出現(xiàn)在日志窗口中,直到點擊其它鍵,而不是左鍵。如果在Cursor命令中使用除了Down之外的其它關鍵字會發(fā)生什么呢?實驗一下,找出答案。從顯示中刪除注釋當使用光標在圖形顯示上按照剛才使用的方法來添加注釋時,也許會問:“怎樣才能刪除剛放置在那兒的注釋呢?”有兩種較好的方法刪除注釋。稱之為異或法和設備拷貝法。筆者認為在兩者之中設備拷貝法更能給出專業(yè)的感觀效果。兩種方法都
16、列舉出來,但重點將集中在設備拷貝法上。刪除注釋的異或法異或法是在圖形函數(shù)的基礎上起作用的。圖形函數(shù)是兩個數(shù)的位操作。這兩個數(shù)分別與已經(jīng)顯示出來的像素(稱作所謂的目標像素)以及希望放置在同一位置的像素(稱作所謂的源像素)相關聯(lián)。通常,IDL使用的圖形函數(shù)稱作源。在這種圖形函數(shù)里,IDL忽略了目標像素的值,僅僅在該像素位置上放置源像素的值。但如果這種圖形函數(shù)變成XOR(異或法),IDL將目標像素和源像素進行逐位比較。這會產(chǎn)生反向目標像素的效果。換句話說,如果像素的二進制表示為01100101,那么執(zhí)行XOR命令后,像素的二進制表示為10011010。(實際的XOR過程遠比這復雜,因為只有IDL在顏
17、色索引表中的鄰近位置上有256種顏色時,它才按這種方式運行,而這是一種少見的情形。大多數(shù)人只是認為XOR法是用“相反的”顏色畫,并保留原來的。在實際的XOR法中,可能預測將會使用哪種顏色來畫,但在大多數(shù)情形下并不是這樣。這就是為什么絕大多數(shù)IDL專業(yè)程序員寧愿采用設備拷貝法。)在任何時侯,圖形函數(shù)的作用效果都是由Device命令和Set_Graphics_Function關鍵字設置的。源模式下圖形函數(shù)為3。XOR模式下圖形函數(shù)為6。此時IDL處于系統(tǒng)缺省的源模式下。當處于這種模式時,重新顯示圖像窗口中的圖像。輸入: IDL> TV, BytScl (image, Top =!D.Tabl
18、e_Size-2)現(xiàn)在,選擇XOR模式: IDL> Device, Set_Graphics_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注意,方框線的顏色不是預測的黃色。取而代之是多彩的,盡管它顯得也很合理。在這個模式下線下的像素已經(jīng)被翻轉(zhuǎn)了。要刪除方框,只須將底下的像素值翻轉(zhuǎn)回它們的原值。再次用PlotS命令很容易完成。 IDL> Plots, 0.2, 0.2, 0.8, 0.8, 0.2,
19、Color = topColor,$ 0.2, 0.8, 0.8, 0.2, 0.2, /Normal可以反復執(zhí)行上面的命令,讓方框隨心所欲地出現(xiàn)或消失。在繼續(xù)下面的練習前,確保將圖形函數(shù)設回到源模式。鍵入: IDL> Device, Set_Graphics_Function = 3 在IDL程序中可容易地利用圖形函數(shù)。例如,打開以前寫的主程序,按如下修改它。這個程序?qū)⒃趫D像窗口中每次點擊的位置上畫一個大的十字線。以命名保存程序。鍵入: topColor = !D.Table_Size-1LoadCT, 3, NColors=!D.Table_Siz
20、e-1TvLCT, 255, 255, 0, topColorTV, BytScl(image, Top=!D.Table_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
21、=topColorPrint, 'Pixel Value: ', imagecol, row ; Loop.REPEAT BEGIN ; Get new cursor location. Cursor, colnew, rownew, /Down, /Device ; Erase old cross-hair. PlotS, col,col, 0,360, /Device, Color=topColor PlotS, 0,360, row,row, /Device, Color=topColor Print, 'Pixel Value: ', image(col
22、new, rownew) ; Draw new cross-hair. PlotS, colnew,colnew, 0,360, /Device, Color=topColor PlotS, 0,360, rownew,rownew, /Device, Color=topColor ; Update coordinates. col = colnew row = rownewENDREP UNTIL !Mouse.Button NE 1 ;Erase the final cross-hair.PlotS, col,col, 0,360, /Device, Color=topColorPlotS
23、, 0,360, row,row, /Device, Color=topColor ; Restore normal graphics function.Device, Set_Graphics_Function=3END保存到文件中。(此文件已經(jīng)存在于下載的本書配套程序之中。)編譯,并執(zhí)行這個主程序,鍵入: IDL> .RUN loop2將光標放在圖像窗口中,點擊左鍵數(shù)次。在每個光標位置上應該有一個十字線。按右鍵或中間鍵終止程序。刪除注釋的設備拷貝法設備拷貝法利用像素映射窗口來刪除已顯示屏幕上的注釋。像素映射窗口和其它IDL圖形窗口完全一樣,除了它不顯示在顯示器上外。
24、事實上,它存在于顯示設備的視頻隨機存儲器中。換句話說,它存在于存儲器中。從其它任何方面來說,它就象一個正常的IDL圖形窗口一樣:可用Window命令創(chuàng)建,用WSet命令激活,用WDelete命令刪除,等等。在像素映射窗口內(nèi)畫圖和在IDL正常的圖形窗口內(nèi)畫圖是完全一樣的(例如,用Plot、Surface、TV和其它圖形輸出命令)。設備拷貝技術就是從一個窗口(稱為源窗口)拷貝一個矩形區(qū),然后將矩形區(qū)傳入另一個窗口(稱為目的窗口)。源窗口和目的窗口有時可以是同一個窗口,這點等會會看到。圖60是設備拷貝技術的圖解。實際的拷貝是通過Device命令和Copy關鍵字(設備拷貝技術的名字由此而來)完成。命令
25、的一般形式如下: Device, Copy = sx, sy, col, row, dx, dy, sourceWindowID在這個命令中,Copy關鍵字的組成元素是: sx, sy 源窗口矩形區(qū)左下角的設備坐標(矩形區(qū)是從源窗口拷貝的) col 從源窗口中拷貝的列數(shù)。這是矩形區(qū)的寬度。 row 從源窗口中拷貝的行數(shù)。這是矩形區(qū)的高度。dx, dy 目標窗口中矩形區(qū)左下角的設備坐標。(目標窗口是要將矩形區(qū)拷貝到的窗口。目標窗口總是當前圖形窗口。) sourceWindowID 源窗口的窗口索引號。矩形區(qū)從此窗口拷貝到當前圖形窗口(由!D.Window系統(tǒng)變量指定)。源窗口可以是當前圖形窗口,
26、但多數(shù)情況下它是一個非當前圖形窗口的窗口。它通常是一個像素映射窗口。 要看其是如何工作的,先創(chuàng)建一個像素映射窗口,在里面顯示一幅圖像。用帶Pixmap關鍵字的Window命令來創(chuàng)建像素映射窗口,鍵入: IDL> Window, 1, /Pixmap, XSize = 360, YSize = 360源窗口 目標窗口(sx,sy) colrow(dx,dy) IDL> TV, BytScl (image, Top =!D.Table_Size-2)圖60:設備拷貝技術是將源窗口的一個矩形區(qū)拷貝到目標窗口的某個位置。實際上可以拷貝整個窗口,而且源窗口和目標窗口可以是同一個窗口。注意,當
27、輸入這些命令時沒有任何可見的線索表明發(fā)生了什么。這是因為像素映射窗口僅存在于視頻隨機存儲器中,而不是在顯示屏上。為證明這個窗口內(nèi)存有的內(nèi)容,可打開第三個窗口,并將像素映射窗口的內(nèi)容拷貝到第三個窗口中。如果第三個窗口看起來象原來的圖像窗口,那么已經(jīng)輸入的命令是正確的。鍵入: IDL> Window, 2, Xsize = 360, Ysize = 360 IDL> Device, Copy =0, 0, 360, 360, 0, 0, 1 注意,已將像素映射窗口的全部內(nèi)容拷貝到這個新的窗口中。這種操作除了在速度上快幾個數(shù)量級之外,其它方面與在此新窗口中重新顯示圖像類似了。將像素映射窗
28、口中的全部內(nèi)容拷貝到了新的顯示窗口是一種常見的做法,即使只是修改部分的顯示窗口。 刪除最后創(chuàng)建的兩個窗口(包括像素映射窗口),如下: IDL> Wdelete, 1, 2當對像素映射窗口操作完成后,刪除它們是很重要的。它們會占用存儲空間,這些存儲空間可用于其它用途。某些窗口管理器為這些像素映射窗口分配一個定量的存儲空間。如果像素映射窗口超過了視頻存儲器的容量,可以使用虛擬內(nèi)存。X終端給像素映射窗口留有非常小的存儲空間。要了解設備拷貝技術在實際中是如何運用的,修改主程序以前寫的主程序文件??梢钥截惖搅硪粋€文件,以命名。修改代碼如下: TopColor =
29、 !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 ; Create a pixmap window and display image in it. Window, 1, /Pixmap, Xsize = 360, Ysize = 360 TV, BytScl (image, Top =!D.Table_Size-2) ; Make the display win
30、dow the current graphics window. Wset, 0 ; Get initial cursor location. Draw cross-hair. Cursor, col, row, /Device, /Down Plots, col, col, 0, 360 , / Device, Color = topColor Plots, 0, 360 , row, row , / Device, Color = topColor Print, Pixel Value:, imagecol, row ; Loop. REPEAT BEGIN ; Get new curso
31、r location. Cursor, colnew, rownew, /Device, /Down ; Erase old cross-hair Device, Copy = 0, 0, 360, 360, 0, 0, 1 Print, Pixel Value:, imagecolnew, rownew ; Draw new cross-hair. Plots, colnew, colnew, 0, 360 , / Device, Color = topColor Plots, 0, 360 , rownew, rownew , / Device, Color = topColor ENDR
32、EP UNTIL !Mouse.Button NE 1 ; Erase the final cross-hair. Device, Copy = 0, 0, 360, 360, 0, 0, 1 END 以命名存檔。(此文件已經(jīng)存在于下載的本書配套程序之中)編輯,并運行主程序,輸入: IDL> .RUN loop3 放置光標于圖像窗口中,點擊左鍵數(shù)次。單擊右或中間鍵終止程序。注意十字線是用黃色繪制。在繼續(xù)下一次練習之前,刪除像素映射窗口。輸入: IDL> Wdelete, 1畫一個橡皮筋方框設備拷貝技術非常適用于在屏幕上畫橡皮條選擇方框和其它形狀。(橡皮條方框是指一
33、角固定,另一角隨著光標的變化而變化的方框)。事實上,修改程序可以很容易實現(xiàn)。將拷貝到文件。(文件已經(jīng)存在于下載的本書配套程序之中。)作如下修改,看看創(chuàng)建一個橡皮條方框是多么容易。 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 a
34、nd 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.WSet, 0 ; Get initial cursor location (static corner of box).Cursor, sx, sy, /Device, /Down ; Loop.REPEAT BEGIN ; Get new cursor location (dynami
35、c 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, 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>
36、.RUN rubberbox在繼續(xù)下一次練習之前,刪除像素映射窗口。輸入: IDL> Wdelete,1圖形窗口的滾動設備拷貝技術的另一個有效應用是實現(xiàn)圖形窗口的滾動。在這個示例中將運用設備拷貝技術讓圖形顯示窗口中的圖像滾動起來。圖像從左至右每次滾動四列。使用的算法如下:(1)將窗口右邊最后四列拷貝到一個僅有四列寬和360行高的小像素映射窗口。(2)將整個顯示窗口的內(nèi)容(減去已經(jīng)拷貝的四列)在同一窗口(也就是說,源窗口和目標窗口是同一個窗口)內(nèi)向右邊移動四列。(3)將像素映射窗口的內(nèi)容拷貝到顯示窗口左邊頭四列。打開文本編輯器,輸入下列命令。以命名(此文件已經(jīng)存在于下載
37、的本書配套程序之中)。 ; 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 of 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, Co
38、py=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程序每次滾動一次。再次運行程序,輸入: IDL> .Go能修改程序讓它一直滾動,直到讓它停止嗎?在繼續(xù)下一次練習之前刪除像素映射窗口。輸入:IDL> Wdelete,1Z圖形緩沖區(qū)中的圖形顯示技巧Z圖形緩沖區(qū)可以把IDL中的Z圖形緩沖區(qū)想象成一個三維盒子,3D對象可以被堆積在里面而不用關心
39、它們的“實體”性質(zhì)。這個盒子能用16位深度緩沖區(qū)來記錄每個對象的深度。盒子的一邊是投影平面??梢韵胂蠊饩€通過投影平面的每一個像素最終遇到盒子內(nèi)實體對象。光線遇到的像素值就是投影到投影平面的值。用這種方法,Z圖形緩沖區(qū)就可以處理曲面和線條的自動消隱。圖61就是此概念的圖解說明。圖61:Z圖形緩沖區(qū)可以被想象作一個能保留深度信息的3D盒子。光線射到Z圖形緩沖區(qū)中的物體時,它們的像素值反過來被投影到投影平面上。其概念是,當物體被裝入三維盒子里時,就可以得到投影平面的一幅快照或一幅圖像。這是盒子中三維物體的二維投影。處在其它物體后面的物體就不被顯示。(這種屬性可以在一些IDL圖形命令中用Transpa
40、rent關鍵字來改變,以后將會看到。)快照實際上就是利用TVRD命令對投影平面的屏幕轉(zhuǎn)儲。Z圖形緩沖區(qū)的實現(xiàn)在IDL中,Z圖形緩沖區(qū)是用軟件方式作為另一中圖形輸出設備實現(xiàn)的,類似于PostScript設備或X窗口,Win或Mac設備。因此,要在Z圖形緩沖區(qū)中畫圖形,必須用Sep_Plot命令將其變成當前的圖形輸出設備。和其它圖形輸出設備一樣,Z圖形緩沖區(qū)可用Device命令和適當?shù)年P鍵字來配置。常用于Z圖形緩沖區(qū)的兩個關鍵字是Set_Colors和Set_Resolution。這兩個關鍵字定義如下:Set_Colors Z圖形緩沖區(qū)中的顏色數(shù)。在缺省情況下,Z圖形緩沖區(qū)使用256種顏色。在ID
41、L運行中,這是個非常少的顏色數(shù)目。如果希望Z圖形緩沖區(qū)的輸出具有和顯示設備相同的顏色數(shù)目,就須設置這個關鍵字。Set_Resolution Z圖形緩沖區(qū)投影平面通常設置為640像素寬和480像素高。如果要在圖形窗口顯示Z圖形緩沖區(qū)的輸出結果,就應該將Z圖形緩沖區(qū)的大小設置成圖形窗口的大小。例如:DEVICE, Set_Resolution=400,400一個Z圖形緩沖區(qū)實例:兩個曲面要了解Z圖形緩沖區(qū)是怎樣工作的,先按如下創(chuàng)建兩個名為peak和saddle的物體。(完成此例的命令可以在下載的本書配套程序中的文件中找到。)IDL>peak=shift(dist(20,
42、16),10,8)IDL>peak=Exp(-(peak/5)2)IDL>saddle=shift(peak,6,0)+shift(peak,-6,0)/2B要在Z圖形緩沖區(qū)中組合兩個3D物體,首先看看這兩個物體的各自形狀??梢宰屗鼈冊趦蓚€窗口中以不同的顏色表顯示。首先,在顏色查詢表中的不同部位裝入藍色和紅色色譜表:IDL>colors=!D.Table_Size/2IDL>LoadCT, 1, ncolors=colorsIDL>LoadCT, 3, ncolors=colors, Bottom=colors-1 創(chuàng)建一個窗口,顯示第一個物體的陰影曲面圖。要注意
43、的是,Set_shading 命令是用來將陰影處理的值限制在顏色查詢表中特定部位。鍵入:IDL>window, 1, xsize=300, ysize=300IDL>set_shading, value=0,coloe-1IDL>shade_surf, peak, zrange=0.0,1.2接著將第二物體顯示在它自己的顯示窗口中。用顏色查詢表的不同部位作為陰影處理參數(shù)。鍵入:IDL>window, 2, xsize=300,ysize=300IDL>set_shading, value=colors, 2*colors-1IDL>shade_surf, s
44、addle, zrange=0.0,1.2使Z圖形緩沖區(qū)成為當前設備為了在Z圖形緩沖區(qū)中組合兩個物體,必須使Z圖形緩沖區(qū)成為當前的圖形顯示設備。這可用Set_Plot命令來實現(xiàn)。Copy這個關鍵字可將當前的顏色表復制到Z緩沖區(qū)中。保存當前圖形顯示設備的名字,以便能方便地返回。鍵入:IDL>thisDevice=!D.NameIDL>Set_Plot,z,/Copy配置Z圖形緩沖區(qū)接下來,必須將Z圖形設備配置成具體的規(guī)格。在這個例子中,要限制顏色的數(shù)目,還要使緩沖區(qū)的分辨率與當前圖形顯示窗口尺寸相等。鍵入:IDL>Device,Set_colors=2*colors, Set_
45、Resolution=300,300將物體裝入到Z圖形緩沖區(qū)中現(xiàn)在,將兩個物體裝入到Z圖形緩沖區(qū)中。要注意的是,鍵入這些命令時,將看不到任何事發(fā)生。因為輸出已進入內(nèi)存中的Z圖形緩沖區(qū)里面,而不是顯示設備。IDL>Set_shading,values=0,color-1IDL>Shade_surf,peak,zrange=0.0,1.2IDL>Set_shading,values=colors,2*colors-1IDL>shade_surf,saddle,zrange=0.0,1.2,/noerase對投影面進行拍照接著,對投影表面進行快照??赏ㄟ^TVRD命令實現(xiàn)。ID
46、L>picture=TVRD ()在顯示設備上顯示結果最后,返回到顯示設備。打開一個新的窗口來顯示“圖像”,如下:IDL>Set_Plot, thisdeviceIDL>Window, 3, xsize=300,ysize=300IDL>TV, picture 輸出結果應如圖62所示。圖62:Z圖形緩沖區(qū)可以通過曲面的自動消隱來組合3D物體。Z圖形緩沖區(qū)的一些奇怪特點 仔細查看窗口1和3的輸出。特別注意觀察那些坐標軸的標記。可以注意到窗口3(也就是來自Z圖形緩沖區(qū)的輸出)的軸的標記要稍微大些。由于某種原因,Z圖形緩沖區(qū)使用了一種缺省的不同于IDL在顯示窗口中顯示圖形時所
47、用的字符尺寸。這種簡單的事實,如果不意識到的話,會導致在Z圖形緩沖區(qū)中建立一個3D坐標空間以及組合IDL圖形命令時,造成大量的時間浪費。這主要是因為圖形邊緣的建立是基于缺省的字符尺寸,并且圖形邊緣在顯示設備上和在Z圖形緩沖區(qū)中是有差異的。它們差不多是一樣的。但就是 “差不多”將使讀者焦頭爛額。一種笨規(guī)則非常有用,就是,當要在Z圖形緩沖區(qū)中畫圖時,總是設置!P.Charsize系統(tǒng)變量。例如:IDL>!P.Charsize=1.0這里只是提供一個例子,查看圖62中的圖示。這幅圖上的軸不是在Z圖形緩沖區(qū)中創(chuàng)建的,因為那時它們將以屏幕分辨率被著色處理(也就是說,作為一幅圖像)而且可用PostS
48、cript的分辨率對它們進行著色處理。如果!P.Charsize關鍵字沒有在對陰影曲面進行著色處理和隨后坐標軸的添加之前被設置的話,就不可能在最后的輸出中使坐標軸線對應在正確的位置上。用Z圖形緩沖區(qū)使圖像變形使用Z圖形緩沖區(qū)另一種更強大的技術是用于三維數(shù)據(jù)的切片顯示。這是可行的,因為Z圖形緩沖區(qū)具有將圖像變形到一個多邊形平面上的能力。要了解是如何工作的,先用LoadData命令打開80*100*57 的3D MRI Head Scan數(shù)據(jù)集。如下:IDL>head=LoadData(8)也許希望能在輸入代碼時開一個日志文件去截獲這些命令,因為這些命令數(shù)量很多,而且必須正確無誤地找到它們。
49、日志文件將使讀者很輕松地改變并重新運行這些命令。(這種日志文件已經(jīng)創(chuàng)建好了,可以下載的本書配套程序中找到文件。)IDL>Journal, 一般來說,在IDL中用Size命令可以獲得變量的維數(shù)和大小。為定義正確的圖像平面,需要知道三維的尺寸。在這個例子中,“尺寸值”將比真實的維數(shù)值小1,因為要用這個數(shù)值作為數(shù)組的索引號。IDL的索引是號從零開始的。IDL>s=Size(head)IDL>xs=s1-1IDL>ys=s2-1IDL>zs=s3-1假若想在這個數(shù)據(jù)集的中心顯示三個正交切片,也就是說通過三維點(40,50,27)
50、??梢杂孟率龇椒ǘx這些點:IDL>xpt=40IDL>ypt=50IDL>zpt=27接著,可以構建用來描繪這三個圖像切片或平面的各個多邊形。此例子中,每個多邊形將是有四個點(矩形的四個角)的簡單矩形。矩形的每點都要用一個(x,y,z)三位值描述。換句話說,每個平面都將是3*4的多邊形。鍵入:IDL>xplane= xpt,0,0,xpt,0,zs,xpt,ys,zs,$xpt,ys,0 IDL>yplane= 0,ypt,0,0,ypt,zs,xs,ypt,zs,$xs,ypt,0 IDL>zplane= 0,0,zpt,xs,0,zpt,xs,ys,z
51、pt,$0,ys,zpt下一步是獲得與每個圖像平面相對應的圖像數(shù)據(jù)。這在IDL中用數(shù)組下標很容易做到。IDL>ximage=headxpt,*,*IDL>yimage=head*,ypt,*IDL>zimage=head*,*,zpt要注意的是這些圖形都是3D圖像(其中有一維是1)。所關心的是與每個圖像平面相關的2D圖像,因此必須用Reform命令將這些3D圖像轉(zhuǎn)換成為2D圖像格式。在此例中,Reform命令將圖像重新格式化成80*100*1的圖像。當最后的一維為1時,IDL將會舍棄它。這里的結果是一個80*100的圖像。IDL>ximage=reform(ximage
52、)IDL>yimage=reform(yimage)IDL>zimage=reform(zimage)要正確顯示這些圖像,需要確保圖像數(shù)據(jù)已正確地縮放到與顯示顏色數(shù)相匹配的范圍內(nèi)。相對于整個數(shù)據(jù)集的范圍來調(diào)整數(shù)據(jù)是非常重要的。調(diào)整數(shù)據(jù)并裝入顏色:IDL>mindata=min(head,max=maxdata)IDL>topcolor=!D.table_size-2IDL>Loadct, 5, ncolors=!D.table_size-1IDL>Tvlct, 255, 255,255,topcolor+1IDL>ximage=bytscl(ximag
53、e,top=topcolor,max=maxdata,$min=mindata)IDL>yimage=byscl(yimage,top=topcolor,max=maxdata,$min=mindata)IDL>zimage=byscl(zimage,top=topcolor,max=maxdata,$min=mindata)下一步要準備建立Z圖形緩沖區(qū)。 Erase命令將刪去先前留在緩沖區(qū)內(nèi)的任何內(nèi)容。此例子中,用白色擦除,以使顯示更加清晰。IDL>thisdevice=!IDL>Set_Plot,zIDL>device, Set_colors=to
54、pcolor, set_resolution=400,400IDL>erase, color=topcolor+1用Scale3命令創(chuàng)建3D坐標空間。這里的坐標軸是用每個維度的大小標記的。IDL>Scale3, XRange=0,xs, YRange=0,ys, ZRange=0,zs最后將要在Z圖形緩沖區(qū)中對這些切片進行著色處理。為此需要用Polyfill命令。Pattern關鍵字將用于設置想顯示的圖像切片。Image_Coord關鍵字包含一系列與多邊形的每個頂點相關聯(lián)的圖像坐標。Image_Interp用于當圖像被包裹到多邊形上時,指定用雙線性插值,而不是在最近鄰域內(nèi)重采樣。T
55、3D關鍵字通過將三維變換矩陣應用到最后輸出中,從而確保多邊形出現(xiàn)在3D空間內(nèi)。鍵入:IDL>polyfill,xplane,/t3d,pattern=ximage,/image_interp,$image_coord= 0,0,0,zs,ys,zs,ys,0 IDL>polyfill,yplane,/t3d,pattern=yimage,/image_interp,$mage_coord= 0,0,0,zs,xs,zs,xs,0 IDL>polyfill,zplane,/t3d,pattern=zimage,/image_interp,$image_coord= 0,0,xs,0,xs,ys,0,ys 最后,將投影平面快速拍照,并顯示結果。如下:IDL>picture=tvrd()IDL>set_Plot,thisdeviceIDL>window,xsize=400,ysize=400IDL>tv,picture如果已打開了日志文件,現(xiàn)在將其關閉:IDL>Journal輸出結果應類似于圖63所示。如果不是,可用文本編輯器修改日志文件中的代碼來解決
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 征地合同協(xié)議書
- 汽車檢測與維修作業(yè)指導書
- 小區(qū)物業(yè)場地租賃合同
- 臨時活動場地租賃合同
- 中國民用航空運輸合同書5篇
- 廣西國匯投資擔保有限公司借款擔保合同8篇
- 公路貨物運輸合同協(xié)議
- 農(nóng)業(yè)機械化裝備應用作業(yè)指導書
- 公民之間借款合同書8篇
- 2025年海口經(jīng)營性道路客貨運輸駕駛員從業(yè)資格考試
- 慢性腎衰竭患者護理查房課件
- 高處作業(yè)工作票
- 《左傳·鄭伯克段于鄢》PPT課件(完整版)
- IPC6012C培訓
- 氮氣窒息事故案例經(jīng)驗分享
- 2工藝用水驗證報告
- 原子雜化軌道理論
- 充填開采之 矸石充填術
- 醫(yī)院醫(yī)療設備采購流程圖
- 021[學士]某六層框架宿舍樓畢業(yè)設計(含計算書、圖紙)
- 人力外包項目實施方案
評論
0/150
提交評論