計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告--直線和圓中點(diǎn)Bresenham算法_第1頁(yè)
計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告--直線和圓中點(diǎn)Bresenham算法_第2頁(yè)
計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告--直線和圓中點(diǎn)Bresenham算法_第3頁(yè)
計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告--直線和圓中點(diǎn)Bresenham算法_第4頁(yè)
計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告--直線和圓中點(diǎn)Bresenham算法_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一、設(shè)計(jì)任務(wù)及要求:設(shè)計(jì)任務(wù):掌握中點(diǎn)Bresenham算法繪制直線的原理,設(shè)計(jì)中點(diǎn) Bresenham算法, 編寫Mbline()子函數(shù),使用中點(diǎn)Bresenham算法繪制斜率為0三k三1的直線。掌握八分法中點(diǎn)Bresenham算法繪制圓的原理,設(shè)計(jì)八分法繪制圓的中 點(diǎn)Bresenham算法,編寫八分法繪制圓的 CirclePoint(x,y)子函數(shù),編寫繪制 整圓的Mbcircle()子函數(shù),使用中點(diǎn)Bresenham算法繪制圓心位于屏幕客戶區(qū) 中心的圓。要 求:此次課程設(shè)計(jì)的課題為通過(guò)編程,實(shí)現(xiàn)圓和直線等基本圖形的繪制。要求用 Bresenham算法實(shí)現(xiàn)圓和直線等基本圖形的繪制,并給出代

2、碼和結(jié)果截圖。指導(dǎo)教師簽名:年 月 日、指導(dǎo)教師評(píng)語(yǔ):指導(dǎo)教師簽名:年 月 日、成績(jī) TOC o 1-5 h z 1、課程設(shè)計(jì)目的 22、課程設(shè)計(jì)描述及要求 23、系統(tǒng)開發(fā)環(huán)境 24、直線的 Bresenham算法原理 2中點(diǎn) Bresenham算法 2該進(jìn)的Bresenham算法 55、圓的 Bresenham 算法原理 7 HYPERLINK l bookmark37 o Current Document 6、程序運(yùn)行結(jié)果 9 HYPERLINK l bookmark39 o Current Document 7、總結(jié) 11 HYPERLINK l bookmark43 o Current

3、 Document 8、參考資料 119、附錄 11計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告.課程設(shè)計(jì)目的本學(xué)期系統(tǒng)學(xué)習(xí)了計(jì)算機(jī)圖形學(xué)的概論原理,在學(xué)期期末按課程要求進(jìn)行實(shí)驗(yàn)。通過(guò)實(shí)驗(yàn),進(jìn)一步理解和掌握中點(diǎn)算法、Bresenham算法和二階差分算法,并掌握以上算法生成圓和直線等圖形的基本過(guò)程,提高學(xué)生對(duì)計(jì)算機(jī)圖形學(xué)的了解與運(yùn)用技巧,同時(shí)通過(guò)此次課程設(shè)計(jì)提高動(dòng)手實(shí)踐能力與學(xué)習(xí)分析能力。 2.課程設(shè)計(jì)描述及要求直線中點(diǎn)Bresenham算法掌握中點(diǎn)Bresenham算法繪制直線的原理,設(shè)計(jì)中點(diǎn) Bresenham算法,編寫 Mbline()子函數(shù),使用中點(diǎn)Bresenham算法繪制斜率為0三k三1的直線圓中點(diǎn)Br

