• 沒有找到結果。

第八章

N/A
N/A
Protected

Academic year: 2022

Share "第八章"

Copied!
28
0
0

加載中.... (立即查看全文)

全文

(1)

第八章

握把式圖形與 GUI 設計

本 章 重 點

本 章 介 紹 MATLAB 的 握 把 式 圖 形 ( Handle Graphics) ,以及相關的圖形使用者介面(GUI,

Graphic User Interface)設計。善用握把式圖形以及 GUI 設計技巧,您就可以隨心所欲地更改 MATLAB 產生的圖形,並能進一步設計出和善(Friendly)、

直覺(Intuitive)的圖形使用者介面。本章的 GUI 設 計均以基本的 MATLAB 程式設計為主,另一個以 滑鼠為主的 GUI 快速 發展環境,稱為 GUIDE

(Graphic User Interface Design Environment) ,將在

(2)

8-1 握把式圖形簡介

MATLAB 在第四版引進了「握把式圖形(Handle Graphics)」的概念,

之後就一路蓬勃發展,之後的各種工具箱及 demos 都大量使用了以握 把式圖形為主的圖形使用者介面,大大地增加了使用者操作的便利 性。

握把式圖形的概念很簡單,就是將一個圖形的每一個組成元件都視為 一個物件(Object),每一個物件都有一個獨一無二的「握把」(Handle), 就像每一個人有一個獨一無二的身份證字號一樣。根據這個握把,我 們就可以找到這個物件(即圖形元件)的各項性質,並進而更改這些 性質,以產生不同的圖形呈現效果,或定義滑鼠事件(Mouse Events)

的反應指令(Callbacks)。

在握把式圖形的世界中,每一個圖形物件都是隸屬於一個階層結構

(Hierarchy)下的某一類,此階層結構可圖示如下:

下圖即為此種階層結構的一個例子:

UI Controls (UI 控制元件)

Images

(影像)

Lines (線段)

Patches (貼片)

Surfaces (曲面)

Texts (文字)

Lighting (光照) Axes

(圖軸)

UI menus (UI 選單) Figures

(圖形視窗) Root (桌面)

(3)

在上圖中,最上層的物件是 Root,代表電腦的桌面(Desktop),而 每個桌面可以有多個 MATLAB 圖形視窗(Figures),所以我們通常 定義 Figure 是 Root 的孩子(Child),而 Root 則是 Figure 的父親(或 母親,Parent)。同理,每一個 MATLAB 圖形可以包含 UI(User Interface)控制元件(例如 radio button、checkbox 等)、UI 選單、圖 軸等,而每一個圖軸之下又可以包含影像(Images)、線段(Lines)、

貼片(Patches)、曲面(Surfaces)、文字(Texts)及光照(Lighting)

等。因此,我們只要能取得任一個圖形物件的握把,就可以找到此物 圖軸物件 桌面

UI 選單 文字物件 曲面物件 線段物件

圖形視窗物件 UI 控制物件

(4)

8-2 以 GUI 進行圖形物件的性質存取

本節的說明將先以 MATLAB 5.x 為主。有關於 MATLAB 6.x 相關指令 或用法,並無太大差別,因此將留在本節最後介紹。。

每一個握把式圖形物件都帶有一連串的「性質(Properties)」及相對 應的「值(Values)」,我們可以利用 MATLAB 的 propedit 指令來輕 易地改變一個圖形物件的性質。舉例來說,先產生一個簡單的圖形如 下:

>> t = 0:0.1:4*pi;

>> y = exp(-t/5).*sin(t);

>> plot(t, y);

0 2 4 6 8 10 12 14

-0.4 -0.2 0 0.2 0.4 0.6 0.8 1

欲對此圖進行編修,可用 propedit 指令,例如:

>> propedit(gcf) % gcf 會傳回使用中的圖形的握把

(5)

(gcf 是常見的握把式圖形指令,他可以傳回使用中的圖形的握把。)

此時 MATLAB 即會開啟「性質編輯器」(Property Editor),產生的 新視窗如下:

在上圖中,上半部稱為「物件瀏覽區(Object Browser)」,他將各個 圖形物件的階層式關係以類似「檔案總管」的方式呈現出來,您可以 在此階層式架構中選取一個物件,與此物件相關的性質即會陳列在上 圖中半部的「性質陳列區」。然後您就可以點選某些性質,改變其值,

以改變圖形的呈現方式。例如,若想要改變曲線的寬度,我們可以點 選 figure/axes/line,然後再點選「性質陳列區」的 LineWidth,將圖形 寬度由預設的 0.5 改為 3,此時「性質編輯器」的外觀如下:

物件瀏覽區

性質陳列區 性質修改區

(6)

此時再按「Close」或按下鍵盤的 Return 鍵,即可看到曲線的寬度已由 0.5 改成 3。利用同樣的方法,您可以將曲線的「Marker」性質設為「o」,

「MarkerSize」設為「20」,「Color」設為綠色,以得到不同的呈現 效果,請立刻試看看!

「性質編輯器」還有一些特異功能,特別適合高手使用,說明如下:

1. 多項選擇:

您可以同時選擇多項物件(先點選一個物件,再按 Shift 鍵再點 選,或 Ctrl 鍵再點選另一個物件),此時只有共有的性質,會 出現在「性質陳列區」。例如,您可以選取多項物件後,再一 起將他們的「Visible」性質設為 off。

(7)

2. 字串補全:

選取一物件後,您可以在「性質欄位」填入足以辨認的數個字 母,再按下 Return 鍵後,即可自動補全。例如,您可以選取一 個 UI 控制物件,在「性質欄位」填入「pos」並按 Return 鍵,

「性質編輯器」即可將之自動補全為「Position」。

3. 自動刪除:

「性質欄位」會自動忽略第一個空白字元後的字母。因此,若 輸入成「ps」,您可以按 Return 鍵,讓游標回到字頭,再輸入

「pos 」,形成「pos ps」,再按 Return 鍵,「性質欄位」即會 去除空白字元及其後的「ps」,並將「pos」補全成「Position」。

此功能可讓您的手保持在鍵盤上,不必再去動用滑鼠,以增高 輸入的效率。

上述的「性質編輯器」可對任何圖形物件的性質進行存取,功能非常 強大。但是一般來說,我們常改變的圖形物件只有圖軸及曲線(或曲 面)的少數幾個性質,因此更簡單的方法則是直接使用 MATLAB 圖 形視窗的「圖形編輯」功能。例如,當您在 MATLAB 指令視窗輸入 peaks 指令 ,可產生 peaks 函數的三度空間曲面圖形:

(8)

此時您可以點選 ,以啟動圖形編輯功能。然後,您可以點選圖軸,

並按滑鼠右鍵,選取「Properties」,以開啟圖軸編輯畫面,如下:

在以上的編輯視窗中,將 Z 軸的 Scale 改為「Log」,即可將 peaks 函 數的高度以對數呈現,經此編輯後的圖形如下:

(9)

經由同樣的方法,您也可以編輯曲線的各種常用性質,在此不再贅 述。

提 示 :

8 MATLAB 的 GUI(圖形使用者介面)均以「直覺、友善」為最高指導原則,

因此基本上都能夠「一玩就會」,所以我極力推薦各位讀者直接去試試看這些 介面。

以上的說明,均是根據 MATLAB 5.x,如果您用的是 MATLAB 6.x,

功能上並無太大差異,最大的差異乃在於 propedit 指令並無法直接修

改圖形視窗物件的性質,此時您可以點選圖形視窗的 圖示以啟動 圖形編輯功能,並直接以滑鼠右鍵點選圖形物件,以改變其性質。

(10)

8-3 以命令列進行圖形物件的性質存取

本節介紹如何以命令列來進行圖形物件的性質存取,這些指令完全適 用於 MATLAB 5.x 及 6.x。

