计算机图形学——绘制Bezier曲线
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学
实验报告
专业:信息与计算科学
班级: 1002班
学号: **********
姓名: ****
实验目的:
(1)掌握直线的参数表示法。
(2)掌握德卡斯特里奥算法的几何意义。
(3)掌握绘制二维Bezier曲线的方法。
实验要求:
(1)使用鼠标左键绘制个数为10以内的任意控制点,使用直线连接构成控制多边形。
(2)使用鼠标右键绘制Bezier曲线。
(3)在状态栏显示鼠标的位置坐标。
(4)B ezier曲线使用德卡斯特里奥算法绘制。
实验算法:
Bezier曲线的分割递推德卡斯特里奥算法
给定空间n+1个点P i(i=0,1,2,…,n)及参数t,有
P r i(t)=(1-t)P1-r i(t)+t P1-r1i+(t)
式中,r=1,2,…,n;i=0,1,…,n-r;t∈[0,1]。
且规定当r=0时,P0i(t)=P i, P n0(t)是在曲线上具有参数t的点。
德卡斯特里奥算法的基础就是在矢量−
−→
−
P
P10
上选择一个点P,使
得P点划分矢量−
−→
−
P
P10为|P
P0|:|P
P1|=t:1-t,给定点P0、P1
的坐标以及t的值,点P的坐标为P=P0+t(P1-P0)=(1-t)P0+tP1。式中,t∈[0,1]。
定义贝塞尔曲线的控制点编号为P r i,其中,r表示迭代次数。德卡斯特里奥证明了,当r=n时,P n0表示Bezier曲线上的点。
函数功能介绍
1.德卡斯特里奥函数:
long CMy12View::DeCasteliau(double t,long *p)
{
double P[N_MAX_POINT][N_MAX_POINT];
int n=CtrlPNum-1;
for(int k=0;k<=n;k++)
{
P[0][k]=p[k];
}
for(int r=1;r<=n;r++)
{
for(int i=0;i<=n-r;i++)
{
P[r][i]=(1-t)*P[r-1][i]+t*P[r-1][i+1];
}
}
return(long(P[n][0]));
}
函数功能介绍:此函数为德卡斯特里奥算法函数。在绘制Bezier 曲线时,需调用两次此函数,分别关于x方向和y方向上的调用。由DrawBezier()函数调用。
2. void CMy12View::DrawBezier()
函数功能介绍:此函数为绘制Bezier曲线。绘制二维Bezier曲线,需要对x方向和y方向进行计算。这个函数就是解决这个问题,然后通过OnRButtonDown(UINT nFlags,CPoint point)调用进行绘制。
3 .void CMy12View::DrawCtrPolygon()
函数功能介绍:此函数为绘制控制多边形。定义一个CPen型NewPen,和CPen*型PoldPen,进行绘制多边形,为了突出控制点,使用黑色填充边长为4个像素的正方形块代表控制点。
4. void CMy12View::OnLButtonDown(UINT nFlags,CPoint point)
函数功能介绍:此函数为鼠标左键按下函数。按下鼠标左键,将鼠
标位置点作为控制点,并调用CMy12View::DrawCtrPolygon()函数绘制控制多边形
5. void CMy12View::OnRButtonDown(UINT nFlags,CPoint point)
函数功能介绍:此函数为鼠标右键按下函数。通过一个BOOL型的变量,控制多边形的绘制,由鼠标右键绘制Bezier曲线。
实验结果: