貝塞爾曲線屏保設(shè)計與實(shí)現(xiàn)_第1頁
貝塞爾曲線屏保設(shè)計與實(shí)現(xiàn)_第2頁
貝塞爾曲線屏保設(shè)計與實(shí)現(xiàn)_第3頁
貝塞爾曲線屏保設(shè)計與實(shí)現(xiàn)_第4頁
貝塞爾曲線屏保設(shè)計與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)圖形學(xué)設(shè)計報告題目:貝塞爾曲線屏保的設(shè)計與實(shí)現(xiàn) 班 級: 學(xué) 號: 姓 名: 教 師: 完成時間: 一、 引言貝塞爾曲線又稱貝茲曲線或貝濟(jì)埃曲線,一般的矢量圖形軟件通過它來精確畫出曲線,貝茲曲線由線段與節(jié)點(diǎn)組成,節(jié)點(diǎn)是可拖動的支點(diǎn),線段像可伸縮的皮筋。貝塞爾曲線是計算機(jī)圖形圖像造型的基本工具,是圖形造型運(yùn)用得最多的基本線條之一。它通過控制曲線上的四個點(diǎn)(起始點(diǎn)、終止點(diǎn)以及兩個相互分離的中間點(diǎn))來創(chuàng)造、編輯圖形。貝塞爾曲線屏保是Windows早期通常自帶的屏幕保護(hù)程序,它主要是通過運(yùn)行變幻著的多條貝塞爾曲線,以防止顯示器因長時間保持一個畫面而造成老化。Visual C+提供了一個支持屏幕保

2、護(hù)的開發(fā)庫scrnsave.lib,這個庫已經(jīng)定制了一個屏幕保護(hù)程序的框架結(jié)構(gòu),開發(fā)者只需要在完成相應(yīng)的函數(shù)和提供相應(yīng)的資源就可以寫出自己的屏幕保護(hù)程序。因此,通過VC實(shí)現(xiàn)貝塞爾曲線屏保的設(shè)計不是難題。二、 功能分析1. 創(chuàng)建貝塞爾MDI子窗口:HWND FAR CreatePolyWindow();2. 實(shí)現(xiàn)主窗口中的多重貝塞爾曲線示例窗口功能:LONG APIENTRY PolyProc();3demo應(yīng)用程序:BOOL PolyCreateProc();4處理多重貝賽爾曲線命令:BOOL PolyCommandProc();5重新描繪貝塞爾曲線窗口(實(shí)現(xiàn)窗口,重置貝塞爾曲線對象):VOI

3、D PolyPaintProc();6刪除多重貝塞爾曲線示例:VOID PolyDestroyProc();7獲取速度(貝賽爾曲線的每個點(diǎn)都是隨機(jī)生成;終點(diǎn)的速度要比中間點(diǎn)的速度快。):int PolyNewVel();8窗口的初始化:VOID PolyInitPoints();9重置貝塞爾曲線,重繪多重貝塞爾曲線對象區(qū)域:VOID PolyRedraw();三、 概要設(shè)計1貝塞爾曲線數(shù)學(xué)表達(dá)式:Bezier曲線是由多項(xiàng)式調(diào)和函數(shù)推導(dǎo)出來的,通常n+1個頂點(diǎn)定義一個n次多項(xiàng)式,其參數(shù)向量表達(dá)式為: (4-11)在(4-11)中,為各定點(diǎn)的位置向量,為伯恩斯坦基函數(shù),也就是Bezier多邊形的個

4、頂點(diǎn)位置向量之間的調(diào)和函數(shù)。該函數(shù)的表達(dá)式為: (4-12)如果規(guī)定和均為1,那么,當(dāng)t=0時: (4-13)在t=0時除第一項(xiàng)外其余各項(xiàng)均為0,所以: (4-14)當(dāng)t=1時: 在t=1時除最后一頁外其余各項(xiàng)均為0,所以: (4-15)總上所述,貝塞爾曲線在兩端點(diǎn)處的切矢方向是與貝塞爾多邊折線的第一條邊和最后一條邊相一致的,且我們只要確定m個頂點(diǎn),可以定義一條m-1次的貝塞爾曲線。2貝塞爾曲線生成算法貝賽爾曲線的每一個頂點(diǎn)都有兩個控制點(diǎn),用于控制在該頂點(diǎn)兩側(cè)的曲線的弧度。所以本函數(shù)的頂點(diǎn)數(shù)組的記錄方式是:控制點(diǎn)頂點(diǎn)控制點(diǎn)控制點(diǎn)頂點(diǎn)控制點(diǎn)。所以兩個頂點(diǎn)之間的曲線是由兩個頂點(diǎn)以及兩個頂點(diǎn)之間的控