4、esenham算法掌握八分法中點(diǎn)Bresenham算法繪制圓的原理,設(shè)計(jì)八分法繪制圓的中點(diǎn) Bresenham算法,編寫八分法繪制圓的 CirclePoint(x,y)子函數(shù),編寫繪制整圓的 Mbcircle()子函數(shù),使用中點(diǎn)Bresenham算法繪制圓心位于屏幕客戶區(qū)中心的圓。此次課程設(shè)計(jì)的課題為通過(guò)編程,實(shí)現(xiàn)圓和直線等基本圖形的繪制。要求用 Bresenham算法實(shí)現(xiàn)圓和直線等基本圖形的繪制,并給出代碼和結(jié)果截圖。 3.系統(tǒng)開發(fā)環(huán)境開發(fā)工具:VC 6.0操作系統(tǒng):Microsoft Windows XP4.直線的Bresenham算法原理中點(diǎn)Bresenham算法給定直線的兩個(gè)端點(diǎn)P(X

5、, Y0)和P(Xi, Yi),可得到直線方程 F(x,y)=y-kx-b=0 且kdUx X1X0這時(shí)直線將平面分為三個(gè)區(qū)域:對(duì)于直線上的點(diǎn),F(xiàn)(x,y)=0 ;對(duì)于直線上方的點(diǎn), F(x,y)0 ;對(duì)于直線下方的點(diǎn),F(xiàn)(x,y) F (x 1,y0 .5 )y 0. 5 x ( - b當(dāng)di0時(shí),則應(yīng)取正右方的 2。當(dāng)di=0時(shí),二者一樣合適,可以隨便取一個(gè)。我們約定取Pd,即:y 十19 0) y =y (di - 0)當(dāng)di0時(shí),取正右方像素Pd,要判斷再下一個(gè)像素應(yīng)取哪一個(gè),應(yīng)計(jì)算di 1 =F(x 2, Yi 0.5)=yi +0.5k x(十 2b=y +0.5k x( + 1b

6、-k=di -k此時(shí),dj的增量為-k下面計(jì)算4的初值。顯然,直線的第一個(gè)像素 B(x,yo)在直線上,因此相應(yīng) 的4的初始值計(jì)算如下:do =F(% 1,yo 0.5) =y0 0.5 -k(x0 2) -b =y0 - kx0 - b - k 0.5 =0. 5 k由于我們使用的只是di的符號(hào),因此可以用2d Ax代替di來(lái)擺脫小數(shù)。此時(shí) 算法只涉及整數(shù)運(yùn)算。這樣,0&k01時(shí),Bresenham算法的繪圖過(guò)程如下: 輸入直線的兩端點(diǎn)P0(X, YJ和PKX1, Y1);計(jì)算初始值 Ax, Ay, d =Ax 2Ay,x = X0,y =Y0 ;繪制點(diǎn)(x,y)。判斷d的符號(hào),若d0,則(

7、x,y)更新為(x+1 , y+1), d更 新為d+2 Ax-2兇;否貝U (x,y)更新為(x+1 , y), d更新為d-2Ay ;當(dāng)直線沒(méi)有畫完時(shí),重復(fù)步驟,否則結(jié)束。 kx1)(x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y; )x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy; DownIncre=-2*dy;while(x0.5時(shí), 直線更接近于像素點(diǎn)Pu(xj+1,另+1);當(dāng)di 0.5)yi 十 一 II yi (di 0時(shí),下一像素的y坐標(biāo) 增加1;否則,下一像素的y坐標(biāo)不增,即有x 1 =x

8、1yi i 二yi 1(e 0) .yi (0 M0)此時(shí),e的初值為-0.5,每走一步有ei+=e+k。當(dāng)e0時(shí),將e減1.改進(jìn)的Bresenham算法還有一個(gè)缺點(diǎn):在計(jì)算直線斜率與誤差時(shí),要用到小數(shù)與除法,不利于硬件實(shí)現(xiàn)。因此改進(jìn)如下:由于算法中只用到誤差項(xiàng)的符號(hào),于是可以用2eAx來(lái)替換e。這樣就能獲得整數(shù) Bresenham算法且可避免除法。 其算法步驟如下: 輸入直線的兩端點(diǎn)P0(X, YJ和PKX1, Y1);計(jì)算初始值 Ax, Ay , e = -Ax, x=X0,y=Y0繪制點(diǎn)(x,y) oe更新為e+2Ay。判斷e的符號(hào),若e0,則(x,y)更新為(x+1, y+1),同 時(shí)

9、將e更新為e-2ix ;否則(x,y)更新為(x+1, y);當(dāng)直線沒(méi)有畫完時(shí),重復(fù)步驟,否則結(jié)束。0 k 1時(shí)改進(jìn)的Bresenham算法繪制直線的程序如下:void BresenhamLine(int x0,int y0,int x1,int y1,int color)int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x0)y+;e=e-2*dx;5、圓的Bresenham算法原理給定圓心在原點(diǎn),半徑為R的圓,其方程為 x2 + y2 = R2。構(gòu)造函數(shù)F(x, y)=x + y - R20對(duì)于圓上的點(diǎn),有 F(x,y)=0;對(duì)

10、于圓外的點(diǎn),F(xiàn)(x,y)0;而2對(duì)于圓內(nèi)的點(diǎn),F(xiàn)(x,y)0.這里只考慮如下圖所示的第一象限內(nèi)x0,R2的八分八分之一圓弧。此時(shí)中點(diǎn)Bresenham畫圓算法要從點(diǎn)順時(shí)針地確定最佳逼近于該圓弧的像素序列對(duì)于該圓弧,由于最大位移方向?yàn)?x,因此其基本原理是:每次沿 x方向上走一步,而y方向上或減1,或減00如圖所示,假定當(dāng)前與圓弧最近的像素點(diǎn)已確定為P (xi,yi),那么,下一候選像素點(diǎn)只能是正右方的Pu(xi+1,yJ和右下方的Pd(x +1,y -1)。到底選取哪一個(gè)候選點(diǎn)依舊用中點(diǎn)進(jìn)行判別x假設(shè)M是Pu和Pd的中點(diǎn),即有M(x +1,y -0.5)。則當(dāng)F(xM,yM)0, 說(shuō)明Pd離圓

11、弧更近,應(yīng)取Pd(x十l,yi -1)。當(dāng)F(xM,yM)=0時(shí),在R和Pd之中隨 便選取一個(gè)即可,約定取Pd。構(gòu)造判別式di =F (xm,yM )= F (x 1,y- 0.5)x(1) y -(2 度&)當(dāng)dj0,下一點(diǎn)取B(為+1,y);當(dāng)di0時(shí),下一點(diǎn)取Fd (x+1,y 1)?,F(xiàn)在進(jìn)行誤差項(xiàng)的遞推。40,取正右方像素 巳(為+1,另),欲判斷再下一個(gè)像素應(yīng)取哪一個(gè),應(yīng)計(jì)算dp =F(x 2,yi -0.5)三 (xi 2j乂 一 0 25R 2=供 12)yi - 0 25)R2x2 3=dj 2x 3所以,沿正右方向,dj的增量為2為+3。di0時(shí),應(yīng)取右下方像素RXi+l%

