版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 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);四、 详细设计1. 创建贝塞尔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应用程序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重新描绘贝塞尔曲线窗口(实现窗口,重置贝塞尔曲线对象)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获取速度(贝赛尔曲线的每个点都是随机生成;终点的速度要比中间点的速度快。)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)/曲线数组 PPOLYDATA ppd; LP
14、BEZBUFFER lpBez; int idx; RECT rect;/分配点数组 if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer) GetClientRect(hWnd,&rect);/设置结束点和控制点坐标 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重置贝塞尔曲线,重绘多重贝塞尔曲线对象区域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;/获取贝塞尔曲线点 if(ppd = (PPOLYDATA)LockWindowInfo(hWnd) if(lpBez = (LPBEZBUFFER)GlobalLock(ppd->hBezBuffer) /获取绘制设备 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省人教版高中物理第1章电磁学综合应用题库
- 2025-2026年江西省法律职业资格考试客观题专项习题
- 2025-2026年安徽省人教版高二物理电磁学综合测试卷
- 2025-2026年浙江省苏教版初中物理力学实验操作测试题库
- 2025年人教版初中化学下册化学实验技能模拟试题
- 2025-2026年计算机操作系统应用考核试卷
- 2025年湖南省人教版高中物理选修3-5知识点巩固习题
- 2025-2026年天津市苏教版初中数学代数运算经典习题
- 2025-2026年重庆市部编版五年级数学上册第9单元分数小数运算与简易方程练习卷
- 二氧化碳吸附剂性能衰减机理与原位再生策略对项目运营成本的长期影响
- 2026年甘肃省兰州新区产投资本控股集团有限公司招聘考试备考试题及答案详解
- 2026年秋季小学道德与法治六年级上册(新教材)教学计划附教学进度表
- 2026年秋季西师大版小学一年级上册数学教学计划
- 篮球场体育运动木地板施工安装工艺
- 说课的技巧和方法专题讲座
- 第四章-农田草害课件
- 煤矿建设安全规范
- 纺织品外贸跟单实务
- GB/T 701-2008低碳钢热轧圆盘条
- 城市安全问题与城市防灾减灾-0902
- 意义未明单克隆免疫球蛋白血症临床意义详解课件
评论
0/150
提交评论