贝塞尔曲线屏保设计与实现_第1页
贝塞尔曲线屏保设计与实现_第2页
贝塞尔曲线屏保设计与实现_第3页
贝塞尔曲线屏保设计与实现_第4页
贝塞尔曲线屏保设计与实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学设计报告题目:贝塞尔曲线屏保的设计与实现 班 级: 学 号: 姓 名: 教 师: 完成时间: 一、 引言贝塞尔曲线又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。贝塞尔曲线屏保是Windows早期通常自带的屏幕保护程序,它主要是通过运行变幻着的多条贝塞尔曲线,以防止显示器因长时间保持一个画面而造成老化。Visual C+提供了一个支持屏幕保

2、护的开发库scrnsave.lib,这个库已经定制了一个屏幕保护程序的框架结构,开发者只需要在完成相应的函数和提供相应的资源就可以写出自己的屏幕保护程序。因此,通过VC实现贝塞尔曲线屏保的设计不是难题。二、 功能分析1. 创建贝塞尔MDI子窗口:HWND FAR CreatePolyWindow();2. 实现主窗口中的多重贝塞尔曲线示例窗口功能:LONG APIENTRY PolyProc();3demo应用程序:BOOL PolyCreateProc();4处理多重贝赛尔曲线命令:BOOL PolyCommandProc();5重新描绘贝塞尔曲线窗口(实现窗口,重置贝塞尔曲线对象):VOI

3、D PolyPaintProc();6删除多重贝塞尔曲线示例:VOID PolyDestroyProc();7获取速度(贝赛尔曲线的每个点都是随机生成;终点的速度要比中间点的速度快。):int PolyNewVel();8窗口的初始化:VOID PolyInitPoints();9重置贝塞尔曲线,重绘多重贝塞尔曲线对象区域:VOID PolyRedraw();三、 概要设计1贝塞尔曲线数学表达式:Bezier曲线是由多项式调和函数推导出来的,通常n+1个顶点定义一个n次多项式,其参数向量表达式为: (4-11)在(4-11)中,为各定点的位置向量,为伯恩斯坦基函数,也就是Bezier多边形的个

4、顶点位置向量之间的调和函数。该函数的表达式为: (4-12)如果规定和均为1,那么,当t=0时: (4-13)在t=0时除第一项外其余各项均为0,所以: (4-14)当t=1时: 在t=1时除最后一页外其余各项均为0,所以: (4-15)总上所述,贝塞尔曲线在两端点处的切矢方向是与贝塞尔多边折线的第一条边和最后一条边相一致的,且我们只要确定m个顶点,可以定义一条m-1次的贝塞尔曲线。2贝塞尔曲线生成算法贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。所以本函数的顶点数组的记录方式是:控制点顶点控制点控制点顶点控制点。所以两个顶点之间的曲线是由两个顶点以及两个顶点之间的控

5、制点来决定的。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 temp,temp1,

