![MATLAB語言-課程設(shè)計--幾何作圖_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/d8a60f24-882a-4117-822a-2fb4f99cc189/d8a60f24-882a-4117-822a-2fb4f99cc1891.gif)
![MATLAB語言-課程設(shè)計--幾何作圖_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/d8a60f24-882a-4117-822a-2fb4f99cc189/d8a60f24-882a-4117-822a-2fb4f99cc1892.gif)
![MATLAB語言-課程設(shè)計--幾何作圖_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/d8a60f24-882a-4117-822a-2fb4f99cc189/d8a60f24-882a-4117-822a-2fb4f99cc1893.gif)
![MATLAB語言-課程設(shè)計--幾何作圖_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/d8a60f24-882a-4117-822a-2fb4f99cc189/d8a60f24-882a-4117-822a-2fb4f99cc1894.gif)
![MATLAB語言-課程設(shè)計--幾何作圖_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/d8a60f24-882a-4117-822a-2fb4f99cc189/d8a60f24-882a-4117-822a-2fb4f99cc1895.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、;. MATLAB課程設(shè)計報告題 目 幾何作圖 學(xué) 院 電氣信息學(xué)院 專 業(yè) 電子信息科學(xué)與技術(shù) 學(xué)生姓名 田紹宏 學(xué) 號 2011052466 年級 11 級 教 師 郭江凌 二一三年七月十三日1、 設(shè)計名稱:幾何作圖(1.1)2、設(shè)計目標(biāo)/設(shè)計要求(基本目標(biāo)及擴(kuò)展)根據(jù)給定的API,編寫MATLAB函數(shù),實(shí)現(xiàn)多條線段作圖。function Y = ex03_drawline(I, x, y)% 線段作圖% I : 輸入畫板矩陣, uint8% x : 線段各端點(diǎn)的x坐標(biāo),行向量,其中(x1,x2)是第一條線段的,(x3,x4)是第二條的,如此類推% y : 線段各端點(diǎn)的y坐標(biāo),行向量,其中
2、(y1,y2)是第一條線段的,(y3,y4)是第二條的,如此類推% Y : 輸出畫板矩陣, uint8擴(kuò)展1:根據(jù)給定的API,編寫MATLAB函數(shù),實(shí)現(xiàn)圓作圖。function Y = ex03_drawcircle(I, x, y, r)% 圓作圖% I : 輸入畫板矩陣, uint8% x : 圓心的x坐標(biāo),行向量% y : 圓心的y坐標(biāo),行向量% r : 圓的半徑,行向量% Y : 輸出畫板矩陣, uint8擴(kuò)展2:畫虛線、點(diǎn)劃線3、 設(shè)計方案(1)、直線設(shè)計方案:1、 根據(jù)給出的端點(diǎn),計算所在直線方程2、 根據(jù)所得方程,計算出所在兩端點(diǎn)間的(x,y)坐標(biāo)對3、 I中以計算所得(x,y
3、)坐標(biāo)對為下標(biāo)的元素置為v(2)、圓設(shè)計方案:1、 根據(jù)所給圓心、半徑計算圓的方程2、 根據(jù)所得方程,計算圓上每個點(diǎn)的坐標(biāo)對(x,y)3、I中以(x,y)為坐標(biāo)的點(diǎn)置為04、算法描述(1)直線1、 根據(jù)給出的兩端點(diǎn)算出直線斜率k=(y1-y2)/(x1-x2)。(x10,y00,r0)2、由圓心計算圓的邊界,即x1=x0-r,x2=r+x0;y1=y2=y03、從x1開始到x2把中間步長為1的x帶入方程中算得坐標(biāo)對(x_k,+y_k)4、在I矩陣中,把所有算出的(x_k,+y_k)坐標(biāo)對的值置為05、 算法實(shí)現(xiàn)及分析(1)、直線function Y = ex03_drawline(I, x,
4、y)%若斜率不存在,即為豎直的直線,則無需求斜率直接畫if (x(1) = x(2) I(min(y):max(y),x(1)=0;else%1、根據(jù)給出的兩端點(diǎn)算出直線斜率k=(y1-y2)/(x1-x2)。(x11 |a0,y00,r0)%2、由圓心計算圓的邊界,即x1=x0-r,x2=r+x0;y1=y2=y0x_1=x-r;x_2=x+r;%3、從x1開始到x2把中間步長為1的x帶入方程中算得坐標(biāo)對(x_k,+y_k) for x_k=x_1:x_2 y_k1=sqrt(r2-(x_k-x)2)+y; y_k2=-sqrt(r2-(x_k-x)2)+y; y_k1=round(y_k1
5、); y_k2=round(y_k2);%4、在I矩陣中,把所有算出的(x_k,+y_k)坐標(biāo)對的值置為0 I(y_1,x_k)=0; I(y_2,x_k)=0; endY=unit8(I);toc;end 6、 實(shí)驗(yàn)方案與結(jié)果分析(1) 描述實(shí)驗(yàn)方案-(直線篇)-輸入為: I = uint8(ones(200) * 200); x = 10 1000 30 600 100 100; y = 30 600 100 1000 20 1000;預(yù)想中應(yīng)該出現(xiàn)三條直線其中其端點(diǎn)分別為M(10,30)Q(1000,600)、N(30,100)V(600,1000)和P(100,20)B(100,100
6、0),并且其中一條為豎直的直線。在代碼運(yùn)行中,在畫豎直直線的時候應(yīng)該首先通過第一個判斷語句直接畫出來,否則后面將會出現(xiàn)除0的情況,導(dǎo)致代碼錯誤。而其他兩條直線應(yīng)該要判斷出第一條線應(yīng)以x為基準(zhǔn),而第二條應(yīng)以y為基準(zhǔn),否則畫出來的線可能有斷點(diǎn),而且很難看。-(圓篇)-輸入為: I = uint8(ones(200) * 200);x=100;y=100; r=50;預(yù)想中應(yīng)該出現(xiàn)一個整圓,并且圓心在(100,100)處(2)實(shí)驗(yàn)結(jié)果分析-(直線篇)-最終結(jié)果也正確生成了三條直線,并且第一二條線并無斷點(diǎn)與不美觀,但是鋸齒狀還是略明顯,這點(diǎn)在總結(jié)中會詳細(xì)提到,結(jié)果如下圖:-(圓篇)-經(jīng)運(yùn)行,輸出的圓雖
7、然有圓的形狀,但是很震驚的是在兩個邊界點(diǎn)附近有若干個離散的沒有組合起來的點(diǎn),如圖一。經(jīng)過認(rèn)真觀察,原因?yàn)樵诙它c(diǎn)附近的x值一經(jīng)變化y值變化較大,所以不能連起來,變換x,y的位置結(jié)果仍一樣,最后不得不加了語句,把斷點(diǎn)人工連起來,這點(diǎn)也將會在總結(jié)中詳細(xì)敘說,連起斷點(diǎn)的結(jié)果見圖二。(圖一)(圖二)7、性能分析(可選)(1)速度分析-(直線篇)-根據(jù)tic、toc計時,在200*200的矩陣中畫三條線用時如下:在1000*1000的矩陣中畫三條線的用時為:畫直線的耗時最主要體現(xiàn)在循環(huán)與判斷語句中,由于代碼中幾個判斷語句不能省略,否則會出現(xiàn)錯誤,由于要求是要一次畫多條直線,所以一開始的循環(huán)取出端點(diǎn)的循環(huán)不
8、能取消。而原來在把每一個點(diǎn)坐標(biāo)帶入方程算出另一個左邊的時候用到了for循環(huán),而在改進(jìn)中把循環(huán)改成了矩陣運(yùn)算,令得速度快了不少。-(圓篇)-根據(jù)tic、toc計時,在200*200的矩陣中畫一個圓用時如下:在1000*1000的矩陣中畫一個院的用時如下:由對比可知 ,畫圓所費(fèi)的時間比直線相對來說要多,當(dāng)然也是因?yàn)檫@里畫的直線較短的限制,但是從圓的方程中來所,圓的代碼中也用到了判斷語句和for語句,同樣的,為了保證畫圓的正確性,if語句也不能省略,而在連接斷點(diǎn)時原本用到了for循環(huán),最后也改成了矩陣運(yùn)算,加快了速度。(2) 內(nèi)存開銷分析在內(nèi)存上畫圓和畫線都是一樣,主要就是畫板矩陣所占用的內(nèi)存和在計
9、算坐標(biāo)時保存數(shù)據(jù)所用到的內(nèi)存。8、總結(jié)-(直線篇)-在畫直線的代碼編寫中,由于在課堂上老師對于這個程序已經(jīng)有了一個相當(dāng)完整的介紹與指導(dǎo),所以對于一開始的編寫例如判斷直線斜率是否存在,斜率正負(fù)問題都已經(jīng)有了很詳細(xì)的基礎(chǔ),所以并沒有很費(fèi)事,由于這次給的API中沒有I,于是我就把給出的畫板矩陣數(shù)值置為200,而當(dāng)算出一個坐標(biāo)以后直接把該坐標(biāo)的數(shù)值置零。第一個難點(diǎn)是在老師要求要一次畫多條直線,這就要求能識別一個矩陣當(dāng)中的多個端點(diǎn)。其實(shí)也沒有很難的地方,但是就要求在給出的矩陣中循環(huán)取出兩個坐標(biāo),在這里還用到了c,d=size(x),目的是計算出給出的矩陣寬度,從而兩個兩個取出坐標(biāo),for f=1:2:d
10、。第二個難點(diǎn)是直線去鋸齒的問題。由于所畫的直線是由單像素點(diǎn)構(gòu)成,所以難免會出現(xiàn)鋸齒,但在畫圖工具或其他圖像中,鋸齒并不會很明顯。經(jīng)過網(wǎng)絡(luò)查閱,了解到基本上有兩種方法去鋸齒,一是通過模糊化處理,多個圖層模糊以后縮小給人的感覺好像鋸齒不明顯了。但是由于難度較高并且要用到其他軟件,所以這種方法不能實(shí)現(xiàn)。二是畫圖軟件中的處理。老師曾叫我們?nèi)シ糯螽媹D軟件的直線,看看用的是什么方法。經(jīng)過試驗(yàn)以后發(fā)現(xiàn)畫圖軟件中用的是一種近似障眼法的方法,它并不像我們畫出來的圖,每一個鋸齒都是均勻的,二十每隔幾個點(diǎn)鋸齒小一點(diǎn),再隔幾個又變大,這樣給人的感覺沒有那個粗的鋸齒感。于是模仿這種方法,我做了如下的改動:if (rem
11、(y_k,8)=4) x_k=ceil(x_k); else x_k=round(x_k); end對每個算出來y值對8取余,如果取出來的余數(shù)大于四,則把這個y值向上取余,如果小于四,則把y四舍五入。這樣,就把y值在0.5的分界點(diǎn)做了改動,由于8除任何數(shù)的余數(shù)范圍在08,所以相當(dāng)于在半數(shù)的y上把y值增大了,而剩下的半數(shù)y值不變,于是輸出的直線如下:雖然沒有畫圖軟件的美觀,但是可以明顯的看出,在原本等距的鋸齒中有一段是比較窄,一段是比較長,然后交錯下去的。雖然在詢問多個同學(xué)后表示比之前的鋸齒更加明顯,但是在我眼中的雖說給人感覺更加扭曲了一點(diǎn),但是鋸齒感還是有所降低。-(圓篇)-畫圓代碼的編寫雖說
12、老師并沒有明確的分析,但是經(jīng)過畫直線的鋪墊,也有了大致的想法。同樣是確定方程,然后把一個方向上的坐標(biāo)按規(guī)律變化,算出另一個坐標(biāo),然后把數(shù)置零。由于是畫圓,所以并不存在以哪一個為基準(zhǔn)的問題。遇到的難點(diǎn)就是第一次畫出來的圓存在斷點(diǎn)的問題。由于經(jīng)過分析是不可避免的,所以在最后選擇人工連起斷點(diǎn)的方法:if(abs(y_1-y_k1)!=0|abs(y_1-y_k1)!=1) y_a=y_1 y_k1; y_b=y_2 y_k2; I(min(y_a):max(y_a)-1,x_kk)=0; I(min(y_b):max(y_b)-1,x_kk)=0; end在這里是把每個算出來的y值與前一個y值進(jìn)行比
13、較,如果它們之差不為0或者不為1,那么就強(qiáng)行把它們之間的數(shù)都置為0(原畫板矩陣值為200),結(jié)果為:圖三程序中也加入了一個小判斷,如果算出來的y值超過了畫板的邊界,就會自動在邊界畫出一條直線,形成一個半圓。但是畫出來的圓鋸齒感很強(qiáng),并且有不少的突出(圖三),在此,我又去畫圖工具中比較,發(fā)現(xiàn)畫圖中運(yùn)用的是類似的方法,并且也有不少不美觀的地方(圖四、五),于是我就放棄了進(jìn)一步的美化。圖四圖五不得不說,在這一次的課程設(shè)計中,體會也感受到了很多沒有經(jīng)過完整寫一個代碼感受不到的,至少整個過程要思考是的東西很多,這點(diǎn)應(yīng)該得益于老師的教學(xué)方法,我想這種方法值得提倡。雖然說這一個寫的程序還有諸多的不完美,譬如
14、沒有完成拓展2的虛線,點(diǎn)劃線的設(shè)計,畫出來的圓不好看,畫圓的時候?qū)τ?,但是我覺得,只要真正花費(fèi)了心思去完成并且收獲了東西,那就足夠了。9、附錄n 完整源代碼及注釋(除部分簡單語句外,如end,基本上每行都需要注釋)(1)畫直線代碼function Y = ex03_drawline(I, x, y)% 線段作圖% I : 輸入畫板矩陣, uint8% x : 線段各端點(diǎn)的x坐標(biāo),行向量,其中(x1,x2)是第一條線段的,(x3,x4)是第二條的,如此類推% y : 線段各端點(diǎn)的y坐標(biāo),行向量,其中(y1,y2)是第一條線段的,(y3,y4)是第二條的,如此類推% Y : 輸出畫板矩陣, uin
15、t8tic;%計算x向量的長度c,d=size(x);%每次取兩個點(diǎn)作為直線的端點(diǎn)for f=1:2:d x_1=x(f) x(f+1); y_1=y(f) y(f+1); %若斜率不存在,則直接畫出數(shù)值的線 if (x_1(1) = x_1(2) I(min(y_1):max(y_1),x_1(1)=0; else %算出直線參數(shù)a、b a=(y_1(1)-y_1(2)/(x_1(1)-x_1(2); b=y_1(1)-a*x_1(1); %求出畫板矩陣的大小,方便下面坐標(biāo)變換 m,n=size(I);%如果直線斜率為0,那么也是直接畫出直線 if (a=0) I(y_1(1),min(x_
16、1):max(x_1)=0; else%如果直線的斜率大于1或小于-1,那么以y為基準(zhǔn),求出x的坐標(biāo) if (a1 |a=4) x_k=ceil(x_k); else x_k=round(x_k); end%坐標(biāo)變換,把雙下標(biāo)轉(zhuǎn)換成單下標(biāo),方便后面置0 k=(x_k-1)*m+y_k;%把算出來的坐標(biāo)對置0 I(k)=0; else%如果直線的斜率絕對值小于1,那么以x為基準(zhǔn),求出y的坐標(biāo) x_k=min(x_1):max(x_1);%把兩個端點(diǎn)間步長為1的點(diǎn)帶入方程中,求的y y_k=a*x_k+b;%簡單去齒痕,如果算出的y值對8的余數(shù)大于四,則把y四舍五入 if (rem(x_k,8)=
17、4) y_k=ceil(y_k); else y_k=round(y_k); end%坐標(biāo)變換,把雙下標(biāo)轉(zhuǎn)換成單下標(biāo),方便后面置0 k=(x_k-1)*m+y_k;%把算出來的坐標(biāo)對置0 I(k)=0; end end end%把I以uint8的形式賦YY=uint8(I);end toc;end (2) 畫圓代碼function Y = ex03_drawcircle(I, x, y, r)% 圓作圖% I : 輸入畫板矩陣, uint8% x : 圓心的x坐標(biāo),行向量% y : 圓心的y坐標(biāo),行向量% r : 圓的半徑,行向量% Y : 輸出畫板矩陣, uint8tic;%算出I的大小方便
18、下面畫半圓判斷a,b=size(I);%算出圓的兩個邊界坐標(biāo)x_1=x-r;x_2=x+r;%把y_1、y_2初始值置為yy_1=y;y_2=y;x_kk=x_1;%以x為基準(zhǔn),把兩個邊界點(diǎn)間步長為1的點(diǎn)帶入算出兩個y值 for x_k=x_1:x_2 y_k1=sqrt(r2-(x_k-x)2)+y; y_k2=-sqrt(r2-(x_k-x)2)+y;%如果算出來的y_k2小于等于零,則強(qiáng)行置為1,畫出半圓 if(y_k2b) y_k2=b; end y_k1=round(y_k1); y_k2=round(y_k2);%比較前后兩個算出來的y值,如果不相連,則強(qiáng)行連起來 if(abs(y_1-y_k1)!=0|abs(y_1-y_k1)!=1) y_a=y_1 y_k1; y_b=y_2 y_k2; I(min(y_a):max(y_a)-1,x_kk)=0; I(min(y_b):max(y_b)-1,x_kk)=0; end%記錄舊算出來的y值與k值,方便后面斷點(diǎn)比較 y_1=y_k1; y_2=y_k2; x_kk=x_k;%把算出來的坐標(biāo)對在I中置零 I(y_1,x_
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 充電樁采購合同
- 企業(yè)正式聘用合同模板
- 2024年智能穿戴設(shè)備技術(shù)研發(fā)合同
- 破火器和噴灑系統(tǒng)的應(yīng)用
- 中石化成品油購銷合同
- 房屋承租轉(zhuǎn)租合同書
- 有關(guān)設(shè)備采購合同范本
- 工程擔(dān)保合同的反擔(dān)保
- 新裝修插座采購合同范本年
- 南方公司電網(wǎng)基建項目危險性較大的分部分項工程安全管理工作指引
- 公司組織架構(gòu)與管理體系制度
- 2024-2030年中國涂碳箔行業(yè)現(xiàn)狀調(diào)查與投資策略分析研究報告
- 2023-2024年度數(shù)字經(jīng)濟(jì)與驅(qū)動發(fā)展公需科目答案(第5套)
- 職業(yè)分類表格
- 廣東省深圳高級中學(xué)2023-2024學(xué)年八年級下學(xué)期期中考試物理試卷
- 電網(wǎng)建設(shè)項目施工項目部環(huán)境保護(hù)和水土保持標(biāo)準(zhǔn)化管理手冊(變電工程分冊)
- 口腔門診部設(shè)置可行性研究報告
- 體檢科運(yùn)營可行性報告
- 北京市豐臺區(qū)市級名校2024屆數(shù)學(xué)高一第二學(xué)期期末檢測模擬試題含解析
- 設(shè)立項目管理公司組建方案
- 薪酬戰(zhàn)略與實(shí)踐
評論
0/150
提交評論