我們也可以使用指令列的方式來改變一個圖形的各種性質,最常用到 的是 set 與 get 指令,其中 set 指令可用來設定某個性質的值,而 get 指 令可用於取得某個性質的值。例如:

>> t = 0:0.1:4*pi;

>> y = exp(-t/5).*sin(t);

>> h = plot(t, y); % h 為曲線的握把

>> set(h, 'linewidth', 3); % 將曲線寬度改為 3

>> set(h, 'Marker', 'o'); % 將曲線的線標改成小圓圈

>> set(h, 'MarkerSize', 20); % 將線標的大小改成 20

0 2 4 6 8 10 12 14

-0.4 -0.2 0 0.2 0.4 0.6 0.8 1

我們也可以將上述三個 set 指令合成一個:

(11)

>> set(h, 'LineWidth', 3, 'Marker', 'o', 'MarkerSize', 20);

單獨使用 set(h),可以列出 h 的所有性質及這些性質的預設值,例如:

>> set(h)

指令執行結果:

Color

EraseMode: [ {normal} | background | xor | none ] LineStyle: [ {-} | -- | : | -. | none ]

LineWidth

Marker: [ + | o | * | . | x | square | diamond | v | ^ |

> | < | pentagram | hexagram | {none} ] MarkerSize

MarkerEdgeColor: [ none | {auto} ] -or- a ColorSpec.

MarkerFaceColor: [ {none} | auto ] -or- a ColorSpec.

XData YData ZData

ButtonDownFcn Children

Clipping: [ {on} | off ] CreateFcn

DeleteFcn

BusyAction: [ {queue} | cancel ]

HandleVisibility: [ {on} | callback | off ] HitTest: [ {on} | off ]

Interruptible: [ {on} | off ] Parent

Selected: [ on | off ]

SelectionHighlight: [ {on} | off ]

(12)

在上例中,以大括弧表示的數值(或字串)即為預設值。若欲取得某 一個性質的值,可用 get 指令,例如,欲取得 h 的顏色,可輸入如下:

>> get(h, 'Color') ans =

0 0 1

若要得知 h 的所有性質的值,可用 get(h),例如:

>> get(h)

指令執行結果:

Tag

UIContextMenu UserData

Visible: [ {on} | off ]

Color = [0 0 1]

EraseMode = normal LineStyle = - LineWidth = [3]

Marker = o

MarkerSize = [20]

MarkerEdgeColor = auto MarkerFaceColor = none

XData = [ (1 by 126) double array]

YData = [ (1 by 126) double array]

ZData = []

ButtonDownFcn = Children = []

Clipping = on

(13)

提 示 :

8 一般而言,每一個圖形物件的性質都有數十種之多,但真正常用到的性質大概 不到十種。

另一個常用到的指令是 findobj,為「find objects」的簡稱,此指令可 在握把式圖形的階層式結構中,找出您要的物件。例如,欲找出所有 的曲線物件,可輸入如下:

>> plot(rand(10, 2)); % 畫出兩條曲線 CreateFcn =

DeleteFcn =

BusyAction = queue HandleVisibility = on HitTest = on

Interruptible = on Parent = [73.0009]

Selected = off

SelectionHighlight = on Tag =

Type = line

UIContextMenu = []

UserData = []

Visible = on

(14)

1 2 3 4 5 6 7 8 9 10 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

>> h = findobj(0, 'type', 'line') % 找出曲線的握把 h =

1.0051 74.0016

>> set(h, 'LineWidth', 3); % 經由握把將曲線寬度改為 3

(15)

1 2 3 4 5 6 7 8 9 10 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

在上例中第二個敘述中,「0」代表桌面,因此上例的二、三列敘述 的意義為「找出所有型態為 line 的物件,並將其曲線寬度改為 3」,

傳回的向量 h 長度為 2,代表共找到兩個型態為 line 的物件。

8-4 M 檔案進行 GUI 的設計

到現在為止,您應該看過很多以 GUI 為主的 MATLAB 應用程式了 吧?(如果還沒有,請趕快試試 xpsound、travel、truss、lorenz 等指 令。)本節將簡單介紹如何在指令視窗建立類似的 GUI 設計。(另一 個 GUI 的設計方法,則是使用 GUIDE 發展環境,詳見下一章介紹。)

