版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第五章 圖形顯示技巧本章概要在上一章節(jié)了學(xué)習(xí)了一些圖形顯示技術(shù)。 在這一章節(jié)將學(xué)習(xí)幾個新的圖形顯示技巧, 以 便讓圖形顯示具有專業(yè)的感觀效果。具體來說,將學(xué)會:1. 怎樣讓鼠標(biāo)交互作用于圖形顯示2. 怎樣從圖形顯示中刪除注釋3. 怎樣在圖形顯示上畫“橡皮條”4. 怎樣在圖形顯示技巧中使用 Z 圖形緩沖區(qū)將光標(biāo)用于圖形顯示數(shù)據(jù)可視化顯示的原因之一是用戶可用不同的方式對數(shù)據(jù)進行交互式的操作。 用戶喜歡 的一種對數(shù)據(jù)交互式操作的方式是使用光標(biāo)去選擇或者標(biāo)注部分?jǐn)?shù)據(jù)。 這種交互作用在 IDL 中用 Cursor 命令很容易完成。用 LoadData 命令裝入 Time Series 數(shù)據(jù)集,可看到 C
2、ursor 命令是如何工作的。IDL> curve = LoadData (1)輸入下述命令,顯示曲線:IDL> Window, Xsize = 400, Ysize = 400IDL> LoadCT, 0IDL> TvLCT, 255,255,0,1IDL> Plot, curveCursor 命令接受兩個參數(shù)。這些參數(shù)必須是記錄鼠標(biāo)鍵按下時光標(biāo)位置的變量。 Cursor 命令要求光標(biāo)位于當(dāng)前圖形窗口中。 (即被 !D.Window 系統(tǒng)變量指向的窗口。 )例如, 如果輸 入這個命令, IDL 將會等待光標(biāo)被移動到當(dāng)前圖形窗口 (如果輸入的是上述命令, 就是 0
3、 號 索引窗口)并單擊鼠標(biāo)鍵。當(dāng)執(zhí)行上述動作后, IDL 將光標(biāo)位置返回到變量 xLocation 和 yLocation 中。輸入:IDL> Cursor, xLocation, yLocation 如果打印出這些變量的值,將發(fā)現(xiàn)這些值被賦予的是數(shù)據(jù)坐標(biāo)空間。 xLocation 的數(shù)值 從 0 到 100,yLocation 的數(shù)值從 0 到 30。(如果是在圖形邊界內(nèi)點擊的鼠標(biāo),它們至少是這 么多。如果不是在圖形邊界內(nèi)點擊的鼠標(biāo)會怎么樣?)缺省時,Cursor命令返回數(shù)據(jù)坐標(biāo)位置。IDL> Print, xLocation, yLocation什么時候返回的光標(biāo)位置?從上面的
4、命令看, 似乎鼠標(biāo)鍵被按下時返回光標(biāo)位置, 但并非總是這樣。 事實上, Cursor 命令什么時候報告光標(biāo)的位置是由 Cursor 命令的關(guān)鍵字所決定的。這些關(guān)鍵字是:當(dāng)光標(biāo)位置發(fā)生改變或用戶移動光標(biāo)時,返回光標(biāo)位置。 當(dāng)鼠標(biāo)鍵被按下時,返回光標(biāo)位置。當(dāng) Cursor 命令執(zhí)行時,光標(biāo)位置被立即返回。沒有任何延遲或等待鼠標(biāo)的按ChangeDownNoWait 鍵。這個關(guān)鍵字有時用于當(dāng)對象正在顯示窗口中被移動時的循環(huán)中。UP 不是在鼠標(biāo)鍵被按下時,而是放開或釋放后返回光標(biāo)位置。Wait Cursor 命令等待鼠標(biāo)鍵被按下后返回光標(biāo)的位置。 只要鼠標(biāo)鍵被按下, 此關(guān)鍵字 對 Cursor 命令的作
5、用就類似于用 NoWait 關(guān)鍵字調(diào)用 Cursor 命令。此關(guān)鍵字是 Cursor 命令 的缺省狀態(tài)。在 Cursor 命令中,小心使用合適的關(guān)鍵字,特別是在循環(huán)過程中使用 Cursor 命令。用 戶有時習(xí)慣地認(rèn)為 Cursor 命令的缺省屬性是只有鼠標(biāo)鍵被按下時才返回光標(biāo)的位置。其實 不然,缺省屬性只是等待一個單擊動作,以后的行為就和 個區(qū)別是至關(guān)重要的。NoWait 關(guān)鍵字一樣。在循環(huán)中這除了設(shè)置光標(biāo)屬性外,有時還想知道哪個鼠標(biāo)鍵用于對 想要用鼠標(biāo)左鍵做某件事,而做另外不同的事情要用鼠標(biāo)右鍵 以檢查系統(tǒng)變量 !Mouse 中的 Button 字段,來判斷哪一個鼠標(biāo)鍵在和 (老版本的 ID
6、L 是用系統(tǒng)變量 !Err 的值來判斷的。 )這個字段是 個字段的有效值及其意義如下:當(dāng)前沒有按鍵被使用 左鍵用于 Cursor 命令 中間鍵用于 Cursor 命令 右鍵用于 Cursor 命令!Mouse.Button = 0!Mouse.Button = 1!Mouse.Button = 2!Mouse.Button = 4Cursor 命令作出反應(yīng)。例如,Cursor 命令作出的反應(yīng)??蒀ursor 命令共同作用。 個整型位映象。 Button 這哪一個鼠標(biāo)鍵和光標(biāo)共同作用呢?用光標(biāo)標(biāo)注圖形輸出五個使用 Cursor 命令的一種方法是允許用戶交互地在線畫圖上放置符號標(biāo)記。例如,正確 無
7、誤地輸入下列命令。 當(dāng)輸完最后一個回車鍵后, 在當(dāng)前的圖形窗口上單擊鼠標(biāo)五次。 符號將放置在窗口中。 (如果在輸入下列代碼時出現(xiàn)打字錯誤, 必須從頭開始重新輸入。 )輸 入:IDL> For j = 0, 4 DO BEGIN $IDL> Cursor, xloc, yloc, /DOWN & $IDL> Plots, xloc, yloc, Psym = 4, SymSize = 2, Color = 1 & ENDFOR畫方框有時可能為了選取圖形顯示中的某部分, 而在它的周圍畫上方框。 這里有些命令可用來 選擇由 Cursor 命令產(chǎn)生的方框的對角,畫出該
8、方框,并將圖形縮放到該方框坐標(biāo)范圍。首 先畫圖:IDL> Plot, curve接著, 使用光標(biāo)選擇想畫的方框的一角。 要確保在當(dāng)前圖形窗口上點擊光標(biāo)。 為確定哪個是當(dāng)前窗口,并讓它不被隱藏,可輸入:IDL> 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 diago nal corner of box.上述Cursor命令
9、返回的坐標(biāo)是數(shù)據(jù)空間坐標(biāo)。按如下畫方框:IDL> Plots, x1,x1,x2,x2,x1,y1,y2,y2,y1,y1, color = 1輸出結(jié)果應(yīng)類似于圖58中所示,盡管實際的圖形上方框取決于在窗口中點擊的位置。為了放大這部分圖形,必須保證方框坐標(biāo)的正確順序。這是非常必要的,因為可能先選擇的是方框的右下角,然后是左上角,這樣x1將大于x2。還可以想象其它的假設(shè)。為了適應(yīng)所有的情況,鍵入:Q旳4 口和旳TQQ圖58:在部分?jǐn)?shù)據(jù)周圍畫上方框的線畫圖。用Cursor命令選擇方框的坐標(biāo),用PlotS命令畫方框。IDL> Xmin = Min(x1,x2, Max = xmax)ID
10、L> Ymin = Min(y1,y2, Max = ymax)最后,已經(jīng)為放大對方框內(nèi)的數(shù)據(jù)做好了準(zhǔn)備。除了正確地設(shè)置數(shù)據(jù)范圍外,還必須設(shè)置<XY>Style關(guān)鍵字。知道為什么嗎?如果不知道,可在不使用這兩個關(guān)鍵字的情況下試試下面的命令。將會發(fā)生什么呢?IDL> Plot, curve, XRa nge = xm in, xmax, Yrange = ym in, ymax, $Xstyle = 1, Ystyle = 1在圖像上使用Cursor命令通常當(dāng)在處理圖像數(shù)據(jù)時使用Cursor命令,希望用設(shè)備坐標(biāo)而不是數(shù)據(jù)坐標(biāo)返回光標(biāo)位置。這是因為設(shè)備坐標(biāo)和圖像中對應(yīng)的位置
11、之間通常存在一種簡單的關(guān)系(大多數(shù)是一對 一的關(guān)系)。為了解如何工作的,可用LoadData命令打開360*360的World Elevation數(shù)據(jù)集 鍵入:IDL> image = LoadData(7)顯示圖像,并裝入某些顏色。如下:IDL> topColor = !D.Table_Size-1IDL> LoadCT, 3, Ncolors = !D.Table_Size-1IDL>TvLCT, 255,255,0, TopColorIDL> Window, XSize = 360, YSize = 360IDL> TV , BytScl (image
12、, Top = !D.Table_Size-2)利用光標(biāo)在圖像中選擇某一特定行和列。 注意Cursor和Plots命令中的Device關(guān)鍵字。 這是確保返回的坐標(biāo)是設(shè)備坐標(biāo)而不是數(shù)據(jù)坐標(biāo)。在該位置上畫一個十字線。(確保在輸入Cursor 命令后,在圖像窗口中點擊一下。 )鍵入: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
13、) , row, row , / Device, Color = topColor注意,在圖像中某一特定的行和列上獲得圖像數(shù)據(jù)是多么的容易。例如, 可以輕易地繪制出圖像中行和列的數(shù)據(jù)剖面,鍵入:IDL> Window, 1, Xsize = 500, Ysize = 300IDL> !P.Multi = 0, 2, 1IDL> Plot, image *, row, Title =' Row Profile 'IDL> Plot, image col, * , Title =' Column Profile 'IDL> !P.Mul
14、ti = 0IDL> Wset, 0輸出結(jié)果類似于圖 59 所示。在循環(huán)中使用 Cursor 命令有時想在循環(huán)中使用 Cursor 命令。例如,當(dāng)用光標(biāo)選擇圖像上的單個像素時,可能想 知道它的像素值。 下面是個簡單的循環(huán)程序, 它將一直執(zhí)行下去, 直到單擊右鍵或中鍵退出。 打開文本編輯器,準(zhǔn)確無誤地輸入如下代碼。TopColor = !D.Table_size-1LoadCT, 3, Ncolors = !D.Table_size-1TvLCT, 255, 255, 0, topColorTV, Bytscl (image, Top =!D.Table_size-2)!Mouse.But
15、ton = 1REPEAT BEGINCursor, col, row, /Down, /DevicePrint, Pixel Value:c'ol, rimowageENDREP UNTIL !Mouse.Button NE 1END圖 59:用 Cursor 命令在圖像中選擇的行和列的剖面。保存到 文件中(此文件已經(jīng)存在于下載的本書配套程序之中) 。編譯,并運行 這個小主程序,輸入:IDL> .RUN loop1移動光標(biāo)進入圖像窗口, 開始單擊左鍵。 圖像像素值就會出現(xiàn)在日志窗口中, 直到點擊 其它鍵,而不是左鍵。如果在 Cursor 命令中使用除了 Do
16、wn 之外的其它關(guān)鍵字會發(fā)生什么呢?實驗一下,找 出答案。從顯示中刪除注釋當(dāng)使用光標(biāo)在圖形顯示上按照剛才使用的方法來添加注釋時,也許會問: “怎樣才能刪 除剛放置在那兒的注釋呢?” 有兩種較好的方法刪除注釋。 稱之為異或法和設(shè)備拷貝法。 筆 者認(rèn)為在兩者之中設(shè)備拷貝法更能給出專業(yè)的感觀效果。 兩種方法都列舉出來, 但重點將集 中在設(shè)備拷貝法上。刪除注釋的異或法異或法是在圖形函數(shù)的基礎(chǔ)上起作用的。 圖形函數(shù)是兩個數(shù)的位操作。 這兩個數(shù)分別與 已經(jīng)顯示出來的像素 (稱作所謂的目標(biāo)像素) 以及希望放置在同一位置的像素 (稱作所謂的 源像素)相關(guān)聯(lián)。IDL 忽略了目標(biāo)像素的值,僅XOR (異或法),I
17、DL將目標(biāo)換句話說, 如果像素的二進制通常, IDL 使用的圖形函數(shù)稱作源。在這種圖形函數(shù)里, 僅在該像素位置上放置源像素的值。但如果這種圖形函數(shù)變成 像素和源像素進行逐位比較。 這會產(chǎn)生反向目標(biāo)像素的效果。表示為 01100101,那么執(zhí)行 XOR 命令后,像素的二進制表示為。(實際的 XOR 過程遠比這復(fù)雜, 因為只有 IDL 在顏色索引表中的鄰近位置上有 256 種 顏色時, 它才按這種方式運行, 而這是一種少見的情形。 大多數(shù)人只是認(rèn)為 XOR 法是用“相 反的”顏色畫,并保留原來的。在實際的 XOR 法中,可能預(yù)測將會使用哪種顏色來畫,但 在大多數(shù)情形下并不是這樣。 這就是為什么絕大
18、多數(shù) IDL 專業(yè)程序員寧愿采用設(shè)備拷貝法。 ) 在任何時侯,圖形函數(shù)的作用效果都是由 Device 命令和 Set_Graphics_Function 關(guān)鍵字 設(shè)置的。源模式下圖形函數(shù)為 3。XOR模式下圖形函數(shù)為 6。此時IDL處于系統(tǒng)缺省的源模式下。當(dāng)處于這種模式時,重新顯示圖像窗口中的圖像。輸入:IDL> TV , BytScl (image, Top =!D.Table_Size-2) 現(xiàn)在,選擇 XOR 模式:IDL> Device, Set_Graphics_Function = 6 在圖像中畫一個方框:IDL> Plots, 0.2, 0.2, 0.8, 0.
19、8, 0.2, Color = topColor,$0.2, 0.8, 0.8, 0.2, 0.2, /Normal注意, 方框線的顏色不是預(yù)測的黃色。取而代之是多彩的,盡管它顯得也很合理。在這 個模式下線下的像素已經(jīng)被翻轉(zhuǎn)了。PlotS 命令很容易完成。在繼續(xù)下面的練習(xí)前, 確保 主程序,按如下要刪除方框,只須將底下的像素值翻轉(zhuǎn)回它們的原值。再次用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 可以反復(fù)執(zhí)行上面的命令, 讓方框隨心所欲地出現(xiàn)
20、或消失。將圖形函數(shù)設(shè)回到源模式。鍵入:IDL> Device, Set_Graphics_Function = 3在 IDL 程序中可容易地利用圖形函數(shù)。例如,打開以前寫的 修改它。這個程序?qū)⒃趫D像窗口中每次點擊的位置上畫一個大的十字線。以 命名 保存程序。鍵入: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; Go into X
21、OR 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 BEGIN; Get new cursor location.
22、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=topColorPlotS, 0,360, rownew
23、,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, 0,360, row,row, /Device, Color=topColor; Restore normal graphics function.Device, Set_Graphics_Function=3END保存
24、到文件 中。(此文件已經(jīng)存在于下載的本書配套程序之中。 )編譯,并執(zhí) 行這個主程序,鍵入:IDL> .RUN loop2 將光標(biāo)放在圖像窗口中, 點擊左鍵數(shù)次。 在每個光標(biāo)位置上應(yīng)該有一個十字線。 按右鍵 或中間鍵終止程序。刪除注釋的設(shè)備拷貝法IDL設(shè)備拷貝法利用像素映射窗口來刪除已顯示屏幕上的注釋。像素映射窗口和其它圖形窗口完全一樣, 除了它不顯示在顯示器上外。事實上,它存在于顯示設(shè)備的視頻隨機存儲器中。換句話說,它存在于存儲器中。從其它任何方面來說,它就象一個正常的IDL圖形窗口一樣:可用 Window命令創(chuàng)建,用 WSet命令激活,用 WDelete命令刪除,等
25、等。在 像素映射窗口內(nèi)畫圖和在 IDL正常的圖形窗口內(nèi)畫圖是完全一樣的(例如,用Plot 'Surface、TV和其它圖形輸出命令)。設(shè)備拷貝技術(shù)就是從一個窗口(稱為源窗口)拷貝一個矩形區(qū),然后將矩形區(qū)傳入另一個窗口(稱為目的窗口)。源窗口和目的窗口有時可以是同一個窗口,這點等會會看到。圖 60是設(shè)備拷貝技術(shù)的圖解。實際的拷貝是通過 Device命令和Copy關(guān)鍵字(設(shè)備拷貝技術(shù)的名字由此而來)完成。命令的一般形式如下:Device, Copy =在這個命令中,sx, sycolrowdx, dy=sx, sy, col, row, dx, dy, sourceWi ndowIDCop
26、y關(guān)鍵字的組成兀素是:源窗口矩形區(qū)左下角的設(shè)備坐標(biāo)(矩形區(qū)是從源窗口拷貝的) 從源窗口中拷貝的列數(shù)。這是矩形區(qū)的寬度。從源窗口中拷貝的行數(shù)。這是矩形區(qū)的高度。目標(biāo)窗口中矩形區(qū)左下角的設(shè)備坐標(biāo)。(目標(biāo)窗口是要將矩形區(qū)拷貝到的窗口。目標(biāo)窗口總是當(dāng)前圖形窗口。)sourceWi ndowID源窗口的窗口索引號。矩形區(qū)從此窗口拷貝到當(dāng)前圖形窗口(由!D.Window系統(tǒng)變量指定)。源窗口可以是當(dāng)前圖形窗口,但多數(shù)情況下它是一個非當(dāng) 前圖形窗口的窗口。它通常是一個像素映射窗口。要看其是如何工作的,先創(chuàng)建一個像素映射窗口,在里面顯示一幅圖像。用帶Pixmap關(guān)鍵字的Window命令來創(chuàng)建像素映射窗口,鍵入
27、:IDL> Win dow, 1, /Pixmap, XSize = 360, YSize = 360IDL> TV , BytScl (image, Top =!D.Table_Size-2)圖60:設(shè)備拷貝技術(shù)是將源窗口的一個矩形區(qū)拷貝到目標(biāo)窗口的某個位置。實際上可以拷貝整個窗口,而且源窗口和目標(biāo)窗口可以是同一個窗口。注意,當(dāng)輸入這些命令時沒有任何可見的線索表明發(fā)生了什么。這是因為像素映射窗口僅存在于視頻隨機存儲器中,而不是在顯示屏上。為證明這個窗口內(nèi)存有的內(nèi)容,可打開第三個窗口,并將像素映射窗口的內(nèi)容拷貝到第三個窗口中。如果第三個窗口看起來象原來的圖像窗口,那么已經(jīng)輸入的命令
28、是正確的。鍵入:IDL> Win dow, 2, Xsize = 360, Ysize = 360IDL> Device, Copy =0, 0, 360, 360, 0, 0, 1注意,已將像素映射窗口的全部內(nèi)容拷貝到這個新的窗口中。這種操作除了在速度上快幾個數(shù)量級之外,其它方面與在此新窗口中重新顯示圖像類似了。將像素映射窗口中的全部 內(nèi)容拷貝到了新的顯示窗口是一種常見的做法,即使只是修改部分的顯示窗口。 刪除最后創(chuàng)建的兩個窗口(包括像素映射窗口) ,如下:IDL> Wdelete, 1, 2當(dāng)對像素映射窗口操作完成后, 刪除它們是很重要的。 它們會占用存儲空間, 這些存儲
29、 空間可用于其它用途。 某些窗口管理器為這些像素映射窗口分配一個定量的存儲空間。 如果 像素映射窗口超過了視頻存儲器的容量, 可以使用虛擬內(nèi)存。 X 終端給像素映射窗口留有非 常小的存儲空間。要了解設(shè)備拷貝技術(shù)在實際中是如何運用的,修改主程序以前寫的主程序文件 ??梢钥截惖搅硪粋€文件,以 命名。修改代碼如下:TopColor = !D.Table_Size-1LoadCT, 3, Ncolors = !D.Table_Size-1TvLCT, 255, 255, 0, topColorTV, BytScl (image, Top =!D.Table_Si
30、ze-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 the current graphics window.Wset, 0; Get initial cursor location. Draw cross-hair.Cursor, col, row, /Device, /DownPlots
31、, 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, 1Print, Pixel Val
32、ue: ' , imagewconlenwew , ro; 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以 命名存檔。(此文件已經(jīng)存在于下載
33、的本書配套程序之中)編輯,并運行主 程序,輸入:IDL> .RUN loop3 放置光標(biāo)于圖像窗口中, 點擊左鍵數(shù)次。 單擊右或中間鍵終止程序。 注意十字線是用黃 色繪制。在繼續(xù)下一次練習(xí)之前,刪除像素映射窗口。輸入:IDL> Wdelete, 1畫一個橡皮筋方框設(shè)備拷貝技術(shù)非常適用于在屏幕上畫橡皮條選擇方框和其它形狀。 (橡皮條方框是指一 角固定,另一角隨著光標(biāo)的變化而變化的方框) 。事實上,修改程序 可以很容易實 現(xiàn)。將 拷貝到文件 。( 文件已經(jīng)存在于下載的本書配套程序 之中。)作如下修改
34、,看看創(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 and display image in it.Window, 1, /Pixmap, XSize=360, YSize=360TV, BytScl(image, Top=!D.Table_Size-2);Make the d
35、isplay 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 (dynamic corner of box).Cursor, dx, dy, /Wait, /Device; Erase the old box.Device, Copy=0, 0, 360, 360, 0, 0, 1; Draw the ne
36、w 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> .RUN rubberbox 在繼續(xù)下一次練習(xí)之前,刪除像素映射窗口。輸入:IDL> Wdelete,1圖形窗口的滾動設(shè)備拷貝技術(shù)的另一個有效應(yīng)用是實現(xiàn)圖形窗口的滾動。 在這個示例中將運用設(shè)備拷貝 技術(shù)讓圖形顯示窗口中的圖像滾動起來。 圖像
37、從左至右每次滾動四列。 使用的算法如下:( 1) 將窗口右邊最后四列拷貝到一個僅有四列寬和360 行高的小像素映射窗口。 ( 2)將整個顯示窗口的內(nèi)容(減去已經(jīng)拷貝的四列)在同一窗口(也就是說,源窗口和目標(biāo)窗口是同一個窗 口)內(nèi)向右邊移動四列。(3 )將像素映射窗口的內(nèi)容拷貝到顯示窗口左邊頭四列。打開文本 編輯器,輸入下列命令。以命名(此文件已經(jīng)存在于下載的本書配套程序之中)。;Open a pixmap window 4 colu mns wide.Win dow, 1, /Pixmap, XSize=4, YSize=360FOR j=0,360/4 DO BEGIN;
38、Copy four colu mns on right of display into pixmap.Device, Copy=356, 0, 4, 360, 0, 0, 0;Make the display wi ndow the active win dow.WSet, 0;Move wi ndow contents over 4 colu mns.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, 1 E
39、NDFOREND運行程序,輸入:IDL> .RUN scroll程序每次滾動一次。再次運行程序,輸入:IDL> .Go能修改程序讓它一直滾動,直到讓它停止嗎?在繼續(xù)下一次練習(xí)之前刪除像素映射窗口。輸入:IDL> Wdelete,1Z圖形緩沖區(qū)中的圖形顯示技巧可以把IDL中的Z圖形緩沖區(qū)想象成一個三維盒子,3D對象可以被堆積在里面而不用關(guān)心它們的“實體”性質(zhì)。這個盒子能用16位深度緩沖區(qū)來記錄每個對象的深度。盒子的一邊是投影平面??梢韵胂蠊饩€通過投影平面的每一個像素最終遇到盒子內(nèi)實體對象。光線遇到的像素值就是投影到投影平面的值。用這種方法,Z圖形緩沖區(qū)就可以處理曲面和線條的自動
40、消隱。圖61就是此概念的圖解說明。Z圖形緩沖區(qū)圖61: Z圖形緩沖區(qū)可以被想象作一個能保留深度信息的3D盒子。光線射到Z圖形緩沖區(qū)中的物體時,它們的像素值反過來被投影到投影平面上。其概念是,當(dāng)物體被裝入三維盒子里時,就可以得到投影平面的一幅快照或一幅圖像。這是盒子中三維物體的二維投影。處在其它物體后面的物體就不被顯示。(這種屬性可以在一些IDL圖形命令中用 Tran spare nt關(guān)鍵字來改變,以后將會看到。)快照實際上就是利用 TVRD命令對投影平面的屏幕轉(zhuǎn)儲。Z圖形緩沖區(qū)的實現(xiàn)在IDL中,Z圖形緩沖區(qū)是用軟件方式作為另一中圖形輸出設(shè)備實現(xiàn)的,類似于PostScript 設(shè)備或 X 窗口,
41、 Win 或 Mac 設(shè)備。因此,要在 Z 圖形緩沖區(qū)中畫圖形,必須用 Sep_Plot命令將其變成當(dāng)前的圖形輸出設(shè)備。和其它圖形輸出設(shè)備一樣,Z圖形緩沖區(qū)可用Device 命令和適當(dāng)?shù)年P(guān)鍵字來配置。常用于Z圖形緩沖區(qū)的兩個關(guān)鍵字是Set_Colors和Set_Resolution。這兩個關(guān)鍵字定義如下:Set_ColorsZ 圖形緩沖區(qū)中的顏色數(shù)。在缺省情況下, Z 圖形緩沖區(qū)使用 256 種顏色。在 IDL 運行中,這是個非常少的顏 色數(shù)目。如果希望 Z 圖形緩沖區(qū)的輸出具有和顯示設(shè)備 相同的顏色數(shù)目,就須設(shè)置這個關(guān)鍵字。Set_ResolutionZ 圖形緩沖區(qū)投影平面通常設(shè)置為 640
42、 像素寬和 480像素高。如果要在圖形窗口顯示 Z 圖形緩沖區(qū)的輸出結(jié) 果,就應(yīng)該將 Z 圖形緩沖區(qū)的大小設(shè)置成圖形窗口的大 小。例如:DEVICE, Set_Resolution=400,400一個 Z 圖形緩沖區(qū)實例:兩個曲面要了解 Z 圖形緩沖區(qū)是怎樣工作的, 先按如下創(chuàng)建兩個名為 peak 和 saddle 的物體。(完 成此例的命令可以在下載的本書配套程序中的文件 中找到。)IDL>peak=shift(dist(20,16),10,8)IDL>peak=Exp(-(peak/5)A2)IDL>saddle=shift(peak,6,0)+s
43、hift(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)建一個窗口,顯示第一個物體的陰影曲面圖。要注意的是,Set_shading 命令是用來將陰影處理的值限制在顏色查詢表中特定部位。鍵入:IDL>window, 1,
44、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, saddle, zrange=0.0,1.2使 Z 圖形緩沖區(qū)成為當(dāng)前設(shè)備為了在Z圖形緩沖區(qū)中組合兩個物體,必須使Z圖形
45、緩沖區(qū)成為當(dāng)前的圖形顯示設(shè)備。這可用Set_Plot命令來實現(xiàn)。Copy這個關(guān)鍵字可將當(dāng)前的顏色表復(fù)制到Z緩沖區(qū)中。保存 當(dāng)前圖形顯示設(shè)備的名字,以便能方便地返回。鍵入:IDL>thisDevice=!D.NameIDL>Set_Plot, 'z',/Copy配置 Z 圖形緩沖區(qū)接下來,必須將 Z 圖形設(shè)備配置成具體的規(guī)格。在這個例子中,要限制顏色的數(shù)目,還 要使緩沖區(qū)的分辨率與當(dāng)前圖形顯示窗口尺寸相等。鍵入:IDL>Device,Set_colors=2*colors, Set_Resolution=300,300將物體裝入到 Z 圖形緩沖區(qū)中現(xiàn)在,將兩個物
46、體裝入到 Z 圖形緩沖區(qū)中。要注意的是,鍵入這些命令時,將看不到 任何事發(fā)生。因為輸出已進入內(nèi)存中的Z 圖形緩沖區(qū)里面,而不是顯示設(shè)備。IDL>Set_shading,values=0,color-1IDL>Shade_surf,peak,zrange=0.0,1.2IDL>Set_shading,values=colors,2*colors-1 IDL>shade_surf,saddle,zrange=0.0,1.2,/noerase對投影面進行拍照接著,對投影表面進行快照。可通過 TVRD 命令實現(xiàn)。IDL>picture=TVRD ()在顯示設(shè)備上顯示結(jié)果最
47、后,返回到顯示設(shè)備。打開一個新的窗口來顯示“圖像” ,如下:IDL>Set_Plot, thisdeviceIDL>Window, 3, xsize=300,ysize=300IDL>TV , picture輸出結(jié)果應(yīng)如圖 62 所示。圖 62: Z 圖形緩沖區(qū)可以通過曲面的自動消隱來組合3D 物體。Z 圖形緩沖區(qū)的一些奇怪特點仔細(xì)查看窗口 1 和 3 的輸出。 特別注意觀察那些坐標(biāo)軸的標(biāo)記。 可以注意到窗口 3(也 就是來自 Z 圖形緩沖區(qū)的輸出) 的軸的標(biāo)記要稍微大些。 由于某種原因, Z 圖形緩沖區(qū)使用 了一種缺省的不同于 IDL 在顯示窗口中顯示圖形時所用的字符尺寸。
48、這種簡單的事實, 如果不意識到的話, 會導(dǎo)致在 Z 圖形緩沖區(qū)中建立一個 3D 坐標(biāo)空間 以及組合 IDL 圖形命令時,造成大量的時間浪費。這主要是因為圖形邊緣的建立是基于缺 省的字符尺寸,并且圖形邊緣在顯示設(shè)備上和在 Z 圖形緩沖區(qū)中是有差異的。它們差不多 是一樣的。但就是 “差不多”將使讀者焦頭爛額。一種笨規(guī)則非常有用,就是,當(dāng)要在 Z 圖形緩沖區(qū)中畫圖時, 總是設(shè)置 !P.Charsize 系統(tǒng) 變量。例如:IDL>!P.Charsize=1.0 這里只是提供一個例子,查看圖 62中的圖示。這幅圖上的軸不是在 Z 圖形緩沖區(qū)中創(chuàng) 建的,因為那時它們將以屏幕分辨率被著色處理(也就是說
49、 ,作為一幅圖像)而且可用 PostScript 的分辨率對它們進行著色處理。如果 !P.Charsize 關(guān)鍵字沒有在對陰影曲面進行著 色處理和隨后坐標(biāo)軸的添加之前被設(shè)置的話, 就不可能在最后的輸出中使坐標(biāo)軸線對應(yīng)在正 確的位置上。用 Z 圖形緩沖區(qū)使圖像變形使用 Z 圖形緩沖區(qū)另一種更強大的技術(shù)是用于三維數(shù)據(jù)的切片顯示。 這是可行的, 因為 Z 圖形緩沖區(qū)具有將圖像變形到一個多邊形平面上的能力。要了解是如何工作的,先用 LoadData 命令打開 80*100*57 的 3D MRI Head Scan 數(shù)據(jù)集。如下:IDL>head=LoadData(8) 也許希望能在輸入代碼時開
50、一個日志文件去截獲這些命令,因為這些命令數(shù)量很多,而 且必須正確無誤地找到它們。日志文件將使讀者很輕松地改變并重新運行這些命令。 (這種 日志文件已經(jīng)創(chuàng)建好了,可以下載的本書配套程序中找到 文件。)IDL>Journal, ' '一般來說,在 IDL 中用 Size 命令可以獲得變量的維數(shù)和大小。為定義正確的圖像平面, 需要知道三維的尺寸。在這個例子中, “尺寸值”將比真實的維數(shù)值小 1,因為要用這個數(shù) 值作為數(shù)組的索引號。 IDL 的索引是號從零開始的。IDL>s=Size(head)IDL>xs=s1-1ID
51、L>ys=s2-1IDL>zs=s3-1 假若想在這個數(shù)據(jù)集的中心顯示三個正交切片,也就是說通過三維點( 40,50,27)。可以 用下述方法定義這些點:IDL>xpt=40IDL>ypt=50IDL>zpt=27 接著,可以構(gòu)建用來描繪這三個圖像切片或平面的各個多邊形。此例子中,每個多邊形將是有四個點(矩形的四個角)的簡單矩形。矩形的每點都要用一個(x,y,z)三位值描述。換句話說,每個平面都將是 3*4 的多邊形。鍵入:IDL>xplane= xpt,0,0,xpt,0,zs,xpt,ys,zs,$ xpt,ys,0 IDL>yplane= 0,y
52、pt,0,0,ypt,zs,xs,ypt,zs,$xs,ypt,0 IDL>zplane= 0,0,zpt,xs,0,zpt,xs,ys,zpt,$ 0,ys,zpt下一步是獲得與每個圖像平面相對應(yīng)的圖像數(shù)據(jù)。這在 IDL 中用數(shù)組下標(biāo)很容易做到。 IDL>ximage=headxpt,*,*IDL>yimage=head*,ypt,*IDL>zimage=head*,*,zpt 要注意的是這些圖形都是 3D 圖像(其中有一維是 1)。所關(guān)心的是與每個圖像平面相關(guān) 的 2D 圖像,因此必須用 Reform 命令將這些 3D 圖像轉(zhuǎn)換成為 2D 圖像格式。在此例中, Re
53、form 命令將圖像重新格式化成 80*100*1 的圖像。當(dāng)最后的一維為 1 時, IDL 將會舍棄它。這里 的結(jié)果是一個 80*100 的圖像。IDL>ximage=reform(ximage)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-2I
54、DL>Loadct, 5, ncolors=!D.table_size-1IDL>Tvlct, 255, 255,255,topcolor+1IDL>ximage=bytscl(ximage,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)下一步要準(zhǔn)備建立 Z 圖形緩沖區(qū)。 Erase 命令將
55、刪去先前留在緩沖區(qū)內(nèi)的任何內(nèi)容。此例子中,用白色擦除,以使顯示更加清晰。IDL>thisdevice=!IDL >Set_Plot, ' z'IDL>device, Set_colors=topcolor, set_resolution=400,400IDL>erase, color=topcolor+1用 Scale3 命令創(chuàng)建 3D 坐標(biāo)空間。這里的坐標(biāo)軸是用每個維度的大小標(biāo)記的。IDL>Scale3, XRange=0,xs, YRange=0,ys, ZRange=0,zs最后將要在Z圖形緩沖區(qū)中對這些切片進行著色處理。為此需要
56、用Polyfill命令。Pattern關(guān)鍵字將用于設(shè)置想顯示的圖像切片。 Image_Coord 關(guān)鍵字包含一系列與多邊形的每個頂點 相關(guān)聯(lián)的圖像坐標(biāo)。 Image_Interp 用于當(dāng)圖像被包裹到多邊形上時,指定用雙線性插值,而 不是在最近鄰域內(nèi)重采樣。 T3D 關(guān)鍵字通過將三維變換矩陣應(yīng)用到最后輸出中,從而確保 多邊形出現(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,patte
57、rn=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 最后,將投影平面快速拍照,并顯示結(jié)果。如下:IDL>picture=tvrd()IDL>set_Plot,thisdeviceIDL>window,xsize=400,ysize=400IDL>tv,picture如果已打開了日志文件,現(xiàn)在將其關(guān)閉:IDL>Journal 輸出結(jié)果應(yīng)類似于圖 63 所示。如果不是,可用文本編輯器修改日志文件中的代碼來解 決問題。要重新運行代碼,保存文件并鍵入:IDL>warping圖 63:在 Z 圖形緩沖區(qū)將圖像數(shù)據(jù)變形到平面中的一個實例Z 圖形緩沖區(qū)中的透明效果注意圖 63 中的每個切片的外部邊緣有許多黑塊。這不是圖像的部分, 而是黑色背景噪音。Z 圖形緩沖區(qū)的一個優(yōu)點是可以在其中運用透明效果。例如,如果將命令 PolyFill 中的 Tran spare nt關(guān)鍵字設(shè)置為大約 20或25,那
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年岳麓版選修6歷史下冊階段測試試卷含答案
- 2025年華師大版選修2地理下冊階段測試試卷
- 2025年北師大新版選修5歷史上冊階段測試試卷含答案
- 2025年外研版三年級起點選擇性必修3歷史上冊月考試卷含答案
- 2025年浙教版選修6歷史下冊月考試卷
- 二零二五版面料行業(yè)標(biāo)準(zhǔn)制定與采購合同范本3篇
- 二零二五年度生物制藥項目與派遣公司研發(fā)人員派遣合同4篇
- 二零二五版派遣人力資源管理顧問人才派遣與咨詢合同4篇
- 二零二五版商業(yè)綜合體租賃合同范本4篇
- 二零二五年度個人汽車租賃貸款合同范本3篇
- 選煤廠安全知識培訓(xùn)課件
- 項目前期選址分析報告
- 急性肺栓塞搶救流程
- 《統(tǒng)計學(xué)-基于Python》 課件全套 第1-11章 數(shù)據(jù)與Python語言-時間序列分析和預(yù)測
- 《形象價值百萬》課件
- 紅色文化教育國內(nèi)外研究現(xiàn)狀范文十
- 中醫(yī)基礎(chǔ)理論-肝
- 小學(xué)外來人員出入校門登記表
- 《土地利用規(guī)劃學(xué)》完整課件
- GB/T 25283-2023礦產(chǎn)資源綜合勘查評價規(guī)范
- 《汽車衡全自動智能稱重系統(tǒng)》設(shè)計方案
評論
0/150
提交評論