12、-1),要判斷再下一個(gè)像素,則要計(jì)算d=F(Xi 2,yi -1.5)-(Xi 2+ - 1 25R 2= (Xi 12)y - 0 25 )R2x( 23 ) y( 22 )=di +2 (x -yi 巧所以,沿右下方向,判別式di的增量為2(x-y) +5。顯然所繪制圓弧段的第一個(gè)像素點(diǎn)為 P(0,R),因此判別式di的初始值d0 -F(1,R -0.5)_2_2=1 (R -0.5) -R= 1.25-R由于使用的只是di的符號(hào),因此可以用di-0.25代替di來(lái)擺脫小數(shù)。此時(shí)算法只涉及整數(shù)運(yùn)算。這樣初始化運(yùn)算d0 =1.25-R對(duì)應(yīng)于d0 =1-R。判別式dj0對(duì)應(yīng)于 di-0.25。

13、di-0.25 等價(jià)于 di0。于是可寫出中點(diǎn)Bresenham畫圓算法的步驟如下:輸入圓半徑R;計(jì)算初始值d0=1R, x=0, y=R; 繪制點(diǎn)(x,y)及其在八分圓中的另外7個(gè)對(duì)稱點(diǎn);判斷d的符號(hào)。若d0,則先將d更新為d+2x+3,再將(x,y)更新為(x+1,y);否則先將d更新為d+2(x-y)+5 ,再將(x,y)更新為(x+1,y-1); 當(dāng)xy時(shí),重復(fù)步驟和;否則結(jié)束程序。用中點(diǎn)Bresenham算法畫圓的程序如下:void MidBresenhamCircle(int r,int color)int x,y,d;x=0;y=r;d=1-r;while (x=y)Circle

14、Point(x,y,color);if(d 1000#pragma once#endif / _MSC_VER 1000#include InputDlg.h/ 對(duì)話框頭文件#include InputDlg2.hclass CTestView : public CViewprotected: / create from serialization onlyCTestView();DECLARE_DYNCREATE(CTestView)/ Attributespublic:CTestDoc* GetDocument();/ Operationspublic:void Mbline();Bres

15、enham 函數(shù)void GetMaxY();獲得屏幕的最大x值函數(shù)void GetMaxX();獲得屏幕的最大y值函數(shù)void CirclePoint(double x,double y);八分法畫圓子函數(shù)void Mbcircle();/Bresenham 算法/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CTestView)-11 -public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BO

16、OL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CTestView();#ifdef _DEBUGvirtual void AssertVa

17、lid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:double x0, y0, x1, y1;/直線的起點(diǎn)和終點(diǎn)坐標(biāo)int MaxX,MaxY;/屏幕x和y的最大坐標(biāo)double R;/圓的半徑/ Generated message map functionsprotected:/AFX_MSG(CTestView)afx_msg void OnMENUMbline();afx_msg void OnMENUMbcircle();/AFX_MSGDECLARE_MESSAGE_MAP();#ifndef

18、_DEBUG / debug version in TestView.cppinline CTestDoc* CTestView:GetDocument() return (CTestDoc*)m_pDocument; #endif/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif/ !defined(AFX_TESTVIEW_H_A75FDCFB_621C_4E38_A154_C344803E6372_

19、 _INCLUDED_)-12 - TestView.cpp/ TestView.cpp : implementation of the CTestView class /#include stdafx.h#include Test.h#include TestDoc.h#include TestView.h#define ROUND(a) int(a+0.5) 四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE口 = _FILE_;#endif/ CTestViewIMPLEMENT_DYNC

