版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度电子产品设计与制造合同
- 2024年度农业产品种植收购合同
- 二零二四年专业保洁员聘用合同
- 晚会用手提包产品入市调查研究报告
- 二零二四年度许可合同:音乐制作方与歌手之间的归属
- 二零二四年度物业服务合同的执行标准
- 网络摄像头市场发展预测和趋势分析
- 量角规产业规划专项研究报告
- 2024年度市场营销合同标的及营销策略
- 二零二四年度农村光伏发电项目合作合同
- 宜宾市2022级(2025届)高三第一次诊断性测试(一诊)历史试卷(含答案)
- 2024-2025部编版语文一年级上册8-比尾巴Repaired
- 2023年中国建筑第八工程局有限公司招聘考试真题
- 2024年湖北省公务员考试《行测》真题及答案解析
- 2023年全国社会保障基金理事会招聘考试真题
- GB 15740-2024汽车防盗装置
- HG/T 6312-2024 化工园区竞争力评价导则(正式版)
- 排球《正面上手发球》教案
- 婴幼儿托育服务与管理的职业生涯规划职业目标自我分析职业定位实施计划
- 硬笔书法全册教案共20课时
- 2021年新苏教版科学六年级上册知识点整理
评论
0/150
提交评论