




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与通信工程学院实验报告课程计算机图形学实验题目曲线拟合学生姓名学号专业班级指导教师日期成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总 分指导教师签名曲线拟合1. 实验内容 1. 绘制三次Bezier曲线 (1)给定四个已知点P1P4,以此作为控制顶点绘制一段三次Bezier曲线。 (2)给定四个已知点P1P4,以此作为曲线上的点绘制一段三次Bezier曲线。 2. 绘制三次B样条曲线 给定六个已知点P1P6,以此作为控制顶点绘制一条三次B样条曲线。2. 实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083. 问题分析 1. 绘制三次Bezier曲线Bezier曲线是用N+1个顶点(控制点)所构成的N根折线来 定义一根N阶曲线。本次实验中的三次Bezier曲线有4个顶点,设它们分别为P0,P1,P2,P3,那么对于曲线上各个点Pi(x,y)满足下列关系: P(t)=(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)/6 X(t)=(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)/6 Y(t)=(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)/6 其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。所以只要确定控制点的坐标,该曲线可通过编程即可绘制出来。 2. 绘制三次B样条曲线 三次B样条函数绘制曲线的光滑连接条件为:对于6个顶点,取P1、P2、P3、 P4 4个顶点绘制在第一段三次样条曲线,再取P2、P3、P4、P5 这4个顶点绘制在第二段三次样条曲线,总计可绘制3段光滑连接的三次样条曲线。4. 算法设计程序框架/DiamondView.hclass CDiamondView : public CView public:/参数输入和提示对话框 CDlgBezier dlgBezier;/Bezier曲线绘制中的参数输入对话框CDlgB dlgB;/B样条曲线绘制中的参数输入对话框 /绘图函数,需要实现 void DrawBezier1(POINT p4);/已知点作为控制点绘制Bezier曲线 void DrawBezier2(POINT p4);/已知点作为曲线上的点绘制Bezier曲线 void DrawBCurve(POINT p6);/绘制B样条曲线/DiamondView.cppvoid CDiamondView:OnMenuDiamond() IsCutting = FALSE;if(dlgDiamond.DoModal()=IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond. m_nRadius,100);/调用绘制金刚石的函数 void CDiamondView:OnMenuBezier1() IsCutting = FALSE;if(dlgBezier.DoModal() = IDOK)DrawBezier1(dlgBezier.m_nPoint);/调用已知点作为控制点绘制Bezier曲线的函数/以已知的四个点为控制点绘制Bezier曲线/p:已知的四个控制点void CDiamondView:DrawBezier1(POINT p4) void CDiamondView:OnMenuBezier2() IsCutting = FALSE;if(dlgBezier.DoModal() = IDOK)DrawBezier2(dlgBezier.m_nPoint);/调用已知点作为曲线上的点绘制Bezier曲线的函数/以已知的四个点为Bezier曲线上的点来绘制Bezier曲线/p:已知的四个点void CDiamondView:DrawBezier2(POINT p4) void CDiamondView:OnMenuB() IsCutting = FALSE;if(dlgB.DoModal() = IDOK)DrawBCurve(dlgB.m_nPoint);/调用绘制B样条曲线的函数/以已知的六个点为控制点来绘制B样条曲线/p:已知的六个控制点void CDiamondView:DrawBCurve(POINT p6) 5. 源代码/以已知的四个点为控制点绘制Bezier曲线/p:已知的四个控制点void CDiamondView:DrawBezier1(POINT p4)CDC *pDC = GetDC(); CPen newPen,*oldPen; newPen.CreatePen(PS_SOLID,2,RGB(255,0,0);oldPen = pDC-SelectObject(&newPen);pDC-Polyline(p, 4);pDC-SelectObject(oldPen);newPen.DeleteObject();newPen.CreatePen(PS_SOLID,2,RGB(0,0,255); oldPen = pDC-SelectObject(&newPen); int x0=p0.x;int y0=p0.y; int x1=p1.x;int y1=p1.y; int x2=p2.x;int y2=p2.y; int x3=p3.x;int y3=p3.y; double x,y; int ax,ay,bx,by,cx,cy,dx,dy; int rate=1000;ax=-x0+3*x1-3*x2+x3;ay=-y0+3*y1-3*y2+y3; bx=3*x0-6*x1+3*x2;by=3*y0-6*y1+3*y2; cx=-3*x0+3*x1;cy=-3*y0+3*y1; dx=x0;dy=y0; pDC-MoveTo(x0,y0); for(double t=0;tLineTo(Round(x),Round(y); Sleep(10); pDC-SelectObject(oldPen);/以已知的四个点为Bezier曲线上的点来绘制Bezier曲线/p:已知的四个点void CDiamondView:DrawBezier2(POINT p4) InvalidateRgn(NULL); UpdateWindow();CDC *pDC = GetDC();CPen newPen,*oldPen;newPen.CreatePen(PS_DASH,1,RGB(0,0,0);oldPen=pDC-SelectObject(&newPen); CBrush newBrush,*oldBrush;newBrush.CreateSolidBrush(RGB(0,0,0);oldBrush=pDC-SelectObject(&newBrush);for(int i=0;iEllipse(pi.x-3,pi.y-3,pi.x+3,pi.y+3);pDC-SelectObject(oldPen);pDC-SelectObject(oldBrush);Sleep(50);POINT q4; q0.x=p0.x; q0.y=p0.y;q1.x=(-5*p0.x+18*p1.x-9*p2.x+2*p3.x)/6;q1.y=(-5*p0.y+18*p1.y-9*p2.y+2*p3.y)/6;q2.x=(2*p0.x-9*p1.x+18*p2.x-5*p3.x)/6;q2.y=(2*p0.y-9*p1.y+18*p2.y-5*p3.y)/6;q3.x=p3.x;q3.y=p3.y;DrawBezier1(q);/以已知的六个点为控制点来绘制B样条曲线/p:已知的六个控制点void CDiamondView:DrawBCurve(POINT p6) InvalidateRgn(NULL); UpdateWindow(); CDC *pDC = GetDC(); CPen newPen,*oldPen; newPen.CreatePen(PS_SOLID,2,RGB(255,0,0); oldPen = pDC-SelectObject(&newPen); int rate=1000; int ax,ay,bx,by,cx,cy,dx,dy; double x,y; pDC-Polyline(p, 6); pDC-SelectObject(oldPen); newPen.DeleteObject(); newPen.CreatePen(PS_SOLID,3,RGB(0,0,255); oldPen = pDC-SelectObject(&newPen); for(int i=0;i3;i+) ax=-(pi.x-3*pi+1.x+3*pi+2.x-pi+3.x)/6; bx=(pi.x-2*pi+1.x+pi+2.x)/2; cx=-(pi.x-pi+2.x)/2; dx=(pi.x+4*pi+1.x+pi+2.x)/6; ay=-(pi.y-3*pi+1.y+3*pi+2.y-pi+3.y)/6; by=(pi.y-2*pi+1.y+pi+2.y)/2; cy=-(pi.y-pi+2.y)/2; dy=(pi.y+4*pi+1.y+pi+2.y)/6; for(double t=0;tMoveTo(Round(x),Round(y); pDC-LineTo(Round(x),Round(y); Sleep(2); pDC-SelectO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年签订二手车买卖合同的关键要点
- 2025年法学概论试题及答案
- 数据分析基础报告模板
- 2025年农业科技研发基地建设合同
- 连词专项突破技巧训练:小学英语六年级上册英语语法课教案
- 运输行业标准协议
- 大规模土地流转协议
- 数据分析员数据处理规范指南
- 英语语法进阶之词组搭配与应用教案
- 医疗设备远程维护协议
- 2024年安徽省泗县人民医院公开招聘护理工作人员试题带答案详解
- 供应室提高腔镜器械清洗质量PDCA案例
- 电气控制及PLC应用-定时器、计数器指令介绍
- 100大产业链全景图正式版
- GB/T 22166-2008非校准起重圆环链和吊链使用和维护
- 公共营养师三级模拟题
- GA/T 928-2011法庭科学线形痕迹的检验规范
- (全科医学导论)4-全科医学的教育评价方法课件
- 烧结原料工技师实操考试题库(含答案)
- 大管棚施工记录表
- 石油建设安装工程费用定额
评论
0/150
提交评论