計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)二 基本圖形(共15頁(yè))_第1頁(yè)
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)二 基本圖形(共15頁(yè))_第2頁(yè)
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)二 基本圖形(共15頁(yè))_第3頁(yè)
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)二 基本圖形(共15頁(yè))_第4頁(yè)
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)二 基本圖形(共15頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)二 基本(jbn)圖形(元)生成技術(shù)(一) 直線(zhxin)生成算法一、實(shí)驗(yàn)(shyn)目的 在一個(gè)圖形系統(tǒng)中,基本圖形(也稱為圖元、圖素等)的生成技術(shù)是最基本的,任何復(fù)雜的圖形都是由基本圖形組成的,基本圖形生成的質(zhì)量直接影響該圖形系統(tǒng)繪圖的質(zhì)量。所以,需要設(shè)計(jì)出精確的基本圖形生成算法,以確保圖形系統(tǒng)繪圖的精確性。本次實(shí)驗(yàn)的目的就是驗(yàn)證直線生成的三種掃描算法,并要求對(duì)基本算法進(jìn)行擴(kuò)充和改進(jìn),包括:利用Visual C+實(shí)現(xiàn)三種直線生成算法,驗(yàn)證算法的正確性;二、實(shí)驗(yàn)任務(wù)理解三種直線生成算法思想,寫出實(shí)現(xiàn)程序;添加鼠標(biāo)功能,實(shí)現(xiàn)交互式畫直線程序;將10個(gè)像素作為步距單位,編出Bresenh

2、am算法的示例。三、基本知識(shí)和實(shí)驗(yàn)步驟任務(wù)一:實(shí)現(xiàn)DDA畫線程序?qū)嶒?yàn)步驟:建立一個(gè)DDALine的工程文件;添加ddaline()成員函數(shù)方法:在工作區(qū)中選擇CLASSVIEW類窗口,右擊CDDAlineView類,選擇“add member function”,定義如下的成員函數(shù):void ddaline(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color);編寫自定義的成員函數(shù)ddaline()程序 void CDDALineView:ddaline(CDC* pDC, int x0, int y0, int x1, int y1, CO

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

4、nt();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here ddaline(pDC,100,100,400,100,RGB(255,0,0); ddaline(pDC,400,100,400,400,RGB(0,255,0); ddaline(pDC,400,400,100,400,RGB(0,0,255); ddaline(pDC,100,400,100,100,RGB(255,255,0); ddaline(pDC,100,100,400,400,RGB(255,0,255); ddaline(pDC,100,400

5、,400,100,RGB(0,255,255);5編譯、調(diào)試和運(yùn)行程序(chngx),查看程序結(jié)果。任務(wù)(rn wu)二、放大10倍后,算法演示程序 先畫出(100,100)到(600,400)大小為10的網(wǎng)格,然后從(100,100)以10為單位,計(jì)算出直線上各個(gè)像素位置。步驟:建立DDA2Line工程;在OnDraw()函數(shù)中畫出網(wǎng)格,并調(diào)用DDA2Line()函數(shù) void CDDA2LineView:OnDraw(CDC* pDC)CDDA2LineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code fo

6、r native data here/畫網(wǎng)格int gi,gj;/畫橫線pDC-TextOut(90,90,(100,100);pDC-MoveTo(100,100);for(gj=100;gjMoveTo(100,gj);pDC-LineTo(600,gj);/畫豎線 pDC-MoveTo(100,100);for (gi=100;giMoveTo(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()成員(c

7、hngyun)函數(shù)方法:在工作(gngzu)區(qū)中選擇CLASSVIEW類窗口,右擊CDDAlineView類,選擇“add member function”,定義(dngy)如下的成員函數(shù):void DDA2Line(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color);4.編寫DDA2Line()函數(shù) void CDDA2LineView:DDA2line(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) int length,i,tx,ty; float x,y,dx,dy

8、; length=abs(x1-x0); if (abs(y1-y0)length) length=abs(y1-y0); dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; /char tbuf20; /sprintf(tbuf,dx,dy=%f,%f,dx,dy); /AfxMessageBox(tbuf); x=x0;y=y0; for (i=0;iSetPixel(tx,ty,color); pDC-Ellipse(tx-5,ty-5,tx+5,ty+5); x=x+dx*10;y=y+dy*10; 5.調(diào)試(dio sh)、運(yùn)行程序

9、任務(wù)三、加入鼠標(biāo)功能,實(shí)現(xiàn)(shxin)交互式畫直線 第一步:建立DDAMouseLine工程(gngchng)文件;第二步:向視圖類中添加自定義的成員變量 用鼠標(biāo)右鍵單擊視圖類,選擇“Add Member Variable”,添加下面三個(gè)成員變量。proctected : CPoint m_p1; / 起點(diǎn) CPoint m_p2; /終點(diǎn) int m_ist; /區(qū)別,m_ist=0,表示直線起點(diǎn), /m_ist=1,表示直線終點(diǎn) 第三步:向視圖類中添加自定義的成員函數(shù)原型: public: void DDAMouseLine(CDC *pDC, int x0, int y0, int x

10、1, int y1, COLORREF color);第四步:在視圖類CPP文件的構(gòu)造函數(shù)中初始化成員變量。 視圖類的構(gòu)造函數(shù)名與該視圖類的名字相同。在視圖類中選擇構(gòu)造函數(shù),如:CDDAMouseLineView(),用鼠標(biāo)左鍵雙擊,輸入下面程序代碼:CDDAMouseLineView:CDDAMouseLineView()/ TODO: add construction code here m_p1.x=0; m_p1.y=0; /起點(diǎn) m_p2.x=0; m_p2.y=0; /終點(diǎn) m_ist=0; /0,第1點(diǎn);1,第2點(diǎn);第五步:在視圖類的OnDraw()函數(shù)中加入下列代碼,實(shí)現(xiàn)視圖繪

11、圖。 void CMouseSpringView:OnDraw(CDC* pDC)CMouseSpringDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); / TODO: add draw code for native data herepDC-SelectStockObject(NULL_BRUSH);DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0); / 調(diào)用自定義的成員(chngyun)函數(shù),用鼠標(biāo)畫直線第六步:向視圖類中添加鼠標(biāo)OnLButtonDown()函數(shù)消息響應(yīng)函數(shù),并

12、輸入(shr)鼠標(biāo)處理程序代碼。void CMouseSpringView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); pDC-SelectStockObject(NULL_BRUSH);if (!m_ist) /是起點(diǎn)(qdin)m_p1=m_p2=point; /紀(jì)錄第一次單擊鼠標(biāo)位置,定起點(diǎn)m_ist+;elsem_p2=point; /記錄第二次單擊鼠標(biāo)的位置,定終點(diǎn)的點(diǎn)m_ist-; /

13、為新繪圖作準(zhǔn)備DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0); /繪制新直線ReleaseDC(pDC); /釋放設(shè)備環(huán)境CView:OnLButtonDown(nFlags, point);第七步:添加成員函數(shù)的程序代碼。 void CDDAMouseLineView:DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) int length,i; float x,y,dx,dy; length=abs(x1-x0); if (abs(y

14、1-y0)length) length=abs(y1-y0); dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;iSetPixel(int)x,(int)y,color); x=x+dx;y=y+dy; /pDC-MoveTo(x0,y0);/pDC-LineTo(x1,y1);第八步:編譯運(yùn)行(ynxng)程序,驗(yàn)證運(yùn)行結(jié)果。程序改進(jìn),添加(tin ji)橡皮筋繪圖技術(shù),實(shí)現(xiàn)交互式畫直線。 向視圖(sht)類中添加鼠標(biāo)OnMouseMove ()函數(shù)消息響應(yīng)函數(shù),并輸入鼠標(biāo)處理程序

15、代碼。void CDDAMouseLineView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); int nDrawmode=pDC-SetROP2(R2_NOT); /設(shè)置異或繪圖模式,并保存原來繪圖模式pDC-SelectStockObject(NULL_BRUSH);if(m_ist=1)CPoint prePnt,curPnt; prePnt=m_p2; /獲得鼠標(biāo)所在的前一位置curPnt=po

16、int;/繪制橡皮筋線DDAMouseLine(pDC,m_p1.x,m_p1.y,prePnt.x,prePnt.y,RGB(255,0,0);/DrawCircle(pDC,m_bO,prePnt); /用異或模式重復(fù)畫圓,擦出所畫的圓DDAMouseLine(pDC,m_p1.x,m_p1.y,curPnt.x,curPnt.y,RGB(255,0,0); /DrawCircle(pDC,m_bO,curPnt); /用當(dāng)前位置作為圓周上的點(diǎn)畫圓m_p2=point; pDC-SetROP2(nDrawmode); /恢復(fù)原繪圖模式ReleaseDC(pDC); /釋放設(shè)備環(huán)境CView

17、:OnMouseMove(nFlags, point);四、實(shí)驗(yàn)結(jié)果和分析查看實(shí)驗(yàn)結(jié)果,驗(yàn)證算法的正確性;對(duì)程序進(jìn)行分析和比較,你還能提出哪些改進(jìn)和擴(kuò)充?例如:(1)線刷子繪制直線和圓;(2)方形刷子繪制直線和圓;(3)虛線和點(diǎn)劃線的繪制;五、實(shí)驗(yàn)(shyn)總結(jié) 總結(jié)從本次(bn c)實(shí)驗(yàn)中學(xué)到了那些知識(shí)點(diǎn)或者有哪些感受?實(shí)驗(yàn)(shyn)三 基本圖形(元)生成(shn chn)技術(shù)(二) 圓、橢圓(tuyun)生成算法(4學(xué)時(shí))一、實(shí)驗(yàn)?zāi)康木帉憟A和橢圓的掃描轉(zhuǎn)換算法程序,驗(yàn)證算法的正確性。二、實(shí)驗(yàn)任務(wù)編寫中點(diǎn)畫圓法的掃描轉(zhuǎn)換程序,考慮原點(diǎn)在(x0,y0)處程序的改動(dòng);添加鼠標(biāo)程序,實(shí)現(xiàn)交互式

18、畫圓;編寫中點(diǎn)畫橢圓法的掃描轉(zhuǎn)換程序;添加鼠標(biāo)程序,實(shí)現(xiàn)交互式畫橢圓;三、實(shí)驗(yàn)內(nèi)容任務(wù)一:中點(diǎn)畫圓法的掃描轉(zhuǎn)換算法編寫中點(diǎn)畫圓法的掃描轉(zhuǎn)換程序,考慮原點(diǎn)在(x0,y0)處程序的改動(dòng);分析:考慮圓心不再原點(diǎn),設(shè)圓心坐標(biāo)為(x0,y0)。通過平移坐標(biāo)原點(diǎn)到圓心,則第二個(gè)8分圓上一點(diǎn)p(x,y),其原始坐標(biāo)為 x=x+x0 y=y+y0 即p1(x0 +x, y+y0)其它7個(gè)對(duì)稱點(diǎn)分別是:p2(x0+y,y+x0), p3 (x0+y,y0-x),p4 (x0+x,y0-y),p5 (x0-x,y0-y),p6 (x0-y,y0-x),p7 (x0-y,y0+x),p8 (x0-x,y0+y)O(

19、0,0)YX (x0,y0)R (x0+R,y0) p(x,y)XY p1(x0 +x, y+y0) p2(x0+y,y+x0) p3 (x0+y,y0-x) p4 (x0+x,y0-y)) p5 (x0-x,y0-y) p6 (x0-y,y0-x) p7 (x0-y,y0+x) p8 (x0-x,y0+y)算法程序如下:MidpointCircle(int x0,int y0,int r, int color) int x,y;float d;x=0;y=r;d=1.25-r;CirPot(x0,y0,x,y,color);while (x=y) if(dSetPixel(x0+x),(y0

20、+y),color); pDC-SetPixel(x0+y),(y0+x),color); pDC-SetPixel(x0+y),(y0-x),color); pDC-SetPixel(x0+x),(y0-y),color); pDC-SetPixel(x0-x),(y0-y),color); pDC-SetPixel(x0-y),(y0-x),color); pDC-SetPixel(x0-y),(y0+x),color); pDC-SetPixel(x0-x),(y0+y),color);return 0;(4)編寫(binxi)OnDraw(CDC* pDC)函數(shù),程序(chngx)如下

