//计算 Bezier curve
//cpt 端点及控制点
//cn cpt的数量
//st 准备计算多少步
//pXY, X,Y的坐标输出
BOOL CalBezier(POINT cpt[], int cn, int st, POINT *pXY)
{
int r,i,k;
double t, t1;
double coeffx[20], coeffy[20];
int n = min(cn, 20);
for(k=0; k<st; k++)
{
t= k/(st - 1.0); t1 = 1-t;
for(i=0;i<n;i++)
{
coeffx[i] = cpt[i].x;
coeffy[i] = cpt[i].y;
}
for(r=1;r<n;r++)
{
for(i=0;i<n-r;i++)
{
coeffx[i]= t1*coeffx[i] + t*coeffx[i+1];
coeffy[i]= t1*coeffy[i] + t*coeffy[i+1];
}
}
pXY[k].x = (LONG)coeffx[0];
pXY[k].y = (LONG)coeffy[0];
}
return (TRUE);
}
void CSDIView::OnDraw(CDC* pDC)
{
CSDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPen pen(PS_SOLID, 3, RGB(255, 0, 0));
CPen *pOldPen = pDC->SelectObject(&pen);
POINT cpt[] =
{{50, 400}, {140, 20}, {400, 40}, {600, 400} };
//按3000步计算
int k = 3000;
POINT *pxy = new POINT[k];
CalBezier(cpt, 4, k, pxy);
for(int i=0; i<k;i++)
{
if(i==0)
pDC->MoveTo(pxy[i]);
else
pDC->LineTo(pxy[i]);
}
delete [] pxy;
//使用GDIPolyBezier绘制对比
CPen pen2(PS_SOLID, 1, RGB(0, 255, 0));
pDC->SelectObject(&pen2);
pDC->PolyBezier(cpt, 4);
pDC->SelectObject(pOldPen);
}