圖形學(xué)實(shí)驗(yàn)一VisualC++圖形程序設(shè)計(jì)_第1頁
圖形學(xué)實(shí)驗(yàn)一VisualC++圖形程序設(shè)計(jì)_第2頁
圖形學(xué)實(shí)驗(yàn)一VisualC++圖形程序設(shè)計(jì)_第3頁
圖形學(xué)實(shí)驗(yàn)一VisualC++圖形程序設(shè)計(jì)_第4頁
圖形學(xué)實(shí)驗(yàn)一VisualC++圖形程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)一 Visual C+圖形程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康腣isual C+是在Microsoft C的基礎(chǔ)上發(fā)展而來的,隨著計(jì)算機(jī)軟、硬件技術(shù)的快速發(fā)展,如今Visual C+已成為集編輯、編譯、運(yùn)行、調(diào)試于一體功能強(qiáng)大的集成編程環(huán)境。本章以Visual C+ 6.0為對象,主要介紹Visual C+集成編成環(huán)境的使用、圖形設(shè)備接口和常用圖形程序設(shè)計(jì)、鼠標(biāo)編程以及菜單設(shè)計(jì)等基礎(chǔ),目的是通過對Visual C+的學(xué)習(xí),掌握Visual C+圖形程序設(shè)計(jì)的方法,為計(jì)算機(jī)圖形學(xué)原理部分的算法實(shí)現(xiàn)提供程序工具和方法。二、實(shí)驗(yàn)任務(wù)1 學(xué)習(xí)Visual C+圖形程序設(shè)計(jì)的方法;2 掌握Visual C+集成編成

2、環(huán)境的使用、圖形設(shè)備接口和常用圖形程序設(shè)計(jì)。三、基礎(chǔ)知識和實(shí)驗(yàn)步驟31 Visual C+ 6.0應(yīng)用程序開發(fā)方法 介紹Visual C+ 6.0集成開發(fā)環(huán)境,以一個簡單的實(shí)例介紹利用Visual C+應(yīng)用程序工程建立方法和程序設(shè)計(jì)框架。3.1.1 Visual C+的集成開發(fā)環(huán)境從開始菜單中啟動Visual C+ 6.0,進(jìn)入開發(fā)集成環(huán)境。打開一個項(xiàng)目后,可以看到Visual C+ 6.0的開發(fā)環(huán)境由標(biāo)題欄、工具欄、工作區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄組成,見圖3.1所示。標(biāo)題欄用于顯示應(yīng)用程序名和所打開的文件名,標(biāo)題欄的顏色可以表明對應(yīng)窗口是否被激活。菜單欄包括文件、編輯、顯示、插

3、入、工程、編譯、工具、窗口和幫助九項(xiàng)主菜單,包含了從源代碼的編輯、界面設(shè)計(jì)、程序調(diào)試和編譯運(yùn)行在內(nèi)的所有功能。工具欄列出了常用的菜單命令功能和對象方法。工具欄的下面是兩個窗口,一個是工作區(qū)窗口,用于列出工程中的各種對象,一個是源代碼編輯窗口,用于各個對象的程序設(shè)計(jì)。輸出窗口顯示項(xiàng)目建立過程中所產(chǎn)生的各種信息。屏幕底端是狀態(tài)欄,它給出當(dāng)前操作或所選擇命令的提示信息。標(biāo)題欄菜單欄工作區(qū)源代碼編輯窗口狀態(tài)欄 圖3.1 Visual C+ 6.0集成開發(fā)環(huán)境3.1.2 應(yīng)用程序工程的建立方法Visual C+提供了一種稱為App Wizard的工具,利用該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需要

4、的應(yīng)用程序框架。在這個基礎(chǔ)上,用戶可以進(jìn)一步將自己編寫的程序加入到這個框架中,實(shí)現(xiàn)用戶程序的功能。下面介紹建立VcApp應(yīng)用程序框架的方法,其它應(yīng)用程序的方法都與此類似。第一步:啟動Visual C+,選擇工程方法從開始菜單中選擇 Visual C+,進(jìn)入Visual C+集成環(huán)境。從文件菜單中選擇新建(New)命令,彈出圖3-2對話框。切換到工程(Projects)標(biāo)簽,項(xiàng)目類型選擇MFC AppWizard(exe),輸入工程的名字(如VcApp),選擇項(xiàng)目放置的位置,然后單擊“確定”按鈕。圖3-2 Visual C+的New對話框第二步:設(shè)置應(yīng)用程序的特性。這些設(shè)置包括六個問題,每一個問

5、題都有不同的選項(xiàng)供選擇。一個問題選擇完后,通過“下一步”(Next)選擇下一個問題,直到六個問題選擇完畢。還可以通過“上一步”(Back)返回上一個問題重新選擇。下面繼續(xù)上面的例子,在單擊“確定”按鈕后,彈出第一個問題窗口,如圖3-3所示。第一個問題是建立什么類型的應(yīng)用程序,有三個選項(xiàng):單個文檔(Single document)、多重文檔(Multiple document)和基本對話(Dialog based)。單個文檔應(yīng)用程序主窗口中只有一個窗口,多重文檔可以在主窗口中開多個子窗口,基本對話主窗口是一個對話框。例中選擇單個文檔,單擊“確定”,進(jìn)入下一個問題,如圖3-4所示。第二個問題是數(shù)據(jù)

6、庫的支持,是否用ODBC存取數(shù)據(jù)庫,有四個選項(xiàng):不包括數(shù)據(jù)庫的支持(None)、僅包含ODBC頭文件(Header files only)、指定一個數(shù)據(jù)庫但沒有文件支持和指定一個數(shù)據(jù)庫但需要文件支持。當(dāng)選擇了后兩項(xiàng),則需要用戶選擇一個已經(jīng)建立的數(shù)據(jù)庫。例中不需要數(shù)據(jù)庫支持,選擇第一個選項(xiàng)“否”,進(jìn)入第三個問題,如圖3-5所示。 圖3-3 第一個問題:選擇應(yīng)用程序的類型 圖3-4第二個問題:選擇是否要用ODBC支持第三個問題是對ActiveX的支持。有五個選項(xiàng):(1)沒有對ActiveX的支持;(2)ActiveX容器,它可以包含鏈接和嵌入對象。容器不能為其它的ActiveX程序提供支持,它只能

7、維護(hù)嵌入對象;(3)微型服務(wù)器(Mini-server),應(yīng)用程序不能獨(dú)立運(yùn)行,只能被調(diào)用為其它程序建立ActiveX對象。(4)完整服務(wù)器(Full-server),它能夠獨(dú)立運(yùn)行,并能夠?yàn)槠渌鼞?yīng)用程序建立ActiveX對象。(5)容器和服務(wù)器,一個應(yīng)用程序可以同時是容器和服務(wù)器。在例子中,選擇第一個選項(xiàng),沒有對ActiveX的支持,單擊“下一個”(Next)進(jìn)入下一個問題。 圖3-5第三個問題:選擇是否對ActiveX的支持 圖3-6應(yīng)用程序的特性和高級選項(xiàng)第四個問題是應(yīng)用程序的特性和高級選項(xiàng),如圖3-6所示。例中全部采用默認(rèn)選項(xiàng),進(jìn)入下一個問題。第五個問題是項(xiàng)目的風(fēng)格、原文件注釋和MFC

8、庫類型,如圖3-7所示。在例子中全部采用默認(rèn)選項(xiàng),進(jìn)入第六個問題。第六個問題是確定類名和文件名,如圖3-8所示。 基于第一個問題到第五個問題的回答,AppWizard會把將要建立的新類的名稱通知用戶。AppWizard將為應(yīng)用程序建立四個新類,CVcAppApp是應(yīng)用程序類,它是CWinApp的派生類。CMainFrame是一個擁有應(yīng)用程序主窗口的類。CVcAppDoc和CVcAppView是該應(yīng)用程序的文檔和視圖類。這些名字用戶可以改變。最后單擊“完成”(Finish),顯示所建項(xiàng)目的信息,單擊“確定”后,項(xiàng)目建立完成。 圖3-7項(xiàng)目的風(fēng)格、原文件注釋和MFC庫類型 圖3-8通知MFC產(chǎn)生的

