版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Bezier曲线的绘制实验报告一、程序实现环境1操作系统:WindowsXP、Windows72.编程语言:C++ 3.程序实现环境:VisualC++6.0二、算法思想三、使用说明程序界面如下图:用户可以在编辑框中输入4个控制点的坐标,也可以通过在绘图区内直接通过鼠标的单击指定4个控制点的位置,输入4个控制端点后,单击“画Bezier曲线”按钮即可绘制Bezier曲线。四、实验结果五、程序代码(关键代码)voidCMFC_BezierCurve2Dlg::OnLButtonDown(UINTnFlags,CPointpoint){ if(pointOrd==1) //原点(490,270) { m_p1_x=point.x-490; m_p1_y=270-point.y; } if(pointOrd==2) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p1_x,270-m_p1_y); pDC->LineTo(point.x,point.y); m_p2_x=point.x-490; m_p2_y=270-point.y; } if(pointOrd==3) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p2_x,270-m_p2_y); pDC->LineTo(point.x,point.y); m_p3_x=point.x-490; m_p3_y=270-point.y; } if(pointOrd==4) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p3_x,270-m_p3_y); pDC->LineTo(point.x,point.y); m_p4_x=point.x-490; m_p4_y=270-point.y; } pointOrd++; UpdateData(FALSE); CDialog::OnLButtonDown(nFlags,point);}voidGetCnk(intn,int*c){ inti,k; for(k=0;k<=n;k++) { c[k]=1; for(i=n;i>=k+1;i--) c[k]=c[k]*i; for(i=n-k;i>=2;i--) c[k]=c[k]/i; }}voidCMFC_BezierCurve2Dlg::GetPointPos(intControlN,doublet,int*c){ intk,n=ControlN-1; doubleBernstein; Pt.x=0.0; Pt.y=0.0; for(k=0;k<ControlN;k++) { Bernstein=c[k]*pow(t,k)*pow(1-t,n-k); Pt.x+=ControlP[0][k].x*Bernstein; Pt.y+=ControlP[0][k].y*Bernstein; }}voidCMFC_BezierCurve2Dlg::OnButtonDrawBeziercurve(){ UpdateData(); pointOrd=1; CDC*pDC=GetDC(); ControlP[0][0].x=m_p1_x; ControlP[0][0].y=m_p1_y; ControlP[0][1].x=m_p2_x; ControlP[0][1].y=m_p2_y; ControlP[0][2].x=m_p3_x; ControlP[0][2].y=m_p3_y; ControlP[0][3].x=m_p4_x; ControlP[0][3].y=m_p4_y; pDC->MoveTo(490+m_p1_x,270-m_p1_y); pDC->LineTo(490+m_p2_x,270-m_p2_y); pDC->LineTo(490+m_p3_x,270-m_p3_y); pDC->LineTo(490+m_p4_x,270-m_p4_y); int*C,i; intControlN=4,m=500; C=newint[ControlN]; GetCnk(ControlN-1,C); for(i=0;i<=m;i++) { GetPointPos(ControlN,(double)i/(double)m,C); pDC->SetPixel(490+Pt.x,270-Pt.y,255); }}
两段Bezier曲线的拼接实验报告一、程序实现环境1操作系统:WindowsXP、Windows72.编程语言:C++ 3.程序实现环境:VisualC++6.0二、算法思想三、使用说明程序界面如下图:用户可以在编辑框中输入4个控制点的坐标,也可以通过在绘图区内直接通过鼠标的单击指定4个控制点的位置,输入4个控制端点后,单击“画Bezier曲线”按钮即可绘制Bezier曲线。分别绘制完两段Bezier曲线后,单击拼接即可实现两段曲线的拼接。四、实验结果五、程序代码(关键代码)voidCMFC_BezierCurve2Dlg::OnLButtonDown(UINTnFlags,CPointpoint){ if(pointOrd==1) //原点(490,270) { m_p1_x=point.x-490; m_p1_y=270-point.y; } if(pointOrd==2) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p1_x,270-m_p1_y); pDC->LineTo(point.x,point.y); m_p2_x=point.x-490; m_p2_y=270-point.y; } if(pointOrd==3) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p2_x,270-m_p2_y); pDC->LineTo(point.x,point.y); m_p3_x=point.x-490; m_p3_y=270-point.y; } if(pointOrd==4) { CDC*pDC=GetDC(); pDC->MoveTo(490+m_p3_x,270-m_p3_y); pDC->LineTo(point.x,point.y); m_p4_x=point.x-490; m_p4_y=270-point.y; } pointOrd++; UpdateData(FALSE); CDialog::OnLButtonDown(nFlags,point);}voidGetCnk(intn,int*c){ inti,k; for(k=0;k<=n;k++) { c[k]=1; for(i=n;i>=k+1;i--) c[k]=c[k]*i; for(i=n-k;i>=2;i--) c[k]=c[k]/i; }}voidCMFC_BezierCurve2Dlg::GetPointPos(intControlN,doublet,int*c){ intk,n=ControlN-1; doubleBernstein; Pt.x=0.0; Pt.y=0.0; for(k=0;k<ControlN;k++) { Bernstein=c[k]*pow(t,k)*pow(1-t,n-k); Pt.x+=ControlP[pointGroup][k].x*Bernstein; Pt.y+=ControlP[pointGroup][k].y*Bernstein; }}voidCMFC_BezierCurve2Dlg::BezierCurve(){ CDC*pDC=GetDC(); pDC->MoveTo(490+ControlP[pointGroup][0].x,270-ControlP[pointGroup][0].y); pDC->LineTo(490+ControlP[pointGroup][1].x,270-ControlP[pointGroup][1].y); pDC->LineTo(490+ControlP[pointGroup][2].x,270-ControlP[pointGroup][2].y); pDC->LineTo(490+ControlP[pointGroup][3].x,270-ControlP[pointGroup][3].y); int*C,i; intControlN=4,m=500; C=newint[ControlN]; GetCnk(ControlN-1,C); for(i=0;i<=m;i++) { GetPointPos(ControlN,(double)i/(double)m,C); pDC->SetPixel(490+Pt.x,270-Pt.y,255); }}voidCMFC_BezierCurve2Dlg::OnButtonDrawBeziercurve(){ UpdateData(); pointOrd=1; ControlP[pointGroup][0].x=m_p1_x; ControlP[pointGroup][0].y=m_p1_y; ControlP[pointGroup][1].x=m_p2_x; ControlP[pointGroup][1].y=m_p2_y; ControlP[pointGroup][2].x=m_p3_x; ControlP[pointGroup][2].y=m_p3_y; ControlP[pointGroup][3].x=m_p4_x; ControlP[pointGroup][3].y=m_p4_y; BezierCurve(); pointGroup++;}voidCMFC_BezierCurve2Dlg::OnButtonMatch(){ pointGroup--; doubledx,dy; doublek1,k2,s,s1,s2; inti; CPointtemp; dx=ControlP[pointGroup][0].x-ControlP[pointGroup-1][3].x; dy=ControlP[pointGroup][0].y-ControlP[pointGroup-1][3].y; for(i=0;i<4;i++) { ControlP[pointGroup][i].x-=dx; ControlP[pointGroup][i].y-=dy; } k1=1.0*(ControlP[pointGroup-1][3].y-ControlP[pointGroup-1][2].y)/(ControlP[pointGroup-1][3].x-ControlP[pointGroup-1][2].x); k2=1.0*(ControlP[pointGroup][1].y-ControlP[pointGroup][0].y)/(ControlP[pointGroup][1].x-ControlP[pointGroup][0].x); if(k1>0) { if(ControlP[pointGroup-1][2].x<ControlP[pointGroup-1][3].x) s1=atan(k1); else s1=PI+atan(k1); } elseif(k1<0) { if(ControlP[pointGroup-1][2].x<ControlP[pointGroup-1][3].x) s1=2*PI+atan(k1); else s1=PI+atan(k1); } if(k2>0) { if(ControlP[pointGroup][0].x<ControlP[pointGroup][1].x) s2=atan(k2); else s2=PI+atan(k2); } elseif(k2<0) { if(ControlP[pointGroup][0].x<ControlP[pointGroup][1].x) s2=2*PI+atan(k2); else s2=PI+atan(k2); } s=s1-s2; for(i=0;i<4;i++) { temp.x=(ControlP[pointGroup][i].x-ControlP[pointGroup-1][3].x)*cos(s)-(ControlP[pointGroup][i].y-ControlP[pointGroup-1][3].y)*sin(s)+C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中学生化学室工作制度
- 高标准农田项目工作制度
- 东北财经大学·2022教学设计-2025-2026学年中职中职专业课财政税务类73 财经商贸大类
- 文化交流项目筹备进展汇报5篇
- 商业智能系统开发与应用指南
- 智能制造设备调试与维护手册
- 服务优化质量承诺书(9篇)
- 公布意外事情紧急处置承诺书6篇
- 项目运营保障责任承诺书范文3篇
- 企业标准化采购流程与操作指南
- 探究风的成因实验改进策略 论文
- 小记者基础知识培训课件
- 现场施工图纸确认单
- 第9课 共同弘扬中华传统美德 《中华民族大团结》(初中 精讲课件)
- 人文地理学-米文宝-第二章文化与人文地理学
- 工业分析试卷及答案共10套
- 贝叶斯公式课件
- 污水处理设备点检表
- 【110kV地区变电所母线保护设计8000字(论文)】
- 刑法案例分析课件
- 城市景观设计
评论
0/150
提交评论