21、:void CMidPointCircleView:OnDraw(CDC* pDC)CMidPointCircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereMidpointCircle(pDC,100, 100, 10, RGB(255,0,0); MidpointCircle(pDC,500, 300, 60, RGB(255,255,0);編譯(biny)、運(yùn)行程序,查看結(jié)果。任務(wù)二:添加鼠標(biāo)程序,實(shí)現(xiàn)交互式畫圓 在任務(wù)1的基礎(chǔ)上,完成下列步驟: (1)向視圖

22、類中添加自定義的成員變量 用鼠標(biāo)右鍵單擊視圖類,選擇“Add Member Variable”,添加下面三個(gè)成員變量。proctected : int m_r; / 半徑CPoint m_bO; / 圓心 CPoint m_bR; /圓上的點(diǎn) int m_ist; /圓心與圓周上點(diǎn)的區(qū)別,m_ist=0,表示鼠標(biāo)左擊點(diǎn)為圓心, /m_ist=1,表示鼠標(biāo)左擊點(diǎn)為圓周上的點(diǎn) (2)在視圖類CPP文件的構(gòu)造函數(shù)中初始化成員變量CMidPointCircleMouseView:CMidPointCircleMouseView()/ TODO: add construction code here m

23、_bO.x=0; m_bO.y=0; /圓心 m_bR.x=0; m_bR.y=0; /圓上的點(diǎn) m_ist=0; /圓心與圓上的點(diǎn)區(qū)別 m_r=0; /圓的半徑(3)向視圖類中添加自定義的成員函數(shù)原型: public: int ComputeRadius(CPoint cenp,CPoint ardp);添加(tin ji)成員函數(shù)的程序代碼:int CMouseSpringView:ComputeRadius(CPoint cenp, CPoint ardp) int dx=cenp.x-ardp.x; int dy=cenp.y-ardp.y; /sqrt()函數(shù)的調(diào)用(dioyng),

24、在頭文件中加入#include math.h return (int)sqrt(dx*dx+dy*dy);(4)向視圖類中添加兩個(gè)(lin )鼠標(biāo)消息響應(yīng)函數(shù),并輸入鼠標(biāo)處理程序代碼。 具體操作方法與鼠標(biāo)示例1方法相同。一個(gè)是OnLButtonDown()函數(shù),另一個(gè)是OnMouseMove()函數(shù)。程序如下:void CMidPointCircleMouseView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CDC *pDC=G

25、etDC(); pDC-SelectStockObject(NULL_BRUSH);if (!m_ist) /繪制圓m_bO=m_bR=point; /紀(jì)錄第一次單擊鼠標(biāo)位置,定圓心m_ist+;elsem_bR=point; /記錄第二次單擊鼠標(biāo)的位置,定圓周上的點(diǎn)m_ist-; / 為新繪圖作準(zhǔn)備m_r=ComputeRadius(m_bO,m_bR);MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0);ReleaseDC(pDC); /釋放設(shè)備環(huán)境CView:OnLButtonDown(nFlags, point);void CMidPoi

26、ntCircleMouseView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC(); int nDrawmode=pDC-SetROP2(R2_NOT); /設(shè)置異或繪圖模式,并保存原來繪圖模式pDC-SelectStockObject(NULL_BRUSH);if(m_ist=1)CPoint prePnt,curPnt; prePnt=m_bR; /獲得鼠標(biāo)所在(suzi)的前一位置curPnt=poin

27、t;/繪制(huzh)橡皮筋線 m_r=ComputeRadius(m_bO,prePnt); MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0);/用異或模式(msh)重復(fù)畫圓,擦出所畫的圓/DrawCircle(pDC,m_bO,prePnt); m_r=ComputeRadius(m_bO,curPnt); MidpointCircle(pDC,m_bO.x,m_bO.y,m_r,RGB(255,0,0); /用當(dāng)前位置作為圓周上的點(diǎn)畫圓m_bR=point; pDC-SetROP2(nDrawmode); /恢復(fù)原繪圖模式ReleaseD

28、C(pDC); /釋放設(shè)備環(huán)境CView:OnMouseMove(nFlags, point);任務(wù)三:編寫中點(diǎn)畫橢圓法的掃描轉(zhuǎn)換程序程序?qū)崿F(xiàn)步驟:(1) 建立MidPointEllise工程文件;(2)右擊CMidPointElliseView類,建立成員函數(shù) void MidpointEllise(CDC *pDC, int x0, int y0, int a, int b, COLORREF color) (3) 編寫成員函數(shù)代碼,程序如下:void CMidPointEllipseView:MidpointEllise(CDC *pDC, int x0, int y0, int a,

29、int b, COLORREF color) /實(shí)現(xiàn)中點(diǎn)Bresenham畫橢圓 (4) 編寫OnDraw()函數(shù)void CMidPointEllipseView:OnDraw(CDC* pDC)CMidPointEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereMidpointEllise(pDC, 300, 200, 50, 20, RGB(255,0,0);(5)編譯、運(yùn)行(ynxng)程序。任務(wù)(rn wu)四:添加鼠標(biāo)程序,實(shí)現(xiàn)(shxin)交互

30、式畫橢圓程序?qū)崿F(xiàn)步驟:(1)(3)同上,建立MidPointElliseMouse工程文件。(4)添加成員變量protected:int b;int a; int m_ist;CPoint CenterPoint;CPoint RightBottom;CPoint LeftTop;(5)在構(gòu)造函數(shù)中賦初值CMidPointElliseMouseView:CMidPointElliseMouseView()/ TODO: add construction code hereLeftTop.x=0;LeftTop.y=0; / 左上角坐標(biāo)初值 RightBottom.x=0;RightBottom

