MATLAB語言-課程設計--幾何作圖_第1頁
MATLAB語言-課程設計--幾何作圖_第2頁
MATLAB語言-課程設計--幾何作圖_第3頁
MATLAB語言-課程設計--幾何作圖_第4頁
MATLAB語言-課程設計--幾何作圖_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、;. MATLAB課程設計報告題 目 幾何作圖 學 院 電氣信息學院 專 業(yè) 電子信息科學與技術 學生姓名 田紹宏 學 號 2011052466 年級 11 級 教 師 郭江凌 二一三年七月十三日1、 設計名稱:幾何作圖(1.1)2、設計目標/設計要求(基本目標及擴展)根據(jù)給定的API,編寫MATLAB函數(shù),實現(xiàn)多條線段作圖。function Y = ex03_drawline(I, x, y)% 線段作圖% I : 輸入畫板矩陣, uint8% x : 線段各端點的x坐標,行向量,其中(x1,x2)是第一條線段的,(x3,x4)是第二條的,如此類推% y : 線段各端點的y坐標,行向量,其中

2、(y1,y2)是第一條線段的,(y3,y4)是第二條的,如此類推% Y : 輸出畫板矩陣, uint8擴展1:根據(jù)給定的API,編寫MATLAB函數(shù),實現(xiàn)圓作圖。function Y = ex03_drawcircle(I, x, y, r)% 圓作圖% I : 輸入畫板矩陣, uint8% x : 圓心的x坐標,行向量% y : 圓心的y坐標,行向量% r : 圓的半徑,行向量% Y : 輸出畫板矩陣, uint8擴展2:畫虛線、點劃線3、 設計方案(1)、直線設計方案:1、 根據(jù)給出的端點,計算所在直線方程2、 根據(jù)所得方程,計算出所在兩端點間的(x,y)坐標對3、 I中以計算所得(x,y

3、)坐標對為下標的元素置為v(2)、圓設計方案:1、 根據(jù)所給圓心、半徑計算圓的方程2、 根據(jù)所得方程,計算圓上每個點的坐標對(x,y)3、I中以(x,y)為坐標的點置為04、算法描述(1)直線1、 根據(jù)給出的兩端點算出直線斜率k=(y1-y2)/(x1-x2)。(x10,y00,r0)2、由圓心計算圓的邊界,即x1=x0-r,x2=r+x0;y1=y2=y03、從x1開始到x2把中間步長為1的x帶入方程中算得坐標對(x_k,+y_k)4、在I矩陣中,把所有算出的(x_k,+y_k)坐標對的值置為05、 算法實現(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ù)給出的兩端點算出直線斜率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帶入方程中算得坐標對(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)坐標對的值置為0 I(y_1,x_k)=0; I(y_2,x_k)=0; endY=unit8(I);toc;end 6、 實驗方案與結果分析(1) 描述實驗方案-(直線篇)-輸入為: I = uint8(ones(200) * 200); x = 10 1000 30 600 100 100; y = 30 600 100 1000 20 1000;預想中應該出現(xiàn)三條直線其中其端點分別為M(10,30)Q(1000,600)、N(30,100)V(600,1000)和P(100,20)B(100,100

6、0),并且其中一條為豎直的直線。在代碼運行中,在畫豎直直線的時候應該首先通過第一個判斷語句直接畫出來,否則后面將會出現(xiàn)除0的情況,導致代碼錯誤。而其他兩條直線應該要判斷出第一條線應以x為基準,而第二條應以y為基準,否則畫出來的線可能有斷點,而且很難看。-(圓篇)-輸入為: I = uint8(ones(200) * 200);x=100;y=100; r=50;預想中應該出現(xiàn)一個整圓,并且圓心在(100,100)處(2)實驗結果分析-(直線篇)-最終結果也正確生成了三條直線,并且第一二條線并無斷點與不美觀,但是鋸齒狀還是略明顯,這點在總結中會詳細提到,結果如下圖:-(圓篇)-經運行,輸出的圓雖

