哪位大侠知道,希望贴一下,谢谢

解决方案 »

  1.   

    struct Point2d {double X, Y;};
    //3次B样条曲线
    void Calc3BSpline(const Point2d &p1,
                      const Point2d &p2,
                      const Point2d &p3,
                      const Point2d &p4,
                      const int     num,  //插入的点数
                      FcPoint2d     *pt)  //结果,pt数组的大小应为num+1
    {
      double t;  for(int i=0; i <= num; i++)
      {
        t=double(i)/double(num);
        
        pt[i].X=((  -p1.X + 3*p2.X - 3*p3.X + p4.X)*t*t*t +
                 ( 3*p1.X - 6*p2.X + 3*p3.X       )*t*t +
                 (-3*p1.X          + 3*p3.X       )*t +
                 (   p1.X + 4*p2.X +   p3.X       ))/6.0f;    pt[i].Y=((  -p1.Y + 3*p2.Y - 3*p3.Y + p4.Y)*t*t*t +
                 ( 3*p1.Y - 6*p2.Y + 3*p3.Y       )*t*t +
                 (-3*p1.Y          + 3*p3.Y       )*t +
                 (   p1.Y + 4*p2.Y +   p3.Y       ))/6.0f;
      }
    }
    //------------------------------------------------------------------------//2次B样条曲线
    void Calc2BSpline(const Point2d &p1,
                      const Point2d &p2,
                      const Point2d &p3,
                      const int     num,  //插入的点数
                    FcPoint2d    *pt)  //结果,pt数组的大小应为num+1
    {
      double t;
      for(int i=0; i <= num; i++)
      {
        t=double(i)/double(num);
        pt[i].X=((   p1.X - 2*p2.X + p3.X)*t*t +
                 (-2*p1.X + 2*p2.X       )*t +
                 (   p1.X +   p2.X       ))/2.0f;
        
        pt[i].Y=((   p1.Y - 2*p2.Y + p3.Y)*t*t +
                 (-2*p1.Y + 2*p2.Y       )*t +
                 (   p1.Y +   p2.Y       ))/2.0f;
      }
    }
    //------------------------------------------------------------------------