6、temp2,bi;moveto(p0.x,p0.y);for(j=1;jk;j+) t1=j*t;u=t1;v=1-u; x=0;y=0; for(i=0;inBezTotal = 20; ppd-nBezCurr = 0; ppd-nColor = 0; ppd-hBezBuffer = GlobalAlloc(GHND,(DWORD)(sizeof(BEZBUFFER) * MAX_BEZIER); UnlockWindowInfo(hWnd); PolyInitPoints(hWnd); SetTimer(hWnd,1,50,NULL); return(TRUE); FreeWindow

7、Info(hWnd); return(FALSE);4处理多重贝赛尔曲线命令BOOL PolyCommandProc(HWND hWnd, WPARAM wParam, LONG lParam) hWnd = hWnd; wParam = wParam; lParam = lParam; return(TRUE);5重新描绘贝塞尔曲线窗口(实现窗口,重置贝塞尔曲线对象)VOID PolyPaintProc(HWND hWnd) HDC hDC; PAINTSTRUCT ps; if(hDC = BeginPaint(hWnd,&ps) EndPaint(hWnd,&ps); PolyRedra

8、w(hWnd); return;6删除多重贝塞尔曲线示例VOID PolyDestroyProc(HWND hWnd) PPOLYDATA ppd; KillTimer(hWnd,1); if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) GlobalFree(ppd-hBezBuffer); UnlockWindowInfo(hWnd); FreeWindowInfo(hWnd); return;7获取速度(贝赛尔曲线的每个点都是随机生成;终点的速度要比中间点的速度快。)int PolyNewVel(int i) int nRet; if (i = 1) | (

9、i = 2) nRet = (int)(lRandom() % VELMAX) / 3) + VELMIN; else nRet = (int)(lRandom() % VELMAX) + VELMIN; return(nRet hBezBuffer) GetClientRect(hWnd,&rect);/设置结束点和控制点坐标 for(idx=0; idx pPtsidx.x = lRandom() % rect.right; lpBez-pPtsidx.y = lRandom() % rect.bottom; ppd-pVelidx.x = PolyNewVel(idx); ppd-pVe

10、lidx.y = PolyNewVel(idx); GlobalUnlock(ppd-hBezBuffer); UnlockWindowInfo(hWnd); return;9重置贝塞尔曲线,重绘多重贝塞尔曲线对象区域VOID PolyRedraw(HWND hWnd) PPOLYDATA ppd; LPBEZBUFFER lpBez,lpCurr; HDC hDC; int i,j; RECT rect; if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd-hBezBuffer) if

11、(hDC = GetDC(hWnd) lpCurr = lpBez+ppd-nBezCurr; *lpBez = *lpCurr; ppd-nBezCurr = 0; for(j=1; j nBezTotal; j+) for(i=0; i pPtsi.x = -1; (lpBez+j)-pPtsi.y = 0; GetClientRect(hWnd,&rect); BitBlt(hDC,0,0,rect.right, rect.bottom,(HDC)0,0,0,0);if defined(_WIN32) & defined(WIN32) PolyBezier(hDC,lpBez-pPts,

12、BEZ_PTS);else Polyline(hDC,lpBez-pPts,BEZ_PTS);endif ReleaseDC(hWnd,hDC); GlobalUnlock(ppd-hBezBuffer); UnlockWindowInfo(hWnd); return;VOID PolyDrawBez(HWND hWnd) PPOLYDATA ppd; LPBEZBUFFER lpBez,lpCurr,lpPrev; int idx,x,y; RECT rect; HDC hDC; HPEN hPen;/色彩表,用于绘制彩色贝塞尔曲线static COLORREF crColor = 0xFF

13、,0x0000FF00,0x00FF0000,0x0000FFFF,0x00FF00FF,0x00FFFF00,0x00FFFFFF,0x,0x,0x,0x,0x,0x,0x,0xFF,0x0000FF00,0x00FF0000,0x0000FFFF,0x00FF00FF,0x00FFFF00;/获取贝塞尔曲线点 if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd-hBezBuffer) /获取绘制设备 if(hDC = GetDC(hWnd) GetClientRect(hWnd,&r

14、ect); lpPrev = lpBez+ppd-nBezCurr; ppd-nBezCurr += 1; if(ppd-nBezCurr = 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

15、(hDC,lpCurr-pPts,BEZ_PTS); SelectObject(hDC,hPen); /重新绘制 for(idx=0; idx 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 pVelidx.x = PolyNewVel(idx); if(y = rect.bottom) y = rect.b

16、ottom - (y - rect.bottom)+1); ppd-pVelidx.y = -PolyNewVel(idx); if(y pVelidx.y = PolyNewVel(idx); lpCurr-pPtsidx.x = x; lpCurr-pPtsidx.y = y; hPen = SelectObject(hDC,CreatePen(PS_SOLID,1,crColorppd-nColor); PolyBezier(hDC,lpCurr-pPts,BEZ_PTS); Polyline(hDC,lpCurr-pPts,BEZ_PTS); DeleteObject(SelectObject(hDC,hPen); SetROP2(hDC,R2_COPYPEN); ReleaseDC(hWnd,hDC); Global

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论