MATLAB 的 uicontrol 是產生 UI 控制物件的主要指令。以下是一個產 生按鈕(Push Button)的最簡單例子,請將之逐列輸入於 MATLAB 指 令視窗:

(16)

>> set(h, 'String', 'Push me!'); % 在按鈕表面加入文字「Push me!」

>> cmd = 'fprintf(''Somebody pushed me!\n'');';

% 以字串定義按鈕被按後的反應指令

>> set(h, 'Callback', cmd); % 設定按鈕的反應指令

執行完畢後,MATLAB 會產生一個空白視窗,上面有一個按鈕(如下 圖),每次在點選此按鈕後,MATLAB 的指令視窗即會出現「Somebody pushed me!」的文字。

在上例中,由於 UI 控制物件是圖形物件的孩子,因此若沒有現成的 圖形視窗,MATLAB 會新增一圖形視窗來容納 UI 控制物件。此外,

所有 UI 控制物件的反應指令(Callbacks,亦即按下 UI 控制物件後,

MATLAB 執行的指令)都必須以字串來定義,因此若在反應動作中又 出現字串(如上例的「Somebody pushed me!」),則必須以兩個「''」

(Double Quote)來框住字串。(有關字串的處理,可詳見本書第十 一章「字元與字串」。)

MATLAB 5.x 支援的 UI 控制物件可呈現如下:

(17)

>> uicontrol('style', 'push', 'position', [200 20 80 30]);

>> uicontrol('style', 'slide', 'position', [200 70 80 30]);

>> uicontrol('style', 'radio', 'position', [200 120 80 30]);

>> uicontrol('style', 'frame', 'position', [200 170 80 30]);

>> uicontrol('style', 'check', 'position', [200 220 80 30]);

>> uicontrol('style', 'edit', 'position', [200 270 80 30]);

>> uicontrol('style', 'list', 'position', [200 320 80 30], 'string', '1|2|3|4');

>> uicontrol('style', 'popup', 'position', [200 370 80 30], 'string', 'one|two|three');

在上述例子中,style 後面所接的字串即代表 UI 控制物件的類別,而 position 後面所接的向量即代表 UI 控制物件在圖形視窗的位置,以 [x, y, width, length] 為例,即代表 UI 控制物件的左下角之座標為 [x, y],長 度為 width,高度為 length (均以 Pixel 為單位)。

提 示 :

8 MATLAB 6.x 的 UI 控制物件比 5.x 更加豐富,新增的支援包含:「活頁夾」

(Tab Panel)、「樹狀瀏覽結構」(Tree View,即類似微軟的檔案總管)、

「組合箱」(Combobox)、「表單」(Table)、「名片盒」(Card Panel)、

「捲軸」(Scrollbar)、「切換鈕」(Toggle Button)等,非常方便!您可 從 MATLAB 6.x 的線上支援查到相關資料。

以 下 介 紹 另 外 一 個 較 複 雜 的 例 子 , 其 檔 案 名 稱 為 ui1.m , 您 可 在 MATLAB 指令視窗下輸入「ui1」,即可得到一個圖形視窗及相關的 UI 控制物件,如下圖:

(18)

上圖有三個UI控制物件,第一個UI控制物件可顯示或消除背景的格線

(Grid Lines);第二個 UI 控制物件可讓使用者輸入 X 軸及 Y 軸的格 子點(Grid Points)數目;第三個 UI 控制物件則可以改變顯示曲面的 色盤矩陣(Colormap)。您可以隨意點選或改變這些 UI 控制物件,並 觀察圖形和背景的變化。

為使讀者瞭解這個例子,我們在程式碼中加了很多註解,主程式為 ui1.m,其內容可列出如下:

>>type ui1.m

檔案 ui1.m 的內容:

% 產生新圖形視窗,其左下角之座標為[30, 30],

% 長度為300,高度為200(均以Pixel為單位)