5、制點(diǎn)來決定的。double powi(double v,int k)double temp=1.0;if(k=0|v=0) return 1;else for(int i=1;i<=k;i+) temp=temp*v;return temp;long fac(int m)int I;long temp=1;if(m=0) return 1;else for(i=2;i<=m;i+) temp=temp*I;return temp;void Bezier(POINT *p,int n)int x,y,I,j,k=100;double t=1.0/k,t1,u,v;double tem

6、p,temp1,temp2,bi;moveto(p0.x,p0.y);for(j=1;j<k;j+) t1=j*t;u=t1;v=1-u; x=0;y=0; for(i=0;i<=n;i+)temp=double(fac(n)/fac(i)/fac(n-i); temp1=powi(u,i);temp2=powi(v,n-i); bi=temp*temp1*temp2;x=x+bi*pi.x;y=y+bi*pi.y;lineto(x,y);Lineto(pn.x,pn.y);四、 詳細(xì)設(shè)計1. 創(chuàng)建貝塞爾MDI子窗口HWND FAR CreatePolyWindow(HWND hW

7、ndClient, int nItem) HANDLE hInstance; MDICREATESTRUCT mcs; static char buffer256; hInstance = GETINSTANCE(hWndClient); LoadString (hInstance, POLYTITLE, buffer, 256); mcs.szClass = POLYCLASS; mcs.szTitle = buffer; mcs.hOwner = hInstance; mcs.x = CW_USEDEFAULT; mcs.y = CW_USEDEFAULT; mcs.cx = CW_USE

8、DEFAULT; mcs.cy = CW_USEDEFAULT; mcs.style = 0l;mcs.lParam = (LONG)nItem; return(HWND)SendMessage(hWndClient,WM_MDICREATE,0,(LONG)(LPMDICREATESTRUCT)&mcs);2. 主窗口中的多重貝塞爾曲線示例窗口功能LONG APIENTRY PolyProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam) switch(wMsg) case WM_CREATE: PolyCreateProc(hWn

9、d); break; case WM_COMMAND: PolyCommandProc(hWnd,wParam,lParam); break; case WM_MOVE: PolyRedraw(hWnd); break; case WM_TIMER: PolyDrawBez(hWnd); break; case WM_PAINT: PolyPaintProc(hWnd); break; case WM_DESTROY: PolyDestroyProc(hWnd); break; default: return(DefMDIChildProc(hWnd,wMsg,wParam,lParam);

10、return(0l);3demo應(yīng)用程序BOOL PolyCreateProc(HWND hWnd) PPOLYDATA ppd; if(AllocWindowInfo(hWnd,sizeof(POLYDATA) if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) ppd->nBezTotal = 20; ppd->nBezCurr = 0; ppd->nColor = 0; ppd->hBezBuffer = GlobalAlloc(GHND,(DWORD)(sizeof(BEZBUFFER) * MAX_BEZIER); UnlockW

11、indowInfo(hWnd); PolyInitPoints(hWnd); SetTimer(hWnd,1,50,NULL); return(TRUE); FreeWindowInfo(hWnd); return(FALSE);4處理多重貝賽爾曲線命令BOOL PolyCommandProc(HWND hWnd, WPARAM wParam, LONG lParam) hWnd = hWnd; wParam = wParam; lParam = lParam; return(TRUE);5重新描繪貝塞爾曲線窗口(實(shí)現(xiàn)窗口,重置貝塞爾曲線對象)VOID PolyPaintProc(HWND h

12、Wnd) HDC hDC; PAINTSTRUCT ps; if(hDC = BeginPaint(hWnd,&ps) EndPaint(hWnd,&ps); PolyRedraw(hWnd); return;6刪除多重貝塞爾曲線示例VOID PolyDestroyProc(HWND hWnd) PPOLYDATA ppd; KillTimer(hWnd,1); if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) GlobalFree(ppd->hBezBuffer); UnlockWindowInfo(hWnd); FreeWindowIn

13、fo(hWnd); return;7獲取速度(貝賽爾曲線的每個點(diǎn)都是隨機(jī)生成;終點(diǎn)的速度要比中間點(diǎn)的速度快。)int PolyNewVel(int i) int nRet; if (i = 1) | (i = 2) nRet = (int)(lRandom() % VELMAX) / 3) + VELMIN; else nRet = (int)(lRandom() % VELMAX) + VELMIN; return(nRet < 0) ? -nRet : nRet);8窗口的初始化VOID PolyInitPoints(HWND hWnd)/曲線數(shù)組 PPOLYDATA ppd; LP

14、BEZBUFFER lpBez; int idx; RECT rect;/分配點(diǎn)數(shù)組 if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer) GetClientRect(hWnd,&rect);/設(shè)置結(jié)束點(diǎn)和控制點(diǎn)坐標(biāo) for(idx=0; idx < BEZ_PTS-1; idx+) lpBez->pPtsidx.x = lRandom() % rect.right; lpBez->pPtsidx.y = lRandom() % r