31、.y=0; / 右下角坐標(biāo)初值 CenterPoint.x=0;CenterPoint.y=0; / 中心點(diǎn)坐標(biāo)初值a=0; b=0; /長(zhǎng)軸和短軸長(zhǎng)度 m_ist=0; /0:表示第一點(diǎn),1:表示第二點(diǎn)(6) 添加OnLButtonDown()函數(shù)void CMidPointElliseMouseView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC-SelectStockObject(N

32、ULL_BRUSH);if (!m_ist) /第一點(diǎn),左上角LeftTop=RightBottom=point; /紀(jì)錄第一次單擊鼠標(biāo)位置m_ist+;elseRightBottom=point; /記錄第二次單擊鼠標(biāo)的位置m_ist-; / 為新繪圖作準(zhǔn)備CenterPoint.x=(LeftTop.x+RightBottom.x)/2; CenterPoint.y=(LeftTop.y+RightBottom.y)/2;a=(int)abs(RightBottom.x-LeftTop.x)/2;b=(int)abs(RightBottom.y-LeftTop.y)/2;MidpointEllise(pDC,CenterPoint.x,CenterPoint.y,a,b,RGB(255,0,0);ReleaseDC(pDC); /釋放(shfng)設(shè)備環(huán)境CView:OnLButtonDown(nFlags, point);(7)添加(tin ji)OnMouseMove()函數(shù)(hnsh)void CMidPointElliseMouseView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handle

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論