7、然有圓的形狀,但是很震驚的是在兩個邊界點附近有若干個離散的沒有組合起來的點,如圖一。經過認真觀察,原因為在端點附近的x值一經變化y值變化較大,所以不能連起來,變換x,y的位置結果仍一樣,最后不得不加了語句,把斷點人工連起來,這點也將會在總結中詳細敘說,連起斷點的結果見圖二。(圖一)(圖二)7、性能分析(可選)(1)速度分析-(直線篇)-根據(jù)tic、toc計時,在200*200的矩陣中畫三條線用時如下:在1000*1000的矩陣中畫三條線的用時為:畫直線的耗時最主要體現(xiàn)在循環(huán)與判斷語句中,由于代碼中幾個判斷語句不能省略,否則會出現(xiàn)錯誤,由于要求是要一次畫多條直線,所以一開始的循環(huán)取出端點的循環(huán)不

8、能取消。而原來在把每一個點坐標帶入方程算出另一個左邊的時候用到了for循環(huán),而在改進中把循環(huán)改成了矩陣運算,令得速度快了不少。-(圓篇)-根據(jù)tic、toc計時,在200*200的矩陣中畫一個圓用時如下:在1000*1000的矩陣中畫一個院的用時如下:由對比可知 ,畫圓所費的時間比直線相對來說要多,當然也是因為這里畫的直線較短的限制,但是從圓的方程中來所,圓的代碼中也用到了判斷語句和for語句,同樣的,為了保證畫圓的正確性,if語句也不能省略,而在連接斷點時原本用到了for循環(huán),最后也改成了矩陣運算,加快了速度。(2) 內存開銷分析在內存上畫圓和畫線都是一樣,主要就是畫板矩陣所占用的內存和在計

9、算坐標時保存數(shù)據(jù)所用到的內存。8、總結-(直線篇)-在畫直線的代碼編寫中,由于在課堂上老師對于這個程序已經有了一個相當完整的介紹與指導,所以對于一開始的編寫例如判斷直線斜率是否存在,斜率正負問題都已經有了很詳細的基礎,所以并沒有很費事,由于這次給的API中沒有I,于是我就把給出的畫板矩陣數(shù)值置為200,而當算出一個坐標以后直接把該坐標的數(shù)值置零。第一個難點是在老師要求要一次畫多條直線,這就要求能識別一個矩陣當中的多個端點。其實也沒有很難的地方,但是就要求在給出的矩陣中循環(huán)取出兩個坐標,在這里還用到了c,d=size(x),目的是計算出給出的矩陣寬度,從而兩個兩個取出坐標,for f=1:2:d

