129512786937031250实验四 实现Bezier曲线的生成算法

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

实验四实现Bezier曲线的生成算法
一、实验目的
1、熟悉CDC图形程序库;
2、掌握Bezier曲线的生成算法;
3、掌握利用Bezier曲线生成复杂形状的曲线;
二、实验性质
验证性
三、实验要求
1、认真阅读本次实验的目的,了解本次实验要求掌握的内容;
2、能够根据实验指导书的要求,完成相关的内容;
四、实验内容
(一)生成绘图应用程序的框架(如下图)
具体实现见第一次实验,过程不再详细说明。

(二)在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。

(三)在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。

1、利用Bezier曲线的生成算法实现二次Bezier曲线的生成(算法的详细原理见教材)。

void CBezierV iew::OnBezier2()
{
// TODO: Add your command handler code here
CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口
CPen bluepen(PS_SOLID,2,RGB(0,0,255));//创建画实线、线宽为2的蓝色画笔
CPen *old=pDC->SelectObject(&bluepen);
float x0=100,y0=100,x1=200,y1=50,x2=150,y2=250;
float i,x,y,dt,t,n=30.0;
dt=1/n;
for(i=0;i<=n;i++)
{
t=i*dt;
x=x0*(1-t)*(1-t)+x1*2*t*(1-t)+x2*t*t;
y=y0*(1-t)*(1-t)+y1*2*t*(1-t)+y2*t*t;
if(i==0)pDC->MoveTo(x,y);
pDC->LineTo(x,y);
pDC->MoveTo(x0,y0);
pDC->LineTo(x1,y1);
pDC->LineTo(x2,y2);
pDC->SelectObject(old);
ReleaseDC(pDC);
}
由以上代码绘出的图形如下:
2、利用Bezier曲线的生成算法实现二次Bezier曲线的生成(算法的详细原理见教材)。

void CBezierV iew::OnBezier3()
{
// TODO: Add your command handler code here
CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口
CPen redpen(PS_SOLID,2,RGB(255,0,0));//创建画实线、线宽为2的红色画笔
CPen *old=pDC->SelectObject(&redpen);
float x0=50,y0=50,x1=150,y1=150,x2=300,y2=130,x3=350,y3=50;
float i,x,y,dt,t,n=30.0;
dt=1/n;
for(i=0;i<=n;i++)
t=i*dt;
x=x0*(1-t)*(1-t)*(1-t)+x1*3*t*(1-t)*(1-t)+x2*3*t*t*(1-t)+x3*t*t*t;
y=y0*(1-t)*(1-t)*(1-t)+y1*3*t*(1-t)*(1-t)+y2*3*t*t*(1-t)+y3*t*t*t;
if(i==0)pDC->MoveTo(x,y);
pDC->LineTo(x,y);
}
pDC->MoveTo(x0,y0);
pDC->LineTo(x1,y1);
pDC->LineTo(x2,y2);
pDC->LineTo(x3,y3);
pDC->SelectObject(old);
ReleaseDC(pDC);
}
由以上代码绘出的图形如下:
3、以上是本次实验的基本部分,能不能利用该算法,完成任意阶次Bezier曲线的生成,请同学们认真考虑,完成这部分的内容,并将具体的实现过程撰写在实验报告上。

五、思考
1、如何实现任意阶次Bezier曲线的生成;
2、如何利用Bezier曲线来实现任意复杂形状曲线的生成。

相关文档
最新文档