9、類名稱3.1.3 輸入源程序進(jìn)行程序設(shè)計(jì) 應(yīng)用程序項(xiàng)目工程建立以后,就為應(yīng)用程序的開發(fā)建立了一個框架,這是不輸入任何程序代碼,對該項(xiàng)目程序進(jìn)行編譯和運(yùn)行,可以生成一個完整的窗口程序。用戶根據(jù)項(xiàng)目工程中的不同類,輸入自己設(shè)計(jì)的程序代碼,完成用戶的程序設(shè)計(jì)。 例如,從VcApp Classes中找到CVcAppView的OnDraw()函數(shù),如圖3-9所示。雙擊OnDraw()函數(shù),這時系統(tǒng)會打開VcAppView.cpp文件,而且光標(biāo)正置于OnDraw()函數(shù)中,在其中輸入下列語句:pDC->TextOut(30,30,"同學(xué)們好,歡迎使用VC+編程!");編譯并運(yùn)行該

10、程序,運(yùn)行結(jié)果如圖3-10所示。 圖3-9 輸入程序源代碼 圖3-10 運(yùn)行結(jié)果32 圖形設(shè)備接口和圖形程序設(shè)計(jì)3.2.1 圖形設(shè)備接口簡介在Windows系統(tǒng)中,程序都是通過一個叫做圖形設(shè)備接口(GDI, Graphics Device Interface)的抽象接口和硬件打交道,Windows會自動將設(shè)備環(huán)境表映射到相應(yīng)的物理設(shè)備,并且會提供正確的輸入/輸出指令。GDI是Windows系統(tǒng)核心的三種動態(tài)鏈接庫之一,它管理Windows系統(tǒng)的所有程序的圖形輸出。在Windows系統(tǒng)中,GDI向程序員提供了高層次的繪圖函數(shù),只要掌握這些繪圖函數(shù),就可以很方便地進(jìn)行圖形程序設(shè)計(jì)。另一個概念是設(shè)備

11、描述表(DC, Device Context)。DC是一個數(shù)據(jù)結(jié)構(gòu),當(dāng)程序向GDI設(shè)備中繪圖時,需要訪問該設(shè)備的DC。MFC將GDI的DC封裝在C+類中,包括CDC類和CDC派生類,這些類中的許多成員都是對本地GDI繪圖函數(shù)進(jìn)行簡單封裝而形成的內(nèi)聯(lián)函數(shù)。DC的作用就是提供程序與物理設(shè)備或者虛擬設(shè)備之間的聯(lián)系,除此之外,DC還要處理繪圖屬性的設(shè)置,如文本的顏色等。程序員可以通過調(diào)用專門的GDI函數(shù)修改繪圖屬性,如SetTextColor()函數(shù)。CDC類是GDI封裝在MFC中最大的一個類,它表示總的DC。表3.1列出了CDC中的一些常用繪圖函數(shù)。表3.1 CDC類中常用繪圖函數(shù)函 數(shù)描 述使用頻

12、率Arc()橢圓弧*BitBlt()把位圖從一個DC拷貝到另一個DC*Draw3dRect()繪制三維矩形*DrawDragRect()繪制用鼠標(biāo)拖動的矩形*DrawEdge()繪制矩形的邊緣*DrawIcon()繪制圖標(biāo)*Ellipse()繪制橢圓*FillRect()繪制用給定的畫刷顏色填充矩形*FillRgn()繪制用給定的畫刷顏色填充區(qū)域*FillSolidRed()繪制用給定的顏色填充矩形*FloodFill()用當(dāng)前的畫刷顏色填充區(qū)域*FrameRect()繪制矩形邊界*FrameRgn()繪制區(qū)域邊界*GetBKColor()獲取背景顏色*GetCurrentBitmap()獲取