15、ect.bottom; ppd->pVelidx.x = PolyNewVel(idx); ppd->pVelidx.y = PolyNewVel(idx); GlobalUnlock(ppd->hBezBuffer); UnlockWindowInfo(hWnd); return;9重置貝塞爾曲線,重繪多重貝塞爾曲線對象區(qū)域VOID PolyRedraw(HWND hWnd) PPOLYDATA ppd; LPBEZBUFFER lpBez,lpCurr; HDC hDC; int i,j; RECT rect; if(ppd = (PPOLYDATA)LockWindow

16、Info(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer) if(hDC = GetDC(hWnd) lpCurr = lpBez+ppd->nBezCurr; *lpBez = *lpCurr; ppd->nBezCurr = 0; for(j=1; j < ppd->nBezTotal; j+) for(i=0; i < BEZ_PTS; i+) (lpBez+j)->pPtsi.x = -1; (lpBez+j)->pPtsi.y = 0; GetClientRect(hWn

17、d,&rect); BitBlt(hDC,0,0,rect.right, rect.bottom,(HDC)0,0,0,0);if defined(_WIN32) && defined(WIN32) PolyBezier(hDC,lpBez->pPts,BEZ_PTS);else Polyline(hDC,lpBez->pPts,BEZ_PTS);endif ReleaseDC(hWnd,hDC); GlobalUnlock(ppd->hBezBuffer); UnlockWindowInfo(hWnd); return;VOID PolyDrawBe

18、z(HWND hWnd) PPOLYDATA ppd; LPBEZBUFFER lpBez,lpCurr,lpPrev; int idx,x,y; RECT rect; HDC hDC; HPEN hPen;/色彩表,用于繪制彩色貝塞爾曲線static COLORREF crColor = 0x000000FF,0x0000FF00,0x00FF0000,0x0000FFFF,0x00FF00FF,0x00FFFF00,0x00FFFFFF,0x00000080,0x00008000,0x00800000,0x00008080,0x00800080,0x00808000,0x00808080,

19、0x000000FF,0x0000FF00,0x00FF0000,0x0000FFFF,0x00FF00FF,0x00FFFF00;/獲取貝塞爾曲線點(diǎn) if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer) /獲取繪制設(shè)備 if(hDC = GetDC(hWnd) GetClientRect(hWnd,&rect); lpPrev = lpBez+ppd->nBezCurr; ppd->nBezCurr += 1; if(ppd->n

20、BezCurr >= ppd->nBezTotal) ppd->nBezCurr = 0; ppd->nColor = (+ppd->nColor % 20); lpCurr = lpBez+ppd->nBezCurr;/擦除上次繪制的貝塞爾曲線if(lpCurr->pPts0.x != -1) hPen = SelectObject(hDC,GetStockObject(BLACK_PEN); PolyBezier(hDC,lpCurr->pPts,BEZ_PTS); Polyline(hDC,lpCurr->pPts,BEZ_PTS);

21、 SelectObject(hDC,hPen); /重新繪制 for(idx=0; idx < BEZ_PTS; idx+) x = lpPrev->pPtsidx.x; y = lpPrev->pPtsidx.y; x += ppd->pVelidx.x; y += ppd->pVelidx.y; if(x >= rect.right) x = rect.right - (x - rect.right)+1); ppd->pVelidx.x = -PolyNewVel(idx); if(x <= rect.left) x = rect.left + (rect.left - x)+1); ppd->pVelidx.x = PolyNewVel(idx); if(y >= rect.bottom) y = rect.b

溫馨提示

  • 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

提交評論