10、。第二個難點是直線去鋸齒的問題。由于所畫的直線是由單像素點構成,所以難免會出現(xiàn)鋸齒,但在畫圖工具或其他圖像中,鋸齒并不會很明顯。經過網絡查閱,了解到基本上有兩種方法去鋸齒,一是通過模糊化處理,多個圖層模糊以后縮小給人的感覺好像鋸齒不明顯了。但是由于難度較高并且要用到其他軟件,所以這種方法不能實現(xiàn)。二是畫圖軟件中的處理。老師曾叫我們去放大畫圖軟件的直線,看看用的是什么方法。經過試驗以后發(fā)現(xià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的分界點做了改動,由于8除任何數(shù)的余數(shù)范圍在08,所以相當于在半數(shù)的y上把y值增大了,而剩下的半數(shù)y值不變,于是輸出的直線如下:雖然沒有畫圖軟件的美觀,但是可以明顯的看出,在原本等距的鋸齒中有一段是比較窄,一段是比較長,然后交錯下去的。雖然在詢問多個同學后表示比之前的鋸齒更加明顯,但是在我眼中的雖說給人感覺更加扭曲了一點,但是鋸齒感還是有所降低。-(圓篇)-畫圓代碼的編寫雖說

12、老師并沒有明確的分析,但是經過畫直線的鋪墊,也有了大致的想法。同樣是確定方程,然后把一個方向上的坐標按規(guī)律變化,算出另一個坐標,然后把數(shù)置零。由于是畫圓,所以并不存在以哪一個為基準的問題。遇到的難點就是第一次畫出來的圓存在斷點的問題。由于經過分析是不可避免的,所以在最后選擇人工連起斷點的方法: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值進行比

13、較,如果它們之差不為0或者不為1,那么就強行把它們之間的數(shù)都置為0(原畫板矩陣值為200),結果為:圖三程序中也加入了一個小判斷,如果算出來的y值超過了畫板的邊界,就會自動在邊界畫出一條直線,形成一個半圓。但是畫出來的圓鋸齒感很強,并且有不少的突出(圖三),在此,我又去畫圖工具中比較,發(fā)現(xiàn)畫圖中運用的是類似的方法,并且也有不少不美觀的地方(圖四、五),于是我就放棄了進一步的美化。圖四圖五不得不說,在這一次的課程設計中,體會也感受到了很多沒有經過完整寫一個代碼感受不到的,至少整個過程要思考是的東西很多,這點應該得益于老師的教學方法,我想這種方法值得提倡。雖然說這一個寫的程序還有諸多的不完美,譬如

14、沒有完成拓展2的虛線,點劃線的設計,畫出來的圓不好看,畫圓的時候對于,但是我覺得,只要真正花費了心思去完成并且收獲了東西,那就足夠了。9、附錄n 完整源代碼及注釋(除部分簡單語句外,如end,基本上每行都需要注釋)(1)畫直線代碼function Y = ex03_drawline(I, x, y)% 線段作圖% I : 輸入畫板矩陣, uint8% x : 線段各端點的x坐標,行向量,其中(x1,x2)是第一條線段的,(x3,x4)是第二條的,如此類推% y : 線段各端點的y坐標,行向量,其中(y1,y2)是第一條線段的,(y3,y4)是第二條的,如此類推% Y : 輸出畫板矩陣, uin

15、t8tic;%計算x向量的長度c,d=size(x);%每次取兩個點作為直線的端點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); %求出畫板矩陣的大小,方便下面坐標變換 m,n=size(I);%如果直線斜率為0,那么也是直接畫出直線 if (a=0) I(y_1(1),min(x_

16、1):max(x_1)=0; else%如果直線的斜率大于1或小于-1,那么以y為基準,求出x的坐標 if (a1 |a=4) x_k=ceil(x_k); else x_k=round(x_k); end%坐標變換,把雙下標轉換成單下標,方便后面置0 k=(x_k-1)*m+y_k;%把算出來的坐標對置0 I(k)=0; else%如果直線的斜率絕對值小于1,那么以x為基準,求出y的坐標 x_k=min(x_1):max(x_1);%把兩個端點間步長為1的點帶入方程中,求的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%坐標變換,把雙下標轉換成單下標,方便后面置0 k=(x_k-1)*m+y_k;%把算出來的坐標對置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坐標,行向量% y : 圓心的y坐標,行向量% r : 圓的半徑,行向量% Y : 輸出畫板矩陣, uint8tic;%算出I的大小方便

18、下面畫半圓判斷a,b=size(I);%算出圓的兩個邊界坐標x_1=x-r;x_2=x+r;%把y_1、y_2初始值置為yy_1=y;y_2=y;x_kk=x_1;%以x為基準,把兩個邊界點間步長為1的點帶入算出兩個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小于等于零,則強行置為1,畫出半圓 if(y_k2b) y_k2=b; end y_k1=round(y_k1); y_k2=round(y_k2);%比較前后兩個算出來的y值,如果不相連,則強行連起來 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值,方便后面斷點比較 y_1=y_k1; y_2=y_k2; x_kk=x_k;%把算出來的坐標對在I中置零 I(y_1,x_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論