自由曲线的绘制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

五、实验步骤与结果: (由学生按照实验内容完成)
1.打开 VC6.0 新建 MFC AppWizard[exe]工程。
2.在 void CBezierView::OnDraw(CDC* pDC)函数中调用 casteljau 与 bezier_to_points 成员函数 画出曲线图像。
1
void CBezierView::OnDraw(CDC* pDC) { CBezierDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int k=9; POINT controls[10]; POINT points[50]; int npoints=20; controls[0].x=200; controls[0].y=100; controls[1].x=160; controls[1].y=80; controls[2].x=100; controls[2].y=100; controls[3].x=90; controls[3].y=140; controls[4].x=120; controls[4].y=160; controls[5].x=200; controls[5].y=140; controls[6].x=230; controls[6].y=160; controls[7].x=220; controls[7].y=200; controls[8].x=160; controls[8].y=220; controls[9].x=120; controls[9].y=200; CPen pen1(PS_SOLID,1,RGB(0,255,0)); CPen *pOldpen=pDC->SelectObject(&pen1); pDC->MoveTo(controls[0]); for(int i=1;i<=k;i++){ pDC->LineTo(controls[i]); } pDC->SelectObject(pOldpen); bezier_to_points(k,npoints,controls,points); CPen pen2(PS_SOLID,1,RGB(255,0,0)); pOldpen=pDC->SelectObject(&pen2); pDC->MoveTo(points[0]); for( i=1;i<=npoints;i++){ pDC->LineTo(points[i]); } pDC->SelectObject(pOldpen); for( i=0;i<=npoints;i++)
实验四
专业班级 实验学时 实验时间 实验成绩
自由曲线的绘制
验证性 姓 名 实验地点
学 号 实验类型 指导老师
年 一、实验目的:
1.掌握 Bezier 曲线的定义方法; 2.掌握生成 Bezier 曲线型值点的 Casteljau 算法。


二、实验内容:
1.自定义一个任意阶 Bezier 曲线并显示其控制多边形; 2.使用 Casteljau 算法计算出该 Bezier 曲线的若干个型值点; 3.用线性插值绘制出近似的 Bezier 曲线。
2
{ pDC->SetPixel(points[i],Fra Baidu bibliotekGB(0,0,0)); } } 3. 在 CClipLineView 中创建 casteljau 与 bezier_to_points 成员函数。
代码如下: POINT CBezierView::casteljau(int k, POINT controls[], float t) { int r,i; float t1; POINT controlsa[10]; t1=1-t; for(i=0;i<=k;i++) { controlsa[i]=controls[i]; } for(r=1;r<=k;r++) { for(i=0;i<=k-r;i++) { controlsa[i].x=int(t1*controlsa[i].x+t*controlsa[i+1].x+0.5); controlsa[i].y=int(t1*controlsa[i].y+t*controlsa[i+1].y+0.5); } } return controlsa[0]; } void CBezierView::bezier_to_points(int k, int npoints, POINT controls[], POINT point[]) { float t,delt; int i; delt=1.0f/npoints; t=0.0; for(i=0;i<=npoints;i++) { point[i]=casteljau(k,controls,t); t=t+delt; } }
3
4.实验截图
六、总结
4
三、实验要求:
1.自己编写出实现 Casteljau 算法的函数,求出某个 t 时的型值点; 2.自己编写出求 Bezier 曲线多个型值点的函数; 3.写出实验报告。
四、编程提示:
1. 课本 P98Casteljau 函数伪算法中计算型值点语句为: controlsa[i]=t1*controlsa[i]+t*controlsa[i+1]; 只能计算一个分量,且将点坐标定义为 float 类型,而在程序中使用 POINT 类型能更方便的表 示点坐标,计算后还需进行四舍五入,为此将其改为: controlsa[i].x=int(t1*controlsa[i].x+t*controlsa[i+1].x+0.5); controlsa[i].y=int(t1*controlsa[i].y+t*controlsa[i+1].y+0.5);
相关文档
最新文档