#include <math.h>
//计算阶乘
double Cal_Factorial(int n)
{
double fFactorial = 1;
for(int i=2; i<=n; i++)
fFactorial *= i;
return fFactorial;
}
//贝塞尔实现
BOOL _PolyBezier(HDC hDC, //目标DC
const POINT* lpPoints, int nCount, //曲线控制点
LPPOINT ptOrg=NULL) //DC原始坐标
{
int i, n = nCount - 1;
double *fNi = new double[nCount];
//(n i) = n!/(i!*(n-i)!)
for(i=0; i<nCount; i++)
{
fNi[i] = Cal_Factorial(n) / Cal_Factorial(i) / Cal_Factorial(n - i);
}
MoveToEx(hDC, lpPoints[0].x, lpPoints[0].y, ptOrg);
for(double t=0; t <= 1.0; t+=1E-3)
{
double fx = 0, fy=0;
for(i=0; i<nCount; i++)
{
double fRate = fNi[i] * pow(t, i) * pow(1-t, n-i);
fx += fRate * lpPoints[i].x;
fy += fRate * lpPoints[i].y;
}
LineTo(hDC, (int)fx, (int)fy);
Sleep(1);
}
delete []fNi;
return TRUE;
}
//测试代码
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
hdc=::BeginPaint(hwnd,&ps);
const POINT ptArray[] = { {100, 100}, {200, 500}, {370, 50}, {400, 500} };
for(int i=0; i<_countof(ptArray); i++)
{
MoveToEx(hdc, ptArray[i].x-5, ptArray[i].y, NULL);
LineTo(hdc, ptArray[i].x+5, ptArray[i].y);
MoveToEx(hdc, ptArray[i].x, ptArray[i].y-5, NULL);
LineTo(hdc, ptArray[i].x, ptArray[i].y+5);
}
_PolyBezier(hdc, ptArray, _countof(ptArray));
::EndPaint(hwnd,&ps);
return 0;
}
输出结果