Bezier曲线的算法实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
curx=0; cury=0;
for(j=0;j<=n;j++)
{
b=Bernstein(j,n,t);
curx=curx+array[j][0]*b;
cury=cury+array[j][1]*b;
}
pDC->LineTo(curx,cury);
t=t+dt;
}
(2)编译、运行后查看结果,如图1所示。
for (i=0;i<=n;i++)
pDC->LineTo(array[i][0],array[i][1]);
//绘制Bezier曲线
pDC->MoveTo(array[0][0],array[0][1]); //回到起点
pDC->SelectObject(&PenRed);
t=0.0;
for (i=0;i<=(int)1/dt;i++)
实验六:Bezier曲线的算法实现
(wenku.baidu.com)算法描述
根据Q(t)=∑Pi•Bi,n(t) =∑Pi•C in ti(1-t)n-i
并且C in =C(n,k)= C(n,k-1)
在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。
{
int i,j;
double sum;
sum=Multiply_n(m,n); //求C mn
for (i=1;i<=m;i++)
sum=sum*t; // C mn tm
for (j=1;j<=n-m;j++)
sum=sum*(1-t); // C mn tm(1-t)n-m
return sum;
CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔
CPen PenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔
//首先绘出特征多边形
pDC->SelectObject(&PenBlue);
pDC->MoveTo(array[0][0],array[0][1]);
程序实现步骤:(工程名:BezierCurve)
(ⅰ)C m n的函数实现,定义成成员函数,命名为Multiply_n。
C mn = =
int Multiply_n(int m,n)
{
int i,j,a;
if (m!=0)
{
a=1;
for (i=m+1;i<=n;i++) //求(m+1)(m+2)…(n-1).n
}
(ⅲ)在OnDraw(CDC* pDC)函数中添加如下代码:
int i,j,k,n=3; //n=3表示三次Bezier曲线
double curx,cury,t,b;
double dt=0.01;
int array[4][2]={{30,100},{100,30},{50,150},{200,40}};
a=a*i;
for (j=1;j<=n-m;j++) //求(n-m)!和C mn
a=a/j;
return a;
}
else
return 1;
}
(ⅱ)伯恩斯坦多项式Bm,n(t)的函数实现
Bm,n(t)= C mn tm(1-t)n-m
Double Bernstein(int m,int n,double t)
图1 Bezier曲线程序结果
这时Bezier曲线的通用程序设计。通过这个程序,我们绘出二次、三次甚至高次Bezier曲线。
(3)思考下面情况的程序实现:
取样点数改变,例如:改为50或者80或者120等;
curx=0; cury=0;
for(j=0;j<=n;j++)
{
b=Bernstein(j,n,t);
curx=curx+array[j][0]*b;
cury=cury+array[j][1]*b;
}
pDC->LineTo(curx,cury);
t=t+dt;
}
(2)编译、运行后查看结果,如图1所示。
for (i=0;i<=n;i++)
pDC->LineTo(array[i][0],array[i][1]);
//绘制Bezier曲线
pDC->MoveTo(array[0][0],array[0][1]); //回到起点
pDC->SelectObject(&PenRed);
t=0.0;
for (i=0;i<=(int)1/dt;i++)
实验六:Bezier曲线的算法实现
(wenku.baidu.com)算法描述
根据Q(t)=∑Pi•Bi,n(t) =∑Pi•C in ti(1-t)n-i
并且C in =C(n,k)= C(n,k-1)
在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。
{
int i,j;
double sum;
sum=Multiply_n(m,n); //求C mn
for (i=1;i<=m;i++)
sum=sum*t; // C mn tm
for (j=1;j<=n-m;j++)
sum=sum*(1-t); // C mn tm(1-t)n-m
return sum;
CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔
CPen PenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔
//首先绘出特征多边形
pDC->SelectObject(&PenBlue);
pDC->MoveTo(array[0][0],array[0][1]);
程序实现步骤:(工程名:BezierCurve)
(ⅰ)C m n的函数实现,定义成成员函数,命名为Multiply_n。
C mn = =
int Multiply_n(int m,n)
{
int i,j,a;
if (m!=0)
{
a=1;
for (i=m+1;i<=n;i++) //求(m+1)(m+2)…(n-1).n
}
(ⅲ)在OnDraw(CDC* pDC)函数中添加如下代码:
int i,j,k,n=3; //n=3表示三次Bezier曲线
double curx,cury,t,b;
double dt=0.01;
int array[4][2]={{30,100},{100,30},{50,150},{200,40}};
a=a*i;
for (j=1;j<=n-m;j++) //求(n-m)!和C mn
a=a/j;
return a;
}
else
return 1;
}
(ⅱ)伯恩斯坦多项式Bm,n(t)的函数实现
Bm,n(t)= C mn tm(1-t)n-m
Double Bernstein(int m,int n,double t)
图1 Bezier曲线程序结果
这时Bezier曲线的通用程序设计。通过这个程序,我们绘出二次、三次甚至高次Bezier曲线。
(3)思考下面情况的程序实现:
取样点数改变,例如:改为50或者80或者120等;