figure('position', [30 30 300 200]);

% 在圖形視窗內產生一個圖軸,其左下角之座標為[0.1, 0.2],

% 長度為0.8,高度為0.8(使用標準化的單位,即圖形的左下角為[0, 0],

% 長度及高度都是1。)

(19)

axes('position', [0.1 0.2 0.8 0.8]);

% 視窗上的第一個圖形,為三度空間的peaks函數。

point_n = 20;

[xx, yy, zz] = peaks(point_n);

surf(xx, yy, zz);

axis tight

% 第一個UI控制物件,用以控制背景格線的顯示。

pos1 = [10, 10, 60, 20];

h1 = uicontrol('style', 'checkbox', 'string', 'Grid on', ...

'position', pos1, 'value', 1);

% 第二個UI控制物件,用以指定X軸及Y軸的格子點數目。

pos2 = [90, 10, 60, 20];

h2 = uicontrol('style','edit', ...

'string', int2str(point_n), ...

'position', pos2, 'backgroundColor', [1 1 1]);

% 第三個UI控制物件,用以指定顯示曲面所用到的調色盤。

pos3 = [170, 10, 60, 20];

h3 = uicontrol('style', 'popupmenu', ...

'string', 'hsv|gray|hot|cool|pink|jet', ...

'position', pos3);

% 第一個UI控制物件的反應指令為「grid」。

set(h1, 'callback', 'grid');

% 第二個UI控制物件的反應指令為「cb2」。

set(h2, 'callback', 'cb2');

(20)

此 M 檔案還會呼叫另外兩個 M 檔案,分別是 cb2.m 及 cb3.m,其內容 可列出如下:

>> type cb2.m

檔案 cb2.m 的內容:

% 取得第二個UI控制物件的數值。

point_n = round(str2num(get(h2, 'string')));

% 若數字太大或太小,則設定為10。

if point_n <= 1 | point_n > 100, point_n = 10;

end

set(h2, 'string', int2str(point_n));

% 根據所得的數字,重畫peaks曲面。

[xx, yy, zz] = peaks(point_n);

surf(xx, yy, zz);

axis tight;

% 根據第一個UI控制物件,決定是否要畫格線。

if get(h1, 'value')==1, grid on;

else

grid off;

end

(21)

>> type cb3.m

檔案 cb3.m 的內容:

在上例的程式設計方法,我們可以發覺有三個缺點:

1. 需要使用三個檔案,管理不方便。

2. 使用的變數都在 MATLAB 基本工作空間中,容易造成變數的 相衝及覆蓋。

可解決上述問題的一個簡單的方法,是將所有的程式碼集中於一個函 示中,並以不同的輸入字串來指示函式所需執行的功能,此種 GUI 程 式 設 計 的 方 法 在 MATLAB 的 各 種 demo 程 式 常 被 用 到 , 特 稱 為

「 Switchyard Programming 」 。 以 上 例 來 說 , 以 「 Switchyard

% 根據第三個UI控制物件來決定使用的色盤矩陣。

switch get(h3, 'value') case 1

colormap(hsv);

case 2

colormap(gray);

case 3

colormap(hot);

case 4

colormap(cool);

case 5

colormap(pink);

case 6

colormap(jet);

otherwise

disp('Unknown option');

end

(22)

>> type ui2.m

檔案 ui2.m 的內容:

function ui2(action)

if nargin == 0,

action = 'initialize';

end

switch(action)

case 'initialize' % 圖形視窗及UI控制物件的初始化。

% 產生新圖形視窗,其左下角之座標為[30, 30],

% 長度為300,高度為200(均以Pixel為單位)

figH = figure('position', [30 30 300 200]);

% 在圖形視窗內產生一個圖軸,其左下角之座標為[0.1, 0.2],

% 長度為0.8,高度為0.8(使用標準化的單位,即圖形的左下角為[0, 0],

% 長度及高度都是1。)

axes('position', [0.1 0.2 0.8 0.8]);

% 視窗上的第一個圖形,為三度空間的peaks函數。

