#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; }
輸出結果