版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)財(cái)務(wù)知識(shí)培訓(xùn)課件下載
- 2024招標(biāo)公司實(shí)習(xí)生項(xiàng)目運(yùn)營(yíng)管理實(shí)習(xí)報(bào)告書(shū)3篇
- 專業(yè)展廳租賃服務(wù)協(xié)議范本版B版
- 中國(guó)戲曲學(xué)院《中小學(xué)心理健康與道德教育》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州工程技術(shù)學(xué)院《3維建模技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年進(jìn)口燕窩分銷協(xié)議3篇
- `2024年專用`0fOc電力設(shè)施建設(shè)施工合同3篇
- 《電纜直埋技術(shù)》課件
- 讀書(shū)活動(dòng)在幼兒園的創(chuàng)新方式計(jì)劃
- 雙十一旅游購(gòu)物攻略模板
- 《春秋》導(dǎo)讀學(xué)習(xí)通章節(jié)答案期末考試題庫(kù)2023年
- 物流無(wú)人機(jī)垂直起降場(chǎng)選址與建設(shè)規(guī)范(征求意見(jiàn)稿)
- 2023年湖南成人學(xué)位英語(yǔ)考試真題
- 分居聲明告知書(shū)范本
- 能源中國(guó)(上海電力大學(xué))超星爾雅學(xué)習(xí)通網(wǎng)課章節(jié)測(cè)試答案
- 采購(gòu)計(jì)劃流程圖
- 強(qiáng)迫振動(dòng)法測(cè)量單自由度系統(tǒng)固有頻率和阻尼比
- GB/T 4795-200915 ppm艙底水分離器
- DL T774-2015規(guī)程試題庫(kù)(含答案)
- CB/T 3281-1997鋁質(zhì)艙室空腹門(mén)
- 采購(gòu)合同采購(gòu)合同采購(gòu)合同
評(píng)論
0/150
提交評(píng)論