13、所選位圖的指針*GetCurrentBrush()獲取所選畫刷的指針*GetCurrentFont()獲取所選字體的指針*GetCurrentPalette()獲取所選調(diào)色板的指針*GetCurrentPen()獲取所選畫筆的指針*GetCurrentPosition()獲取畫筆的當(dāng)前位置*GetDeviceCaps()獲取顯示設(shè)備能力的信息*GetMapMode()獲取當(dāng)前設(shè)置映射模式*Getpixel()獲取給定像素的RGB顏色值*GetPolyFillMode()獲取多邊形填充模式*GetTextColor()獲取文本顏色*GetTextExtent()獲取文本的寬度和高度*GetTex

14、tMetrics()獲取當(dāng)前文本的信息*GetWindow()獲取DC窗口的指針*GrayString()繪制灰色文本*LineTo()繪制直線*MoveTo()設(shè)置當(dāng)前畫筆位置*Pie()繪制餅圖*Polygon()繪制多邊形*PolyLine()繪制一組直線*RealizePalette()將邏輯調(diào)色板映射到系統(tǒng)調(diào)色板*Rectangle()繪制矩形*RoundRect()繪制圓角矩形*SelectObject()選擇GDI繪圖對象*SelectPalette()選擇邏輯調(diào)色板*SelectStockObject()選擇預(yù)定義圖形對象*SetBkColor()設(shè)置背景顏色*SetMapMo

15、de()設(shè)置映射模式*SetPixel()把像素設(shè)定為給定的顏色*SetTextColor()設(shè)置文本顏色*StretchBlt()把位圖從一個DC拷貝到另一個DC,并根據(jù)需要擴(kuò)展或壓縮位圖*TextOut()繪制字符串文本*這些函數(shù)的語法和使用可以通過MSDN幫助查詢。3.2.2節(jié)主要介紹Windows中基本圖形,包括點(diǎn)、直線、圓、圓弧、矩形、橢圓、扇形、折線等程序設(shè)計(jì)3.2.2 繪制基本圖形(1)畫點(diǎn) SetPixel()函數(shù)可以在指定的坐標(biāo)位置按指定的顏色畫點(diǎn)。函數(shù)原型說明如下:COLORREF CDC: SetPixel(int X, int Y, COLORREF crColor);