20、REATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)/AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUMbline, OnMENUMbline) ON_COMMAND(ID_MENUMbcircle, OnMENUMbcircle) /AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)

21、ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView二OnFilePrintPreview) END_MESSAGE_MAP()/ CTestView construction/destructionCTestView:CTestView()/ TODO: add construction code hereCTestView:CTestView() -13 -BOOL CTestView二PreCreateWindow(CREATESTRUCT& cs) (/ TODO: Modify the Window class or styles here by modif

22、ying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);)/ CTestView drawingvoid CTestView:OnDraw(CDC* pDC)(CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here)/ CTestView printingBOOL CTestView:OnPreparePrinting(CPrintInfo* pInfo)(/ default preparationretu

23、rn DoPreparePrinting(pInfo);)void CTestView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) (/ TODO: add extra initialization before printing)void CTestView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)(/ TODO: add cleanup after printing)/ CTestView diagnostics#ifdef _DEBUGvoid CTestView:A

24、ssertValid() const-14 -CView:AssertValid();)void CTestView:Dump(CDumpContext& dc) const(CView:Dump(dc);)CTestDoc* CTestView二GetDocument() / non-debug version is inline (ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CTestDoc); return (CTestDoc*)m_pDocument;).#endif/_DEBUG/ CTestView message handlersvoid

25、CTestView:Mbline()/Bresenham 函數(shù)(CClientDC dc(this);COLORREF rgb=RGB(0,0,255);/定義直線顏色為藍(lán)色 double x,y,d,k;x=x0;y=y0;k=(y1-y0)/(x1-x0);d=0.5-k;/ 定義x, y, k及d的初始值for(x=x0;x=x1;x+)(dc.SetPixel(ROUND(x),ROUND(y),rgb);if(d0)(y+;d+=1-k;/d=0時(shí),取正右方向像素點(diǎn),d的增量為-k)void CTestView:OnMENUMbline()/ 菜單函數(shù)(/ TODO: Add you

26、r command handler code hereInputDlg dlg;if(dlg.DoModal()=IDOK)(x0=dlg.m_x0;/變量 x0 即為 InputDlg 中的 m_x0-15 -y0=dlg.m_y0;變量 y0 即為 InputDlg 中的 m_y0 x1=dlg.m_x1;變量 x1 即為 InputDlg 中的 m_x1y1=dlg.m_y1;變量 y1 即為 InputDlg 中的 m_y1)一一AfxGetMainWnd()-SetWindowText(實(shí)驗(yàn):直線中點(diǎn) Bresenhan#法) RedrawWindow();Mbline();) void CTestView:GetMaxX()/得到客戶區(qū)的最大橫坐標(biāo) CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;)void CTestView:GetMaxY()/得到客戶區(qū)最大縱坐標(biāo)CRect Rect;GetClientRect(&Rect);MaxY=Rect.bottom;)void CTestView二Mbcircle()Bresenham 算法double x,y,d;d=1.25-R;x=0;y=R; 定義 d,x,y

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論