由给定的点计算Bezier曲线

 

//计算 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);


}


版权声明:本文为zgl7903原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。