16、 其中,(X,Y)為點(diǎn)的坐標(biāo)位置,crColor參數(shù)為點(diǎn)的顏色值。如果函數(shù)調(diào)用成功,則函數(shù)返回像素的顏色值,否則返回值為-1。顏色值通過RGB(Red,Green,Blue)來設(shè)置,其中三個參數(shù)取值0255。例如,在VcAPP項(xiàng)目中,在CVcAppView類中的OnDraw()函數(shù)中加入下列畫點(diǎn)語句:/繪制一組彩色點(diǎn)/繪制一組彩色點(diǎn)pDC->TextOut(20,20,"point:");pDC->SetPixel(100,20,RGB(255,0,0); pDC->SetPixel(110,20,RGB(0,255,0);pDC->SetPixel

17、(120,20,RGB(0,0,255);pDC->SetPixel(100,20,RGB(255,255,0);pDC->SetPixel(100,20,RGB(255,0,255);pDC->SetPixel(100,20,RGB(0,255,255);pDC->SetPixel(100,20,RGB(0,0,0);pDC->SetPixel(100,20,RGB(255,255,255);運(yùn)行程序,查看運(yùn)行結(jié)果。(2)畫直線和折線畫直線需要LineTo()和MoveTo()兩個函數(shù)的配合使用。LineTo()函數(shù)以當(dāng)前位置所在的點(diǎn)為直線的起點(diǎn),另指定一個點(diǎn)為

18、直線的終點(diǎn),畫出一段直線。直線的顏色通過畫筆的顏色來設(shè)定,在后面介紹。LineTo()函數(shù)原型說明如下:BOOL CDC: LineTo(int nXEnd, int nYEnd);直線的終點(diǎn)位置由(nXEnd, nYEnd)指定。如果函數(shù)調(diào)用成功,那么該點(diǎn)就成為當(dāng)前位置,并返回TRUE,否則返回FALSE。MoveTo()函數(shù)只是將當(dāng)前位置移動到指定位置,它并沒有畫出直線,其函數(shù)說明為:BOOL CDC: MoveTo (int X, int Y);示例:在CVcAppView類中的OnDraw()函數(shù)中加入下列畫點(diǎn)語句:/繪制直線pDC->TextOut(20,60,"Li

19、ne:");pDC->MoveTo(20,90); pDC->LineTo(160,90);Polyline()函數(shù)用來畫一條折線,而PolyPolyline()函數(shù)則用來畫多條折線,它們的函數(shù)原型說明如下:BOOL CDC:Polyline(COUST POINT *lppt, int cPoints);BOOL CDC:PolyPolyline(COUST POINT * lppt, COUST DWORD *lpdwPolyPoints, DWORD cCount); 在Polyline()函數(shù)中,lppt是指向折線頂點(diǎn)數(shù)組的指針,而cPoints是折線頂點(diǎn)數(shù)組中的

20、頂點(diǎn)數(shù)。例如,繪制一條具有4個頂點(diǎn)的折線,程序如下:POINT polylinepoint4=70,240,20,190,70,190,20,240;/從(70,240)-(20,190)-共四個頂點(diǎn)三條線pDC->Polyline(polylinepoint,4);在PolyPolyline()函數(shù)中,lppt是指向保存頂點(diǎn)數(shù)組的指針,而各條折線的頂點(diǎn)數(shù)則保存在lpdwPolyPoints參數(shù)所指向的數(shù)組中,最后的cCount參數(shù)指定折線的數(shù)目。例如:POINT polypolylinePt9=95,160,120,185,120,250,145,160,120,185,90,185,

21、150,185,80,210,160,210; DWORD dwPolyPoints4=3,2,2,2; /分四段折線,分別占用3,2,2,2個頂點(diǎn) pDC->PolyPolyline(polypolylinePt, dwPolyPoints, 4);注:由于一條折線至少需要2個頂點(diǎn),因此dwPolyPoints數(shù)組中的數(shù)不應(yīng)該小于2。(3)畫弧線和曲線通過Arc()函數(shù)畫弧線或整個橢圓。橢圓限定在一個矩形內(nèi),稱為外接矩形。Arc()函數(shù)的圓形說明如下:BOOL CDC: Arc(int nLeftRect, int nTopRect, int nRightRect, int nBott

22、omRect,int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc);其中,(nLeftRect, nTopRect)是外接矩形的左上角坐標(biāo)值,(nRightRect, nBottomRect)是外接矩形的右下角坐標(biāo)值。而橢圓中心與點(diǎn)(nXStartArc, nYStartArc)所構(gòu)成的射線與橢圓的交點(diǎn)成為弧線的起點(diǎn),橢圓中心與點(diǎn)(nXEndArc, nYEndArc)所構(gòu)成的射線與橢圓的交點(diǎn)成為弧線的終點(diǎn)。橢圓上從始點(diǎn)到終點(diǎn)就形成一條弧線。 在Windows系統(tǒng)中,弧線從始點(diǎn)到終點(diǎn)的方向是逆時針方向,但可以通過SetArcDi

23、rection()函數(shù)將繪制弧線方向設(shè)置為順時針方向。示例,用Arc()繪制圓、圓弧和橢圓,程序如下:for (i=1;i<6;i+) pDC->Arc(260-5*i,70-5*i,260+5*i,70+5*i,0,0,0,0);/畫五個圓for (i=3;i<6;i+) pDC->Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260+10*i*cos(60*3.1415926/180),/注意include”math.h”(int)70+10*i*sin(60*3.1415926/180),(int)260+10*i*

24、cos(60*3.1415926/180),(int)70-10*i*sin(60*3.1415926/180); pDC->Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260-10*i*cos(60*3.1415926/180),(int)70-10*i*sin(60*3.1415926/180),(int)260-10*i*cos(60*3.1415926/180),(int)70+10*i*sin(60*3.1415926/180);Bezier曲線是最常見的非規(guī)則曲線之一。Bezier曲線屬于三次曲線,需要四個控制頂點(diǎn)來確定一條B

25、ezier曲線,其中曲線通過第一點(diǎn)和最后一點(diǎn),并且第一條邊和最后一條邊是曲線在起點(diǎn)和終點(diǎn)處的切線,從而確定了曲線的走向。PolyBezier()函數(shù)可以畫出一條或多條Bezier曲線,其函數(shù)原型說明如下:BOOL CDC: PolyBezier(CONST POINT * lppt, DWORD cPoints);其中,lppt參數(shù)是曲線控制頂點(diǎn)所組成的數(shù)組,cPoints參數(shù)表示lppt數(shù)組中的頂點(diǎn)數(shù),一條Bezier曲線需要四個控制頂點(diǎn)。如果lppt數(shù)組用于畫多條Bezier曲線,第二條以后的曲線只需要三個控制頂點(diǎn),因?yàn)楹竺娴那€總是把前一條曲線的終點(diǎn)作為自己的起點(diǎn)。示例,給出四個控制頂點(diǎn)

26、,畫出一條Bezier曲線和特征多邊形。/繪制Bezier 曲線POINT polyBezier4=20,310,60,240,120,300,160,230;pDC->Polyline(polyBezier,4);pDC->PolyBezier(polyBezier,4);(4)畫封閉曲線Windows中提供了一組畫封閉曲線的函數(shù),包括繪制矩形、多邊性、橢圓等,這些畫封閉曲線的函數(shù)不但可以利用畫筆來畫出輪廓線,同時還可以利用畫刷來填充這些封閉曲線所圍成的區(qū)域。Rectangle()函數(shù)用來畫矩形,其函數(shù)原型說明如下:BOOL CDC: Rectangle(int nLeftRec

27、t, int nTopRect, int nRightRect, int nBottomRect);其中,參數(shù)nLeftRect和 nTopRect給出了矩形左上角的坐標(biāo),而nRightRect和 nBottomRect則給出矩形的右下角坐標(biāo)。Ellipse()函數(shù)的作用則是畫橢圓形。在Ellipse()函數(shù)中,橢圓是由其外接矩形來確定的,外接矩形的中心與橢圓中心重合,矩形的長與寬和橢圓的長短軸相等。函數(shù)說明如下:BOOL CDC: Ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);其中的參數(shù)說明與Rec

28、tangle()函數(shù)相同。RoundRect()函數(shù)用來畫圓角矩形,其函數(shù)的原型說明如下:BOOL CDC: RoundRect(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,int nWidth, int nHeight);其中的前四個參數(shù)與Rectangle()函數(shù)相同,nWidth表示圓角的寬度, nHeight表示圓角的高度。Polygon()函數(shù)用來畫封閉的任意多邊形,其函數(shù)原型說明如下:BOOL CDC: Polygon(COUST POINT *lpPoints, int cCount); 其中的參數(shù)說明

29、與Polyline()函數(shù)相同。但兩個函數(shù)有區(qū)別,Polygon()函數(shù)會自動將起點(diǎn)和終點(diǎn)相連形成封閉的多邊形,而Polyline()函數(shù)則畫出多條折線,只有當(dāng)最后一點(diǎn)與起點(diǎn)相同時才畫出封閉的多邊形。示例,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:/繪制矩形、圓角矩形、橢圓和多邊形pDC->Rectangle(190,270,250,310);pDC->RoundRect(265,270,330,310,30,20);pDC->Ellipse(260-50,200-30,260+50,200+30);POINT polygonPts3=390,160,430,220,350

30、,210;pDC->Polygon(polygonPts,3);實(shí)驗(yàn)二 基本圖形的生成技術(shù)A直線生成算法一、實(shí)驗(yàn)?zāi)康?在一個圖形系統(tǒng)中,基本圖形(也稱為圖元、圖素等)的生成技術(shù)是最基本的,任何復(fù)雜的圖形都是由基本圖形組成的,基本圖形生成的質(zhì)量直接影響該圖形系統(tǒng)繪圖的質(zhì)量。所以,需要設(shè)計(jì)出精確的基本圖形生成算法,以確保圖形系統(tǒng)繪圖的精確性。本次實(shí)驗(yàn)的目的就是驗(yàn)證直線生成的三種掃描算法,并要求對基本算法進(jìn)行擴(kuò)充和改進(jìn),包括:利用Visual C+實(shí)現(xiàn)三種直線生成算法,驗(yàn)證算法的正確性;二、實(shí)驗(yàn)任務(wù)(2學(xué)時)1 理解三種直線生成算法思想,寫出實(shí)現(xiàn)程序;2 將10個像素作為步距單位,直線算法的示

31、例。三、基本知識和實(shí)驗(yàn)步驟任務(wù)一:實(shí)現(xiàn)三種畫線程序DDA算法分析假設(shè) 直線的起點(diǎn)坐標(biāo)為P1 (x1,y1),終點(diǎn)坐標(biāo)為P2 (x2,y2), x方向的增量為 xx2x1 ;y方向上增量為 yy2y1,直線的斜率為 kyx當(dāng) xy 時,讓 x 從 x1 到 x2 變化,每步遞增 1,那么,x 的變化可以表示為 xi+1xi1,y 的變化可以表示為 yi+1yik用上式可求得圖中直線 P1P2 和 y 向網(wǎng)格線的交點(diǎn),但顯示時要用舍入找到最靠近交點(diǎn)處的象素點(diǎn)耒表示。當(dāng) x<y 時,讓 y 遞增 1,x作相應(yīng)變化。綜合考慮,按照從(x1, y1)到(x2, y2)方向不同,分8個象限。對于方向

32、在第1a象限內(nèi)的直線而言,取增量值Dx=1,Dy=m。對于方向在第1b象限內(nèi)的直線而言,取增量值Dy=1,Dx=1/m。直線Bresenham算法分析 設(shè)直線從起點(diǎn)(x1, y1)到終點(diǎn)(x2, y2)。直線可表示為:方程y=mx+b,其中b=y1-m*x1,m=(y2-y1/(x2-x1)=dy/dx;此處的討論先將直線方向限于1a象限,在這種情況下,當(dāng)直線光柵化時,x每次都增加1個單元,即xi+1 = xi + 1而y的相應(yīng)增加值應(yīng)當(dāng)小于1。為了光柵化,yi+1只可能選擇右圖中兩種位置之一。yi+1的位置選擇yi+1 =yi或者yi+1=yi+1,選擇的原則是看精確值y與yi及yi+1的距

33、離d1及d2的大小而定。計(jì)算公式為y = m(xi + 1) + b (1)d1 = y - yi (2)d2 = yi +1 - y (3)如果d1-d2>0,則yi+1=yi+1,否則yi+1=yi。將式(1)、(2)、(3)代入d1-d2,再用dx乘等式兩邊,并以Pi=(d1-d2) dx代入上述等式,得Pi = 2xidy-2yidx+2dy+(2b-1) dx (4)其中,d1-d2是用以判斷符號的誤差。由于在1a象限,dx總大于0,所以Pi仍舊可以用作判斷符號的誤差。將(4)式中的i用i+1替換,于是Pi+1為Pi+1 = Pi+2dy-2(yi+1-yi) dx求誤差的初值

34、P1,可將x1、y1和b代入式(4)中的xi、yi而得到 P1 = 2dy-dx 綜述上面的推導(dǎo),第1a象限內(nèi)的直線Bresenham算法思想如下: 畫點(diǎn)(x1, y1),dx=x2-x1,dy=y2-y1,計(jì)算誤差初值P1=2dy- dx,i=1; 求直線的下一點(diǎn)位置 xi+1 = xi + 1 如果Pi>0,則yi+1=yi+1,否則yi+1=yi; 畫點(diǎn)(xi+1, yi+1); 求下一個誤差Pi+1,如果Pi>0,則Pi+1=Pi+2dy-2dx,否則 Pi+1=Pi+2dy; i=i+1;如果i<dx+1則轉(zhuǎn)步驟2;否則結(jié)束操作。實(shí)驗(yàn)步驟:1 建立一個DDALine

35、的工程文件;2 添加ddaline()成員函數(shù)方法:在工作區(qū)中選擇CLASSVIEW類窗口,右擊CDDAlineView類,選擇“add member function”,定義如下的成員函數(shù):void ddaline(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color);3 編寫自定義的成員函數(shù)ddaline()程序 void CDDALineView:ddaline(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) int i; float length,x,y,dx,dy;

36、 length=abs(x1-x0); if (abs(y1-y0)>length) length=float(abs(y1-y0); dx=(float(x1-x0)/length; dy=(float(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;i<=int(length);i+) pDC->SetPixel(int)x,(int)y,color); x=x+dx;y=y+dy; 4編寫OnDraw()函數(shù)void CDDALineView:OnDraw(CDC* pDC)CDDALineDoc* pDoc = GetDocume

37、nt();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here ddaline(pDC,100,100,200,50,RGB(255,0,0);/1a ddaline(pDC,100,100,150,0,RGB(255,0,0);/1bddaline(pDC,100,100,50,0,RGB(255,0,0);/2bddaline(pDC,100,100,0,50,RGB(255,0,0);/2addaline(pDC,100,100,0,150,RGB(255,0,0);/3addaline(pDC,100,100,50,

38、200,RGB(255,0,0);/3b ddaline(pDC,100,100,150,200,RGB(255,0,0);/4bddaline(pDC,100,100,200,150,RGB(255,0,0);/4a5編譯、調(diào)試和運(yùn)行程序,查看程序結(jié)果。任務(wù)二:放大10倍后,算法演示程序 先畫出(100,100)到(600,400)大小為10的網(wǎng)格,然后從(100,100)以10為單位,計(jì)算出直線上各個像素位置。步驟:1 建立DDA2Line工程;2 在OnDraw()函數(shù)中畫出網(wǎng)格,并調(diào)用DDA2Line()函數(shù) void CDDA2LineView:OnDraw(CDC* pDC)CDD

39、A2LineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/畫網(wǎng)格int gi,gj;/畫橫線pDC->TextOut(70,70,"(100,100)");pDC->MoveTo(100,100);for(gj=100;gj<=400;gj=gj+10) pDC->MoveTo(100,gj);pDC->LineTo(600,gj);/畫豎線 pDC->MoveTo(100,100);for (gi=100;g

40、i<=600;gi=gi+10) pDC->MoveTo(gi,100);pDC->LineTo(gi,400); pDC->TextOut(590,410,"(600,400)");/畫出像素點(diǎn)DDA2Line(pDC,100,100,600,400,RGB(255,0,0);3添加DDA2Line()成員函數(shù)方法:在工作區(qū)中選擇CLASSVIEW類窗口,右擊CDDAlineView類,選擇“add member function”,定義如下的成員函數(shù):void DDA2Line(CDC* pDC,int x0,int y0,int x1,int

41、y1,COLORREF color);4.編寫DDA2Line()函數(shù) void CDDA2LineView:DDA2line(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) /畫網(wǎng)格int gi,gj;/畫橫線pDC->TextOut(70,70,"(100,100)");pDC->MoveTo(100,100);for(gj=100;gj<=400;gj=gj+10) pDC->MoveTo(100,gj);pDC->LineTo(600,gj);/畫豎線 pDC->

42、MoveTo(100,100);for (gi=100;gi<=600;gi=gi+10) pDC->MoveTo(gi,100);pDC->LineTo(gi,400); pDC->TextOut(590,410,"(600,400)");/畫出像素點(diǎn)DDA2Line(pDC,100,100,600,400,RGB(255,0,0);5.調(diào)試、運(yùn)行程序直線Bresenham算法實(shí)驗(yàn)步驟:1、建立一個BresenhamLine的工程文件;2、添加BresenhamLine()成員函數(shù)方法:在工作區(qū)中選擇CLASSVIEW類窗口,右擊CDDAlineView類,選擇“add member function”,定義如下的成員函數(shù):void BresenhamLine(CDC *pDC, int x1, int y1, int x2, int y2, COLORREF color);3、編寫自定義的成員函數(shù)BresenhamLine()程序 void CBresenhamLineView:BresenhamLine(CDC *pDC, int x1, int y1, int x2, int y2, COLORREF color) int

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論