實(shí)驗(yàn)1-中點(diǎn)畫(huà)線和Bresenham畫(huà)線算法的實(shí)現(xiàn)_第1頁(yè)
實(shí)驗(yàn)1-中點(diǎn)畫(huà)線和Bresenham畫(huà)線算法的實(shí)現(xiàn)_第2頁(yè)
實(shí)驗(yàn)1-中點(diǎn)畫(huà)線和Bresenham畫(huà)線算法的實(shí)現(xiàn)_第3頁(yè)
實(shí)驗(yàn)1-中點(diǎn)畫(huà)線和Bresenham畫(huà)線算法的實(shí)現(xiàn)_第4頁(yè)
實(shí)驗(yàn)1-中點(diǎn)畫(huà)線和Bresenham畫(huà)線算法的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(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、精選優(yōu)質(zhì)文檔-傾情為你奉上計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)1 使用畫(huà)線算法,繪制直線段姓名系別班級(jí)學(xué)號(hào)實(shí)驗(yàn)日期指導(dǎo)教師實(shí)驗(yàn)成績(jī)杜艾蓮地信1012011.10.10一 實(shí)驗(yàn)?zāi)康募耙螅?)掌握?qǐng)D形學(xué)中常用的三種畫(huà)線算法:數(shù)值微分法、中點(diǎn)畫(huà)線法和Bresenham畫(huà)線算法。(2)掌握繪制直線的程序設(shè)計(jì)方法。(3)掌握使用文件來(lái)保存直線段的方法。(4)掌握從文本文件中恢復(fù)出直線的方法。二 實(shí)驗(yàn)內(nèi)容使用VC+ 6.0開(kāi)發(fā)環(huán)境,分別實(shí)現(xiàn)中點(diǎn)畫(huà)線算法和Bresenham畫(huà)線算法,繪制直線(注意,不能使用VC中已有的繪制直線的函數(shù)),并以文本文件的形式保存繪制的結(jié)果,可以從文本文件中恢復(fù)出以前繪制過(guò)的直線。三 算法

2、設(shè)計(jì)與分析 輸入P0(X0,Y0) 和P1(X1,Y1)計(jì)算初始值x,yd=x-2y,x=X0,y=Y0(x,y) 更新為(x+1,y+1),d更新為d+2x-2y(x,y)更新為(x+1,y),d更新為d-2y結(jié)束B(niǎo)resenham算法繪制直線的程序(僅包含整數(shù)運(yùn)算)。void MidBresenhamLine(int x0,int y0,int x1,int y1,int color) int dx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-

3、y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x<=x1)putpixel(x,y,color);X+;if(d<0)y+;d+=UpIncre;else d+=DownIncre;四 程序調(diào)試及運(yùn)行結(jié)果的自我分析與自我評(píng)價(jià)/ testView.cpp : implementation of the CTestView class#include "stdafx.h"#include "test.h"#include "testDoc.h"#include &qu

4、ot;testView.h"#include <iostream>/ ifstream、ofstream等位于其中#include <fstream>#include <string>/ string類型需要#include "DlgInput.h"/CDlgInput類的頭文件usingnamespace std;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CTestViewIMPLEMENT_

5、DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)/AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)ON_COMMAND(ID_MENUBRESENHAMLINE, OnMenubresenhamline)ON_COMMAND(ID_MENUCLEARVIEW, OnMenuclearview)ON_COMMAND(ID_FILE_OPEN, OnFileOpen)ON_COMMAND(ID_FILE_SAVE, OnFileSave)

6、/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CTestView construction/destructionCTestView:CTestView()/ TODO: add construction code he

7、rem_nFlag = -1;/ 不是任何繪圖類型CTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CTestView drawingvoid CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_V

8、ALID(pDoc);/ TODO: add draw code for native data hereif(1=m_nFlag)/中點(diǎn)畫(huà)線MidPointLine(m_X0, m_Y0, m_X1, m_Y1, RGB(255,0,0) );else if(2=m_nFlag)/ Bresenham畫(huà)線BresenhamLine(m_X0, m_Y0, m_X1, m_Y1, RGB(0,255,0) );/ CTestView printingBOOL CTestView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationr

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

10、rtValid() constCView:AssertValid();void CTestView:Dump(CDumpContext& dc) constCView:Dump(dc);CTestDoc* CTestView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc);return (CTestDoc*)m_pDocument;#endif /_DEBUG/ CTestView message handlersvoid CTestVi

