版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Matlab交互式程序設(shè)計(jì)教程及舉例一、創(chuàng)建GUI(GraphicsUserInterface)新文件和編輯已經(jīng)存在的GUI文件1、在matlab命令窗口中鍵入guide,彈出如下的對(duì)話框:GUIDEQuickStartCreateNewGUIOpenExistingGUIPreview是一個(gè)雙頁(yè)面對(duì)話框,startupas:E:l分別用于創(chuàng)建新文件和打開已存在的GUI文件,口鼠標(biāo)點(diǎn)擊相應(yīng)的GUIDEtemplatesJBlankGUI(Default)嫌GUIwithUicontrols嫌GUIwithAxesandMenu嫌ModalQuestionDialogCancelHelpOK按畫
2、|進(jìn)行布局。(用戶可將鼠標(biāo)懸停在各個(gè)控件圖表上查看各個(gè)對(duì)象的名稱)菜單欄下邊是工具(保存當(dāng)前HC3TKTS、耳FileEditViewL:youtToolsHelp其中左邊是控件工具欄,用戶可根據(jù)自己的程序?qū)⑺枰目丶檬髽?biāo)拖至右側(cè)的編輯區(qū)域條,其中常用的有“2、圖中可見“創(chuàng)建新的鈕可打開如圖所示的GUI編輯器GUI”有四種模版選項(xiàng),不管其它幾個(gè),點(diǎn)選第一項(xiàng),按“GUI文件和相應(yīng)的m文件)、“囪(編寫相應(yīng)協(xié)調(diào)運(yùn)行的即可切換。m文件、“西叩編輯當(dāng)前控件的相應(yīng)屬性)、“”(創(chuàng)建和修改用戶自己的程序菜單)、“拖動(dòng)GUI設(shè)計(jì)窗口左側(cè)的“PushButton”控件至右側(cè)設(shè)計(jì)區(qū)域中的自己希望的位置,放開
3、(保存當(dāng)前文件并運(yùn)行改程序)。右下方主要區(qū)域是程序的界面布局窗口(灰色網(wǎng)格區(qū)域是布局區(qū)域,用戶可根據(jù)程序需要用鼠標(biāo)拖動(dòng)該區(qū)域的右下角調(diào)整該區(qū)域的大?。?、此時(shí)可以按下“O圖標(biāo)保存該文件(自然此時(shí)程序沒有任何功能,只有一個(gè)主框架)彈出文件保存對(duì)話框,在文件名處輸入一個(gè)文件名(英文字母開頭),如“my1”等,擴(kuò)展名.fig”。系統(tǒng)除了保存當(dāng)前的界面文件外,還自動(dòng)生成一個(gè)與該界面一起協(xié)調(diào)my1.m”文件,并在4、瀏覽一下該文件,可以看到該文件中目前自動(dòng)創(chuàng)建了自動(dòng)設(shè)置為“運(yùn)行的“m文件編輯窗口中打開它。3個(gè)函數(shù):functionvarargout=myl(varargin)functionmyl_Op
4、eningFcn(hObject,eventdata,functionvarargout=myl_OutputFcn(hObject,handles,varargin)eventdata,handles)這些函數(shù)聲明和參數(shù)在后續(xù)的程序設(shè)計(jì)中不要做任何修改,切記!對(duì)我們目前的應(yīng)用來(lái)說(shuō)第一個(gè)函數(shù)和第三個(gè)函數(shù)的程序體也不要做任何修改。根據(jù)自己的程序涉及需要只需修改第二個(gè)函數(shù)的程序體部分。(具體的修改方式可以通過(guò)我的例子程序加以體會(huì)。注意第二個(gè)函數(shù)程序體的最后一條語(yǔ)句guidata(hObject,handles);該語(yǔ)句在后續(xù)的程序設(shè)計(jì)中將會(huì)頻繁使用,現(xiàn)在請(qǐng)先記住它。5、祝賀你!你現(xiàn)在已經(jīng)有了一個(gè)名
5、為“myl.fig”的可以運(yùn)行的文件了!現(xiàn)在可以在matlab命令窗口中鍵入“my1.m”和“my1”運(yùn)行改程序,自然,除了顯示一個(gè)標(biāo)題為“my1”m文件、“西叩編輯當(dāng)前控件的相應(yīng)屬性)、“”(創(chuàng)建和修改用戶自己的程序菜單)、“拖動(dòng)GUI設(shè)計(jì)窗口左側(cè)的“PushButton”控件至右側(cè)設(shè)計(jì)區(qū)域中的自己希望的位置,放開m文件、“西叩編輯當(dāng)前控件的相應(yīng)屬性)、“”(創(chuàng)建和修改用戶自己的程序菜單)、“拖動(dòng)GUI設(shè)計(jì)窗口左側(cè)的“PushButton”控件至右側(cè)設(shè)計(jì)區(qū)域中的自己希望的位置,放開,因?yàn)槟氵€沒的空白窗口外,你還不能進(jìn)行任何交互式控制操作(自然除了關(guān)閉該窗口外)有寫任何控制程序和添加任何控件。
6、二、增加控件及編寫相應(yīng)的執(zhí)行程序m文件、“西叩編輯當(dāng)前控件的相應(yīng)屬性)、“”(創(chuàng)建和修改用戶自己的程序菜單)、“拖動(dòng)GUI設(shè)計(jì)窗口左側(cè)的“PushButton”控件至右側(cè)設(shè)計(jì)區(qū)域中的自己希望的位置,放開1、現(xiàn)在可以編輯運(yùn)行窗口的標(biāo)題欄即將“myl”修改為自己希望的標(biāo)題,本例中我改為“參數(shù)a,b,n對(duì)r=acos(nt+b)的影響”。西”工具條圖標(biāo),彈出如下的“屬性編輯框”在GUI設(shè)計(jì)窗口中點(diǎn)擊“前修改并運(yùn)行程序。的標(biāo)題欄已經(jīng)變成了“參數(shù)西”工具條圖標(biāo)),它共有,右列是每個(gè)屬性的可以編“my1”改為“參數(shù)2列,a,b,nOK!窗口a,b,n對(duì)r=acos(nt+b)的影響”2、現(xiàn)在開始程序的布局
7、及控制設(shè)計(jì),先從最簡(jiǎn)單的一個(gè)控制按鈕開始。則界面中的第一個(gè)控件就緒。鼠標(biāo),然后可以點(diǎn)選并拖動(dòng)該控件的右下角改變?cè)摽丶拇笮?,目前可以點(diǎn)擊“L”以保存當(dāng)前修改并運(yùn)行程序。發(fā)生了什么事情?運(yùn)行窗口的響應(yīng)位置處有了這個(gè)交互式控制按鈕!點(diǎn)擊這個(gè)按鈕,除了按鈕自動(dòng)界面上有個(gè)形象的動(dòng)態(tài)響應(yīng)外,不會(huì)有任何響應(yīng),因?yàn)槟壳拔覀冞€沒有編寫任何控制程序。3、現(xiàn)在我們開始編寫該控制程序。點(diǎn)擊“口”工具欄圖標(biāo),打開m文件編輯器,瀏覽相應(yīng)的文件,會(huì)發(fā)現(xiàn)文件末尾多了一個(gè)函數(shù)頭:functionpushbutton1_Callback(hObject,eventdata,handles)這是系統(tǒng)自動(dòng)生成的相應(yīng)按鈕控件的回調(diào)函
8、數(shù),系統(tǒng)自動(dòng)將其命名為pushbutton代表該控件的類別是“設(shè)計(jì)中所創(chuàng)建的第幾個(gè)(該控件名稱用戶可以進(jìn)行修改,具體修改方法見下一條說(shuō)明)在用戶可以在該函數(shù)頭下邊填寫相應(yīng)的自己所希望的控制程序。目前我們只希望用戶點(diǎn)擊按鈕時(shí)進(jìn)行一個(gè)簡(jiǎn)單的操作:結(jié)束當(dāng)前程序并關(guān)閉該窗口。這只需如下的一條語(yǔ)句即可:(將之寫在該函數(shù)頭的下面)close;保存修改后的m文件,回到GUI設(shè)計(jì)窗口,再次點(diǎn)擊“口中點(diǎn)擊該按鈕。哈哈!如我所愿,程序安全退出了!4、下面我們可以調(diào)整該按鈕的界面顯示和將自動(dòng)生成的記住的個(gè)性化名字。在GUI設(shè)計(jì)窗口中點(diǎn)擊此按鈕,然后點(diǎn)擊工具條上的“性編輯框”已調(diào)整它的名稱和運(yùn)行時(shí)的界面屬性(任選)p
9、ushbuttonl,其中PushButton”,后面的阿拉伯?dāng)?shù)字代表這是用戶在界面宀”運(yùn)行程序,然后在運(yùn)行后的窗SoEasy!“pushbuttonl”名稱改為自己容易西”工具條圖標(biāo),彈出相應(yīng)的“屬。本例中我的調(diào)整如下:。現(xiàn)(1)找到“tag”屬性,將其后的“pushbuttonl”改為“jieshu”;(此時(shí)如果保存修改,然后進(jìn)入相應(yīng)的m文件編輯窗口,可以驚喜地看到其中的最后一個(gè)函數(shù)也進(jìn)行了相應(yīng)的修改:(將函數(shù)頭中的“pushbuttonl”變成了“jieshu”)functionjieshu_Callback(hObject,eventdata,handles)%hObjecthandl
10、etojieshu(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)close;(2)在屬性編輯框中找到“String”一欄,將后面的內(nèi)容改為“結(jié)束”;找到“FontSize”,將后面的內(nèi)容改為“20”;找到“ForegroundColor”,點(diǎn)擊左右兩欄間的圖標(biāo),彈出顏色選擇窗口,點(diǎn)選自己喜歡的顏色;找到“FontName”,將后續(xù)的內(nèi)容改為“楷體_GB2312”,找到“FontWeight”,點(diǎn)擊后面的圖標(biāo),在下拉
11、菜單中選擇“Bold”一項(xiàng)。現(xiàn)在再運(yùn)行程序,觀察運(yùn)行界面的變化,體會(huì)各個(gè)屬性值和屬性名的調(diào)整對(duì)按鈕外觀的影響。5、現(xiàn)在在GUI設(shè)計(jì)窗口中再建立一個(gè)按鈕,(界面的詳細(xì)設(shè)計(jì)略),本例中我講顯示字符改為了“文檔”,它的“Tag”改為了“help”.進(jìn)入m文件編輯器,發(fā)現(xiàn)最后又增加了一個(gè)函數(shù):functionhelp_Callback(hObject,eventdata,handles)在該函數(shù)頭下編寫下列一條程序:winopen(code.pdf);其功能是將程序控制權(quán)交給windows,由windows打開引號(hào)內(nèi)所指定的一個(gè)當(dāng)前路徑下的文件,本例中我隨便選了一個(gè)PDF文檔,在程序執(zhí)行時(shí)點(diǎn)擊該按鈕即
12、可打開該文檔。大家最后上交的綜合作業(yè)中的文檔及使用說(shuō)明幫助文件我希望大家以這樣連接的方式可以讓我順利簡(jiǎn)單地打開。6、繼續(xù)界面的設(shè)計(jì)工作。為了在程序的運(yùn)行界面中顯示圖形,需要建立圖形窗口,建立的過(guò)程很簡(jiǎn)單,同樣是拖動(dòng)GUI設(shè)計(jì)見面中左側(cè)的“Axis”控件至右側(cè)的界面布局窗口的自己希望的位置,然后用鼠標(biāo)拖動(dòng)方式調(diào)整其大小即可。本例中我建立了兩個(gè)圖形窗口,其“Tag”名系統(tǒng)自動(dòng)生成為“Axesl”和“Axes2”(用戶也可同樣通過(guò)屬性編輯窗口修改為自己個(gè)性化的名稱,本例中我沒有做相應(yīng)的修改)。此外,我又建立了第三控制按鈕,其“Tag”屬性改為了“jump”,“String”屬性改為了“跳起來(lái)”,并進(jìn)
13、行了如下的布局。!afayl.figFileEditViewLayoutToolsHelp畫串腎翻旬圖轡EDITTKT以在mfunction該按DOODOO7、在布局界面上“slid個(gè)參數(shù)的調(diào)整,別如下:functionhObjeceventd再增加兩此時(shí)瀏覽一下)ofslide文件中看到此時(shí)又多了一個(gè)新的函數(shù)文件頭-jum較為復(fù)雜后續(xù)中我再詳細(xì)說(shuō)明,現(xiàn)在先不寫任何程序?!皊lider”er2”,我在本例中依次用它們?cè)诔绦蜻\(yùn)行時(shí)控制顯示圖像的函數(shù)中的“sliderl_Callback(hObject,eventdata,handles)atahandlesstructurewithhandle
14、sanduserdata(seeGUIDATA)%HKiositionet(hObject,Valueget(hObject,Min)andget(hObject,Max)todeterminerangeofslider%-Executesduringobjectcreation,aftersettingallproperties.functionslider1_CreateFcn(hObject,eventdata,handles)%hObjecthandletoslider1(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofM
15、ATLAB%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled%Hint:slidercontrolsusuallyhavealightgraybackground,change%usewhitebgto0tousedefault.SeeISPCandCOMPUTER.usewhitebg=1;ifusewhitebgset(hObject,BackgroundColor,.9.9.9);elseset(hObject,BackgroundColor,get(0,defaultUicontrolBackgroundColor)
16、;end%-Executesonslidermovement.functionslider2_Callback(hObject,eventdata,handles)%hObjecthandletoslider2(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%Hints:get(hObject,Value)returnspositionofslider%get(hObject,Min)andget(hObject,M
17、ax)todeterminerangeofslider%-Executesduringobjectcreation,aftersettingallproperties.functionslider2_CreateFcn(hObject,eventdata,handles)%hObjecthandletoslider2(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled%Hint:slidercontro
18、lsusuallyhavealightgraybackground,change%usewhitebgto0tousedefault.SeeISPCandCOMPUTER.usewhitebg=1;ifusewhitebgset(hObject,BackgroundColor,.9.9.9);elseset(hObject,BackgroundColor,get(0,defaultUicontrolBackgroundColor);我們需要對(duì)于兩個(gè)動(dòng)條時(shí)應(yīng)該引起何種響應(yīng),值。end其中的兩個(gè)_CreateFcn我們后續(xù)不需任何操作,所以也不需要任何修改,現(xiàn)在先記住.Callback函數(shù)進(jìn)行程序
19、的填寫操作,以響應(yīng)當(dāng)程序執(zhí)行時(shí)當(dāng)用戶拖動(dòng)滾GUI界面中修改其屬性現(xiàn)在先在具體的響應(yīng)程序也在后續(xù)填寫,選中“Sliderl”,打開相應(yīng)的屬性編輯器,找到其中的“Max”一欄,將后面的內(nèi)容改為“8”(本例我的“a”值最大值為8),找到其中的“Min”一欄,將后面的內(nèi)容改為“1”(本例我的“a”值最小值為1),找到“Value”一欄,點(diǎn)擊后面的圖標(biāo),在彈出的對(duì)話框中將“0.0”改為“5”,以指定在程序進(jìn)行運(yùn)行時(shí)將該滾動(dòng)條的值設(shè)置為5。此時(shí)可以運(yùn)行程序,觀察第一個(gè)滾動(dòng)條中的滑塊位置應(yīng)該在中間偏右的位置,這說(shuō)明上述設(shè)定已經(jīng)成功?!癝lider2”我在這里先不做調(diào)整,系統(tǒng)自動(dòng)默認(rèn)最小值為0,最大值為1,當(dāng)
20、前值為0,邏輯上本例的“b”值應(yīng)該在0與2n之間,作為示例,我在后續(xù)的程序書寫中將獲得的該滾動(dòng)條上的當(dāng)前值乘以2n來(lái)進(jìn)行相應(yīng)的調(diào)整。作為示例,我對(duì)于本程序中參數(shù)n用一個(gè)“EditText”進(jìn)行程序運(yùn)行中的輸入控制,所以在界面上再產(chǎn)生一個(gè)“EditText”,系統(tǒng)自動(dòng)將其“Tag”設(shè)置為“edit1”,我對(duì)此不作修改,只是將其“FontSize”屬性調(diào)整為“16”,將String屬性改為“1”。此時(shí)檢查m文件,可以觀察到系統(tǒng)又自動(dòng)創(chuàng)建了2個(gè)函數(shù):functionedit1_Callback(hObject,eventdata,handles)functionedit1_CreateFcn(hOb
21、ject,eventdata,handles)同樣其中的edit1_CreateFcn我們也不要進(jìn)行任何改動(dòng),目前先記住日后在edit1.Callback中編寫程序以響應(yīng)用戶在程序運(yùn)行時(shí)響應(yīng)的輸入即可。到此,本示例程序的控制對(duì)象和2個(gè)繪圖區(qū)域已經(jīng)完全建立完畢,目前我安排的界面如圖所示。a,b,8、下面增加界面屬性值,個(gè)控件分別用于控制哪個(gè)參數(shù),為此,將它們的“String”屬性分別設(shè)置為“a”、“bDDDn”,大小和顏色等外觀形象進(jìn)行適當(dāng)?shù)恼{(diào)整。在第一個(gè)滾動(dòng)條下的左右兩端各放置一個(gè)“StaticText”,分別用于說(shuō)明該滾動(dòng)條的最大值和最小值,為此將它們的“String”屬性分別設(shè)置為“1”、
22、“8”;在第二個(gè)滾動(dòng)條下的左右兩端各放置一個(gè)“StaticText”,分別用于說(shuō)明該滾動(dòng)條的最大值和最小值,為此將它們的“String”屬性分別設(shè)置為“0”、“2n”。最后,在兩個(gè)滾動(dòng)條下方中部分別放置一個(gè)“StaticText”對(duì)象,分別用于實(shí)時(shí)顯示對(duì)應(yīng)的滾動(dòng)條在程序運(yùn)行時(shí)被用戶拉動(dòng)時(shí)當(dāng)前的具體數(shù)值,所以其“String”屬性值將來(lái)在程序中即時(shí)獲取,因此在目前設(shè)計(jì)階段不進(jìn)行調(diào)整,但為了避免混淆,將二者的“Tag”屬性分別修改為“texta”和“textb”以便于進(jìn)行程序控制,具體實(shí)現(xiàn)方式參見后續(xù)程序的編寫。這樣設(shè)計(jì)完成時(shí)得到的界面如下圖。handles.help和handles.jump。接
23、著我們建立兩個(gè)圖形窗口時(shí),系統(tǒng)也依次建立了handles.axel和handles.axes2兩個(gè)變量用于程序中訪問這兩個(gè)圖形窗口,在設(shè)置好兩個(gè)晴yl-figFilegditViewLayoutToolsHelpQ為髦韁gc串|a圖智|尸三、完整程序的編寫。序的編寫機(jī)制。我第一個(gè)(hand的數(shù)據(jù)傳I,的形式存I,已經(jīng)有了“T畫HlIH0TKT麗b前本例所希望界面布局工作,寫具體的序前,必1000000已經(jīng)完成的C相當(dāng)于les的變量,這是hand才能實(shí)現(xiàn)1000個(gè)按鈕時(shí),系創(chuàng)建了相應(yīng)的兩個(gè)變參數(shù)叭bf對(duì)t=acos(ht+b)的影響“jieshu”后系統(tǒng)已經(jīng)自動(dòng)地為程序開發(fā)者創(chuàng)建了名為中希望訪問
24、這個(gè)按鈕對(duì)象,我們就可通過(guò)這個(gè)愷未命.ump”第二個(gè)”屬性值設(shè)置為的變量,果我們?cè)诔绦蛄空业剿癶elp”和handles.jieshuhandles.jieshu變MA.TLAI:滾動(dòng)條后,系統(tǒng)也立即建立了handles.slider1和handles.slider2兩個(gè)變量,然后再建立滾動(dòng)條下面的編輯框時(shí)也建立了handles.edit1變量?,F(xiàn)在相信你明白“Tag”屬性值的作用了吧?該屬性值是什么,系統(tǒng)就在其前加上handles.而產(chǎn)生可以訪問該控件的一個(gè)變量,所以界面設(shè)計(jì)階段如果自己想修改“Tag”屬性值,必須保證和其它的不能相同,且符合matlab變量的命名規(guī)則必須英文字母開頭,由字
25、母數(shù)字和下劃線組成。接著我們?cè)诮缑嫔喜贾玫拿總€(gè)“StaticText”(靜態(tài)文本)都依次產(chǎn)生一個(gè)前綴為handels.的與相應(yīng)的“Tag”屬性一樣的變量,本例程序中我們所設(shè)置的那些靜態(tài)文本變量除最后2個(gè)外(即分別位于兩個(gè)滾動(dòng)條下方中間的文本框)都不需要進(jìn)行控制,所以不用理睬它們,只需記住最后兩個(gè)變量名分別是handles.texta和handles.textb,(它們的“Tag”屬性在設(shè)計(jì)階段我們分別已經(jīng)改為了texta和textb。除了上述的在界面設(shè)計(jì)階段所自動(dòng)建立的前綴為handles.的變量外,如果在每個(gè)函數(shù)中還需要?jiǎng)?chuàng)建新的變量,并希望這些變量值能為其它function共享,那么在定義新
26、變量時(shí)一定也要建立形如handles.*的變量,如本例程序中我們要用到的handles.a,handles.b,handles.hh,handles.linewidth等。明白了數(shù)據(jù)變量命名機(jī)制后,我們現(xiàn)在開始完善我們本例的程序編寫。1、填寫系統(tǒng)已經(jīng)生成的myl_OpeningFcn函數(shù)在m文件中找到函數(shù):functionmy1_OpeningFcn(hObject,eventdata,handles,varargin)該函數(shù)名稱“J前的名字與創(chuàng)建GUI時(shí)保存的文件名相同,“J后的“OpeningFcn”由系統(tǒng)自動(dòng)生成,是固定不變的,開發(fā)者也不可進(jìn)行修改,該函數(shù)用于執(zhí)行用戶所希望的程序運(yùn)行時(shí)的
27、matlab語(yǔ)句。本例中我希望獲取在設(shè)計(jì)階段中兩個(gè)滾動(dòng)條中設(shè)置好的當(dāng)前值作為函數(shù)r=acos(nt+b)中的a,b,n的值在左邊大圖像窗口中繪制該函數(shù)的圖像,并作為花絮在第二個(gè)圖像窗口中顯示名為“dance_29.gif”的圖像文件(該文件存放在當(dāng)前目錄下)。目前的該函數(shù)文件系統(tǒng)已經(jīng)自動(dòng)生成了兩條語(yǔ)句%Choosedefaultcommandlineoutputformy1handles.output=hObject;%Updatehandlesstructureguidata(hObject,handles);不要修改它們,在兩行語(yǔ)句之間插入自己的語(yǔ)句。本例中我所鍵入的語(yǔ)句和簡(jiǎn)單功能說(shuō)明如下
28、:handles.linewidth=2;%定義畫圖的線寬handles.color=b;%定義畫圖的顏色handles.a=get(handles.slider1,value);從slider中傳遞數(shù)值%獲取第一個(gè)滾動(dòng)條當(dāng)前值,并將其賦給變量handles.a%注意此句的語(yǔ)法,get(界面中的控件名稱,所希望獲取的屬性名)%還記得嗎?我們?cè)谠O(shè)計(jì)階段該控件的value已經(jīng)設(shè)置為5%所以此句執(zhí)行后handles.a=5handles.b=2*pi*get(handles.slider2,value);%原理與語(yǔ)法上句相同,稍有差異的是我們?cè)谠O(shè)計(jì)階段此控件的最小值和最大值%分別設(shè)置為0和1,即用戶
29、在拉動(dòng)滾動(dòng)條時(shí)此值介于0和1之間%而我們希望該函數(shù)中b值的變化在0和2*pi之間,所以對(duì)獲得的滾動(dòng)條的值%乘以2*pi以達(dá)到我們的要求,不過(guò)在設(shè)計(jì)階段該值為0,所以此句執(zhí)行后%handles.b=0handles.n=str2double(get(handles.edit1,string);%原理和前句相同,獲取handles.editl的字符串內(nèi)容,設(shè)計(jì)階段設(shè)置為5%但其數(shù)據(jù)類型為字符串,所以用str2double函數(shù)轉(zhuǎn)化為浮點(diǎn)數(shù)賦值給handles.nhandles.t=linspace(0,2*pi,1000);%對(duì)極坐標(biāo)函數(shù)r=acos(nt+b)中的自變量t進(jìn)行采點(diǎn),0和2*pi之間
30、等間距采%1000個(gè)點(diǎn)(呵呵,數(shù)目顯得比較多,辛苦計(jì)算機(jī)了)r=handles.a*cos(handles.b+handles.n*handles.t);%對(duì)函數(shù)r=acos(nt+b)由獲取的常數(shù)a,b,n計(jì)算對(duì)應(yīng)t的1000個(gè)點(diǎn)處的函數(shù)值%注意此時(shí)的變量r我沒有加前綴handles.,因?yàn)榇俗兞績(jī)H僅在該函數(shù)內(nèi)部使用%不需要其它函數(shù)共享,所以我們可以不把它放在handlesDD0 x,y=pol2cart(handles.t,r);%本來(lái)可以直接用polar函數(shù)畫該函數(shù)的圖像,但實(shí)驗(yàn)一中的實(shí)驗(yàn)大家也看到了會(huì)%出現(xiàn)極坐標(biāo)網(wǎng)格線,我希望不要它們,所以用pol2cart將這組極坐標(biāo)數(shù)據(jù)轉(zhuǎn)化為直角%
31、坐標(biāo),后面用plot函數(shù)在直角坐標(biāo)系下畫出等效的圖像%同樣變量x,y僅僅用于本函數(shù),所以也不需要加上handles.前綴axes(handles.axes1);%用axes函數(shù)通知系統(tǒng)執(zhí)行后續(xù)畫圖操作在名為handles.axes1的圖形窗口內(nèi)%(即在設(shè)計(jì)時(shí)建立的左邊較大的圖形窗口內(nèi)畫圖)handles.hh=plot(x,y,linewidth,handles.linewidth,color,handles.color);%用plot函數(shù)畫由變量handles.linewidth指定線寬的圖像,目前其值為2%注意該操作返回一個(gè)圖像指針值,將其值賦給變量handles.hh,用于其它函數(shù)操作a
32、xis(-8.18.1-8.18.1);%調(diào)整顯示窗口坐標(biāo)范圍axes(handles.axes2);%用axes函數(shù)通知系統(tǒng)執(zhí)行后續(xù)畫圖操作在名為handles.axes2的圖形窗口內(nèi)%(即在設(shè)計(jì)時(shí)建立的右邊較大的圖形窗口內(nèi)畫圖)handles.m1,handles.map1=imread(dance_29.gif,1:10);%用imread函數(shù)讀取圖像文件dance_29.gif中的數(shù)據(jù)放入%彩色圖像的顏色索引表放入handles.map1變量中%相應(yīng)的語(yǔ)法和邏輯較為復(fù)雜,如果大家有興趣,可查閱%imageprocessingtoolbox(圖像處理工具箱)0000%動(dòng)態(tài)圖像文件,里面包
33、含了10張靜態(tài)文件(當(dāng)連續(xù)播放時(shí)可產(chǎn)生動(dòng)畫效果)handles.mlD4維矩陣)matlab幫助系統(tǒng)中的dance_29.gif作為一個(gè)%為與后面的語(yǔ)句相結(jié)合,大家形式上這樣理解:圖像文件%現(xiàn)在數(shù)據(jù)經(jīng)上條語(yǔ)句放在了4維矩陣(試著想象一下該矩陣的組成)handles.ml0%其中三維子陣handles.m1(:,:,:,1)放置第一張圖片信息,,三維子陣%handles.m1(:,:,:,10)0依次防止了10幅其00靜態(tài)圖片文件imshow(handles.m1(:,:,:,1),handles.map1);%用imshow函數(shù)將上述的第一幅圖像顯示在當(dāng)前的圖形窗口內(nèi)axes(handles.
34、axes1);%由于本程序運(yùn)行0后續(xù)大部分操作都在第一個(gè)圖形窗口內(nèi),所以執(zhí)行該語(yǔ)句通知系統(tǒng)%此后再出現(xiàn)0繪圖命令都放在第一個(gè)圖形窗口內(nèi),即handles.axes10。保存文件,此時(shí)運(yùn)行程序,結(jié)果如下圖所示。左邊圖形窗口中顯示的是a=5,b=0,n=1時(shí)極坐標(biāo)函數(shù)r=acos(nt+b)的圖像,右邊圖形窗口中是腦白金老太婆跳舞時(shí)的一個(gè)瞬間定格畫面。set(handles.textb,string,num2str(handles.b);%與前一條語(yǔ)句功能一樣,只是所修改的對(duì)象和屬性值滿足我們的要求。此時(shí)再次運(yùn)行程序,界面如下,實(shí)現(xiàn)了我們的顯示目地下面介紹一下該函數(shù)內(nèi)系統(tǒng)自動(dòng)生成的語(yǔ)句guidat
35、a(hObject,handles);現(xiàn)在我們拖拉運(yùn)行程序的滾動(dòng)條或點(diǎn)擊“跳起來(lái)”按鈕,我們會(huì)發(fā)現(xiàn)沒有所希望的響應(yīng),這是正常的,因?yàn)槲覀冞€沒有編寫相應(yīng)的程序語(yǔ)句,下面我們開始逐個(gè)編寫各個(gè)對(duì)象發(fā)生交為了讓程序內(nèi)的各函數(shù)共享handles數(shù)據(jù)結(jié)構(gòu)中的每個(gè)變量的最新數(shù)據(jù),在每個(gè)函數(shù)中,如果用戶修改或新定義了至少一個(gè)handles.*變量,那么切記在該函數(shù)的最后一條語(yǔ)句中一定要寫上該語(yǔ)句,以通知其它所有函數(shù):各位函數(shù)筒子們,我在工作中修改了共享數(shù)的語(yǔ)法功能。據(jù),日后工作中請(qǐng)?jiān)L問新的數(shù)據(jù),別忘了加上該語(yǔ)句。以免數(shù)據(jù)使用舊數(shù)據(jù)而發(fā)生錯(cuò)誤!所以在日后其它函數(shù)中互性操作時(shí)所希望的程序相應(yīng)。2、填寫functi
36、onsliderl_Callback(hObject,eventdata,handles)函數(shù)體找到m文件中的functionslider1_Callback(hObject,eventdata,handles)書寫下列語(yǔ)句:handles.a=get(handles.slider1,value);%獲取新的滾動(dòng)條位置值,賦給handles.aset(handles.texta,string,num2str(handles.a)%在滾動(dòng)條下方顯示新的相應(yīng)數(shù)值r=handles.a*cos(handles.b+handles.n*handles.t);%用新的a,和已知的b,n和向量t計(jì)算新的r
37、x,y=pol2cart(handles.t,r);%轉(zhuǎn)換為直角坐標(biāo)handles.hh=plot(x,y,linewidth,handles.linewidth,color,handles.color);axis(-8.18.1-8.18.1);%調(diào)整顯示范圍guidata(hObject,handles);%通知其它函數(shù)handles結(jié)構(gòu)發(fā)生了變化如何?這些語(yǔ)句都不陌生吧?所以進(jìn)行相應(yīng)的調(diào)整時(shí)只需要簡(jiǎn)單的復(fù)制粘貼操作?,F(xiàn)在重新運(yùn)行程序,拖動(dòng)第一個(gè)滾動(dòng)條,發(fā)生了什么變化?很興奮吧?3、填寫functionslider2_Callback(hObject,eventdata,handles)0
38、00找到m文件中的functionslider2_Callback(hObject,eventdata,handles)書寫下列語(yǔ)句:handles.b=2*pi*get(handles.slider2,value);%獲取新的滾動(dòng)條位置值,賦給handles.b,注意要乘以2*pi的set(handles.textb,string,num2str(handles.b)%在滾動(dòng)條下方顯示新的相應(yīng)數(shù)值r=handles.a*cos(handles.b+handles.n*handles.t);%用新的b,和已知的a,n和向量t計(jì)算新的rx,y=pol2cart(handles.t,r);%轉(zhuǎn)換為
39、直角坐標(biāo)handles.hh=plot(x,y,linewidth,handles.linewidth,color,handles.color);axis(-8.18.1-8.18.1);%調(diào)整顯示范圍guidata(hObject,handles);%通知其它函數(shù)handles結(jié)構(gòu)發(fā)生了變化4、完成functioneditl_Callback(hObject,eventdata,handles)000找到m文件中的functionedit1_Callback(hObject,eventdata,handles)書寫下列語(yǔ)句:handles.n=str2double(get(handles.e
40、ditl,string);r=handles.a*cos(handles.b+handles.n*handles.t);x,y=pol2cart(handles.t,r);handles.hh=plot(x,y,linewidth,handles.linewidth,color,handles.color);axis(-8.18.1-8.18.1);guidata(hObject,handles);n值,觀察運(yùn)行結(jié)果。這些語(yǔ)句的語(yǔ)法和邏輯功能我們都熟悉了,就不添加注釋了。保存程序,再次運(yùn)行程序,特別是修改數(shù)據(jù)編輯窗口中的下面我們完成小花絮在右側(cè)的圖像窗口中讓老太婆跳舞。5、完成function
41、jump_Callback(hObject,eventdata,handles)程序體找到函數(shù)functionjump_Callback(hObject,eventdata,handles)書寫下列語(yǔ)句axes(handles.axes2);%下面的繪圖操作在第二個(gè)圖形窗口中進(jìn)行fornn=0:49n=rem(nn,10)+1;%找到循環(huán)變量被10除后的余數(shù),將余數(shù)加1,賦給nimshow(handles.m1(:,:,:,n),handles.map1);%在圖形窗口內(nèi)顯示程序運(yùn)行時(shí)四圍圖片矩陣的第n個(gè)三維矩陣數(shù)據(jù)pause(.05);%暫停0.05秒endaxes(handles.axes
42、l);%循環(huán)結(jié)束后通知系統(tǒng)日后繪圖操作在第一個(gè)圖形窗口內(nèi)注意到此函數(shù)中我們沒有修改handles數(shù)據(jù)結(jié)構(gòu)之值,所以不需要用guidata(hObject,handles);通知其它函數(shù)。介紹一個(gè)編程實(shí)用小技巧,隨著GUI界面中控件的增加,m文件的function個(gè)數(shù)也越來(lái)越多,為了快速找到自己希望的函數(shù),技巧如下:在m文件編輯器菜單欄“&嚴(yán)昌關(guān),D咼怕Stack:中的圖標(biāo)“_f”,點(diǎn)擊它,會(huì)出現(xiàn)一個(gè)下拉菜單,里面列出了本m文件中所有的函數(shù),點(diǎn)擊自己希望的函數(shù)名,則編輯窗口中光標(biāo)會(huì)自動(dòng)跳轉(zhuǎn)到此函數(shù)頭部分。如何?很人性化吧?三、為系統(tǒng)控制添加菜單控制除了用我們已經(jīng)看到的“按鈕”等控件增加程序的交互
43、性手段外,也可以象我們常見的很多程序一樣,通過(guò)窗口頂部區(qū)域的菜單進(jìn)行程序的交互式控制。的菜單,其功能是第一個(gè)用于當(dāng)前圖像的顏色和圖形線寬的控制,第二個(gè)用于打開此文檔。1、建立兩個(gè)主菜單回到GUI界面設(shè)計(jì)環(huán)境,在工具條上點(diǎn)擊“本例中我們建立兩個(gè)簡(jiǎn)單標(biāo),打開如下圖所示的菜單編輯器。我們可以用它們編輯兩類菜單:“MenuBar”和“ContextMenu”(上下文菜單),本文檔只介紹前者,大家如果有性趣第二類菜單,可以查閱matlab的幫助系統(tǒng)。連續(xù)點(diǎn)擊兩次上方的工具條中的第一個(gè)圖標(biāo),下面的窗口中增加了兩項(xiàng),如圖所示。PruptirLitiiNorthingKBleicrted.IL!IIIIfIU
44、ntitled1自Untitled2和“系統(tǒng)自動(dòng)將其顯示內(nèi)容和變量名“Untitiled2”,現(xiàn)在點(diǎn)選其中的一個(gè),如“的顯示和制屬性編輯器如左圖,編輯其屬性如右圖MenuEditor囪=冒|g=T;|3Untitled1|FUntitled2選第二個(gè)菜單項(xiàng)“IenuEditor6圖形外觀幫助文檔Tag”Untitled2”,分別設(shè)(這個(gè)不陌生吧?)分別命名為“Untitiled1”Untitiled1”,編輯器右邊會(huì)出現(xiàn)該菜單UlMenuPiLabel:Tag:AcceleratiSeparChecEnabhCallback:屬性如下圖。UlMenuPropertiesSeparatorabo
45、vethisitemCheckmarkthisitemp7EnablethisitemCallback:SeparatorabovethisitemCheckmarkthisitem0EnablethisitemMenuBarContextMenusCallback:對(duì)第一個(gè)子菜單項(xiàng)同樣分別建立三個(gè)子菜單項(xiàng),Label”屬性依次改為1”、“2”、“3”,點(diǎn)擊“OK”按鈕?,F(xiàn)在保存并運(yùn)行程序,可以看到運(yùn)行窗口上方出現(xiàn)了兩個(gè)菜單條,這時(shí)再查閱一下m文件,我們會(huì)發(fā)現(xiàn)系統(tǒng)又自動(dòng)生成了兩個(gè)函數(shù)頭functionm1_Callback(hObject,eventdata,handles)functionm
46、2_Callback(hObject,eventdata,handles)其命名邏輯是我們剛才在設(shè)計(jì)時(shí)將兩個(gè)菜單對(duì)象的的“Tag”屬性分別修改為了ml和m2。現(xiàn)在在functionm2_Callback(h0bject,eventdata,handles)下書寫如下語(yǔ)句Winopen(Matlab交互式程序設(shè)計(jì)教程及舉例.doc);0000,再次運(yùn)行,如果當(dāng)前目錄下有該文件,則windows系統(tǒng)接受指令,打開該文件。2、建立第一個(gè)主菜單下分別用于控制顏色和線寬的兩個(gè)子菜單回到GUI編輯環(huán)境,點(diǎn)擊“豁”圖標(biāo),再次打開菜單編輯器,選擇第一個(gè)菜單項(xiàng)。然后連續(xù)點(diǎn)擊左上方的第二個(gè)圖標(biāo),建立該菜單的兩個(gè)子
47、菜單項(xiàng)。分別重復(fù)l中的操作,在右方編輯窗修改它們的“Label”和“Tag”兩個(gè)屬性如下圖所示。Acceerator:Ctr+Nonecaback:7:.ai.JtorriaticLabel:純克-自圖那外觀曰Untitled2自幫助文檔UlMenuPropertiesSeparator1Check回EnablethisitemMoreoptionsTag”屬性依次改為“mill”、“mll2”、“mll3”(大家自己可以任意取個(gè)性化的名字,我命名的原則是m代表“菜單”,m113”是第l個(gè)主菜單下的第l個(gè)子菜單下的第3個(gè)菜單項(xiàng),這樣日后在m文件下寫程序時(shí)不至于混亂);對(duì)第二個(gè)子菜單項(xiàng)同樣分別建
48、立三個(gè)子菜單項(xiàng),Label”屬性依次改為“紅色”m123”。注意用鼠標(biāo)點(diǎn)擊其中的名為“、“綠色”、“藍(lán)色”,“Tag”屬性依次改為“ml2l”、“ml22”、5個(gè)屬性前的框,出現(xiàn)叮”,用于在程序運(yùn)行時(shí)給用戶指示當(dāng)前的畫圖操作是用線寬為“2”的“藍(lán)色”繪制曲線,選擇后如圖Checkmark:thisitem。修改完后菜單編輯器顯示如下圖。functionmll3_Callback(hObject,eventdata,handles)functionml2l_Callback(hObject,eventdata,handles)functionml22_Callback(hObject,event
49、data,handles)functionml23_Callback(hObject,eventdata,handles)其中前3個(gè)是用戶選擇“線寬”的3個(gè)菜單項(xiàng)的響應(yīng)函數(shù),后3個(gè)是用戶選擇“顏色”的2”和“藍(lán)色”的兩個(gè)菜單項(xiàng)的第個(gè)菜單項(xiàng)的響應(yīng)函數(shù)。3、控制“線寬”的函數(shù)編輯在m文件中找到函數(shù)functionm111_Callback(h0bject,eventdata,handles)在其后書寫下列語(yǔ)句handles.linewidth=1;set(handles.hh,linewidth,handles.linewidth);%改變名為handles.hh的圖形的線寬為1set(handles.m111,checked,on);%將該菜單項(xiàng)點(diǎn)選上M”以指示當(dāng)前畫圖線寬為1點(diǎn)擊“OK”按鈕?,F(xiàn)在保存并運(yùn)行程序,可以看到運(yùn)行窗口上方出現(xiàn)了兩個(gè)菜單條,這handles)handles)handles)set(handles.m112,checked,off);set(handles.m113,checked,off);%另兩項(xiàng)菜單項(xiàng)如果之前有“U”,將其去掉guidata(hObject,handles);%通知系統(tǒng)其它函數(shù)handles數(shù)據(jù)結(jié)構(gòu)發(fā)生了變化在m文件中找到函數(shù)functionmll2_Callback(h0bject,eventdata,在其后書寫下列語(yǔ)句han
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 光伏產(chǎn)品購(gòu)銷合同范本
- 2025年度煤礦礦產(chǎn)資源補(bǔ)償費(fèi)轉(zhuǎn)讓合同范本4篇
- 2025教職工雇傭合同范文
- 2025年教育機(jī)構(gòu)校田地承包與農(nóng)業(yè)科技創(chuàng)新協(xié)議3篇
- 二零二五年度食品添加劑銷售合作協(xié)議3篇
- 2025年度二零二五毛竹山生態(tài)旅游項(xiàng)目承包合同范本4篇
- 2025-2030年中國(guó)齒輪泵行業(yè)發(fā)展?fàn)顩r及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)風(fēng)扇電機(jī)制造產(chǎn)業(yè)規(guī)模分析及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)零售百貨行業(yè)發(fā)展?fàn)顩r及營(yíng)銷戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)隱形眼鏡行業(yè)市場(chǎng)發(fā)展?jié)摿εc投資策略建議報(bào)告
- 白熊效應(yīng)(修訂版)
- 小學(xué)數(shù)學(xué)知識(shí)結(jié)構(gòu)化教學(xué)
- 視頻監(jiān)控維保項(xiàng)目投標(biāo)方案(技術(shù)標(biāo))
- 社會(huì)組織能力建設(shè)培訓(xùn)
- 立項(xiàng)報(bào)告蓋章要求
- 2022年睪丸腫瘤診斷治療指南
- 被執(zhí)行人給法院執(zhí)行局寫申請(qǐng)范本
- 主變壓器試驗(yàn)報(bào)告模板
- 安全防護(hù)通道施工方案
- 視覺元素對(duì)心理感知的影響
- 柴油供貨運(yùn)輸服務(wù)方案
評(píng)論
0/150
提交評(píng)論