point_n = 20;

[xx, yy, zz] = peaks(point_n);

surf(xx, yy, zz);

axis tight

% 第一個UI控制物件,用以控制背景格線的顯示。

pos1 = [10, 10, 60, 20];

h1 = uicontrol('style', 'checkbox', ...

(23)

'tag', 'UI1', ...

'string', 'Grid on', ...

'position', pos1, 'value', 1);

% 第二個UI控制物件,用以指定X軸及Y軸的格子點數目。

pos2 = [90, 10, 60, 20];

h2 = uicontrol('style', 'edit', ...

'tag', 'UI2', ...

'string', int2str(point_n), ...

'position', pos2, 'backgroundColor', [1 1 1]);

% 第三個UI控制物件,用以指定顯示曲面所用到的調色盤。

pos3 = [170, 10, 60, 20];

h3 = uicontrol('style', 'popupmenu', ...

'tag', 'UI3', ...

'string', 'hsv|gray|hot|cool|pink|jet', ...

'position', pos3);

% 第一個UI控制物件的反應指令為「grid」。

set(h1, 'callback', 'grid');

% 第二個UI控制物件的反應指令為「ui2('callback2')」。

set(h2, 'callback', 'ui2(''callback2'')');

% 第三個UI控制物件的反應指令為「ui2('callback3')」。

set(h3, 'callback', 'ui2(''callback3'')');

case 'callback2' % 第二個UI控制物件的callback。

% 找出第一及第二個UI控制物件的握把。

h1 = findobj(0, 'tag', 'UI1');

h2 = findobj(0, 'tag', 'UI2');

% 取得第二個UI控制物件的數值。

(24)

% 若數字太大或太小,則設定為10。

if point_n <= 1 | point_n > 100, point_n = 10;

end

set(h2, 'string', int2str(point_n));

% 根據所得的數字,重畫peaks曲面。

[xx, yy, zz] = peaks(point_n);

surf(xx, yy, zz);

axis tight;

% 根據第一個UI控制物件,決定是否要畫格線。

if get(h1, 'value')==1, grid on;

else

grid off;

end

case 'callback3' % 第三個UI控制物件的callback。

% 找出第三個UI控制物件的握把。

h3 = findobj(0, 'tag', 'UI3');

% 根據第三個UI控制物件來決定使用的色盤矩陣。

switch get(h3, 'value') case 1

colormap(hsv);

case 2

colormap(gray);

case 3

colormap(hot);

(25)

在上例中,我們為了要能夠找出三個 UI 控制物件的握把,因此特別 設定他們個別的「Tag」值,因此若要用到這些 UI 控制物件,可用 findobj 指令來直接來找出他們的握把。

8-5 以 M 檔案設定滑鼠事件的的反應指令

在設計 GUI 時,千萬別忘了滑鼠的重要性,您可以設計一個圖形視 窗,使得滑鼠在此圖形的各項動作(稱為「滑鼠事件(Mouse Events)」, 例如按下、移動及釋放等),都可以觸發一連串的反應指令,達成您 要的效果。

在設定滑鼠事件的反應指令時,最相關的性質為:

l WindowButtonDownFcn:滑鼠按鈕按下時反應指令 case 4

colormap(cool);

case 5

colormap(pink);

case 6

colormap(jet);

otherwise

disp('Unknown option');

end

otherwise,

error('Unknown action string!');

end

(26)

這些性質都是附屬於一個圖形視窗,因此,他們規範了在此圖形視窗 下,各項滑鼠事件的反應指令。

一般而言,我們希望滑鼠先被按下,然後再移動滑鼠時,才會觸發移 動時的反應指令。欲達到此效果,我們必須做下列項:

l 在 滑 鼠 按 鈕 被 按 下 時 , 設 定 WindowButtonMotionFcn 及 WindowButtonUpFcn 的值。

l 在 滑 鼠 按 鈕 被 釋 放 時 , 清 除 WindowButtonMotionFcn 及 WindowButtonUpFcn 的值。

因 此 , 只 有 在 滑 鼠 按 鈕 被 按 下 , 且 滑 鼠 在 移 動 時 , 對 應 於 WindowButtonMotionFcn 的反應指令才會被呼叫。

以下我們用一個簡單的例子來說明。在這個例子中,滑鼠事件會產生 下列反應:

l 按下滑鼠時,MATLAB 指令視窗會出現「Mouse down!」的 訊息。

l 按下並移動滑鼠時,MATLAB 會在圖形視窗畫出滑鼠軌跡,並 指令視窗印出「Mouse is moving!」及當時滑鼠的位置。

l 釋放滑鼠時,MATLAB 指令視窗會出現「Mouse up!」的訊息。

您可以在 MATLAB 指令視窗輸入 tmouse.m 來試看看此檔案,其圖形 視窗的外觀如下:

(27)

我們已在 tmouse.m 加入詳細註解,其內容可顥示如下:

>> type tmouse.m

檔案 tmouse.m 的內容:

function tmouse(action)

% TMOUSE 本例展示如何以Handle Graphics來設定滑鼠事件(Mouse

% Events)的反應指令(Callbacks)

if nargin == 0, action = 'start'; end switch(action)

% 開啟圖形視窗 case 'start',

axis([0 1 0 1]); % 設定圖軸範圍

box on; % 將圖軸加上圖框

title('Click and drag your mouse in this window!');

% 設定滑鼠按鈕被按下時的反應指令為「tmouse down」

(28)

% 滑鼠按鈕被按下時的反應指令 case 'down',

% 設定滑鼠移動時的反應指令為「tmouse move」

set(gcf, 'WindowButtonMotionFcn', 'tmouse move');

% 設定滑鼠按鈕被釋放時的反應指令為「tmouse up」

set(gcf, 'WindowButtonUpFcn', 'tmouse up');

% 列印「Mouse down!」訊息 fprintf('Mouse down!\n');

% 滑鼠移動時的反應指令 case 'move',

currPt = get(gca, 'CurrentPoint');

x = currPt(1,1);

y = currPt(1,2);

line(x, y, 'marker', '.', 'EraseMode', 'xor');

% 列印「Mouse is moving!」訊息及滑鼠現在位置

fprintf('Mouse is moving! Current location ...

= (%g, %g)\n', currPt(1,1), currPt(1,2));

% 滑鼠按鈕被釋放時的反應指令 case 'up',

% 清除滑鼠移動時的反應指令

set(gcf, 'WindowButtonMotionFcn', '');

% 清除滑鼠按鈕被釋放時的反應指令

set(gcf, 'WindowButtonUpFcn', '');

% 列印「Mouse up!」訊息 fprintf('Mouse up!\n');

end

參考文獻

相關文件

Z 指令 ping 為重要的使用 ICMP 封包的指令. Z 若設定防火牆,並非所有的 ICMP

從幾何上看,一個在區間上的每一點都連續的函數,其函數 圖形沒有分斷。直觀上,這樣的連續圖形我們可以一筆劃完

上列兩個範例是屬於連續型資料相同,但是組距不相同,比較看看,統計圖表有

[r]

1.圓桌武士:亞瑟王的圓桌是聖徒約瑟使用過的一張巨大圓桌。這張圓桌被視為 國寶,共有 250 個座位,可容納 250

檢查圖形上的每一點在對稱軸之兩側等距離位置是否都有對稱點,若 有,則此圖形是線對稱圖形。. ( 若圖形可以拿起來對折,可以沿著對稱軸對折,檢查圖形是否會完全

疊對(overlay)的方式是指兩層的定位與相互考量的 x 和 y 方向,如果所有的疊對 層在晶圓上沒有偏移,亦即代表 overlay value=0 ,通常 overlay =0 是目標值。而 overlay

圖 4.7 是場景一的俯視圖,可以由圖中得知牆壁出現在自走車的左側,而 自走車根據所在位置定義直走是 Y 軸方向,而右轉是 X 軸方向。初始位置自走車