11、ew:OnMenuitem32771() / TODO: Add your command handler code herem_nFlag = 1;/中點(diǎn)畫(huà)線CDlgInputdlg;if(IDOK=dlg.DoModal()m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();/重繪窗口void CTestView:OnMenubresenhamline() / TODO: Add your command handler code herem_nFlag = 2;/Bresenham畫(huà)線CDl

12、gInputdlg;if(IDOK=dlg.DoModal()m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();/重繪窗口/ 算法:中點(diǎn)畫(huà)線/ 輸入:起點(diǎn)(x0,y0),終點(diǎn)(x1,y1);/輸入要求x0<=x1;void CTestView:MidPointLine( int x0, int y0, int x1, int y1, int color )CDC * pDC=GetDC();int a,b,d0,d1,d2,d3,d4,d5,d,x,y;a=y0-y1; b=x1-x0;/

13、 之前的設(shè)置已經(jīng)保證始終有x1>=x0d=2*a+b; d0=2*a-b;d1=2*a; d2=2*(a+b); d3=2*b; d4=2*(a-b); d5=a-2*b;x=x0; y=y0;pDC->SetPixel(x,y,color);if(x=x1)/ 斜率k為無(wú)窮大if(y<=y1)while(y<=y1) pDC->SetPixel(x,y,color); y+;elsewhile(y>=y1) pDC->SetPixel(x,y,color); y-;/ if 斜率k為無(wú)窮大else/斜率k為有限值/double k=-a/b;/if(

14、 k+1>1e-6 && k-1<1e-6 | fabs(k-1)<1e-6 | fabs(k+1)<1e-6) /|k|<=1(即:-1<= k <=1),與1e-6比較是浮點(diǎn)數(shù)比較方法if( -b<=-a && -a<=b )/ 用浮點(diǎn)數(shù)比較在|k|=1.0f時(shí)容易出問(wèn)題,所以直接用整數(shù)比較(將斜率k轉(zhuǎn)換為a與b的比較;之前的設(shè)置已經(jīng)保證b為正數(shù))if(y<=y1)while(x<x1)if(d<0)x+;y+;d+=d2;elsex+;d+=d1; pDC->SetPixel(x

15、,y,color);elsewhile(x<x1)if(d0<0) x+;d0+=d1;else x+;y-; d0+=d4; pDC->SetPixel(x,y,color);/ if( |k|<=1 )else/ |k|>1if(y<=y1)while(x<x1)if(d<0)y+;d+=d3;elsey+;x+;d+=d2;pDC->SetPixel(x,y,color);elsewhile(x<x1)if(d5<0) x+;y-; d5+=d4;elsey-; d5+=-2*b;pDC->SetPixel(x,y,

16、color);/ else( |k|>1 )/ else 斜率k為有限值ReleaseDC(pDC);/ 算法:Bresenham畫(huà)線/ 輸入:起點(diǎn)(x0,y0),終點(diǎn)(x1,y1);/輸入要求x0<=x1;void CTestView:BresenhamLine( int x0, int y0, int x1, int y1, int color )CDC * pDC=GetDC();int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1)pDC->SetPixel(x,y,color); x+; e

17、=e+2*dy; if(e>0) y+; e=e-2*dx; void CTestView:OnMenuclearview() / TODO: Add your command handler code herem_X0=0;m_Y0=0;m_X1=0;m_Y1=0;RedrawWindow();/重繪窗口/ 打開(kāi)過(guò)去保存的文件,該文件包含直線的端點(diǎn)坐標(biāo)void CTestView:OnFileOpen()/ TODO: 在此添加命令處理程序代碼if( m_nFlag!=1 && m_nFlag!=2 )MessageBox("請(qǐng)先在菜單中選擇繪制直線的方法!&

18、quot;,"提示",MB_ICONWARNING);return;CFileDialogdlgFile (TRUE, _T("txt"), _T(""),OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, _T("線段端點(diǎn)坐標(biāo)文件(*.txt)|*.txt|"), this);if( IDOK = dlgFile.DoModal()CStringfileName = dlgFile.GetFileName();ifstreamrFile;rFile.open(fileName,ios:in)

19、;if ( ! rFile.is_open() )MessageBox("文件打開(kāi)失敗!","提示",MB_ICONWARNING);return;CStringstrLine0;stringstrLine;intnX,nY;/ 起點(diǎn)、終點(diǎn),兩個(gè)坐標(biāo)rFile>>strLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(",") ) );/ 解析文件,如“220,221”表示一個(gè)點(diǎn)的x、y坐標(biāo)nY = atoi( strLine0.

20、Mid( strLine0.Find(",")+1 ) );m_X0 = nX;m_Y0 = nY;rFile>>strLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(",") ) );nY = atoi( strLine0.Mid( strLine0.Find(",")+1 ) );m_X1 = nX;m_Y1 = nY;RedrawWindow();rFile.close();/ 保存當(dāng)前視圖上繪制的所有直線的端點(diǎn)坐標(biāo)void CTestView:OnFileSave()/ TODO: 在此添加命令處理程序代碼CFileDialogdlgFile(FALSE, _T("txt"), _T(""), OFN_OVERWR

溫馨提示

  • 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)論