贝塞尔曲线绘制

 

  

#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;
    }

 

输出结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值