CP2 PP[4][4];//德卡斯特递推数组
void deCasteljau(double t);//德卡斯特递推计算
void DrawdeCasteljauBezier(CDC*pDC);//绘制德卡斯特曲线
void CdrawBezierCurveView::deCasteljau(double t)
{
for(int k=0;k<=n;k++)
{
PP[k][0].x=P[k].x;
PP[k][0].y=P[k].y;
}
for(int r=1;r<=n;r++)//二维数组表示德卡斯特递推数组
{
for(int i=0;i<=n-r;i++)
{
PP[i][r]=(1-t)*PP[i][r-1]+t*PP[i+1][r-1];
}
}
}
void CdrawBezierCurveView::DrawdeCasteljauBezier(CDC*pDC)
{
pDC->MoveTo(ROUND(P[0].x),ROUND(P[0].y));
double tStep=0.01;//参数步长
for(double t=0.0;t<=1.0;t=t+tStep)
{
deCasteljau(t);
pDC->LineTo(ROUND(PP[0][n].x),ROUND(PP[0][n].y));
}
}
在OnDraw中调用
DrawdeCasteljauBezier(pDC);
参考《计算几何算法与实现》–孔令德