找本计算机图形学看一看,里面一般都有,不过一般都是数学表达式,有原代码也大部分是
pascal语言

解决方案 »

  1.   


    http://www.wavecn.com/_articles/insertvalue.htm这个例程是C写的,可以参考
    三次样条插值范例程序// Name : ispline-gen ( ).
    // Function: Interpolating cubic spline function for irregularly-spaced poinis.
    // Parametcrs: Y1 : is a list of irregular data points (len1 entries).
    // X1 : x-coordinaies of the adta siored in Y1.
    // Y2 : Cubic spline sampled according io X2 (len2 entries).
    // Calls : getYD_gen ( ) .void ispline_gen(double x X1 ,double x Y1 ,int len1 ,doublc & X2 ,double x Y2 ,int len2)
    {
      int i, j;
      double * YD, A0, A1, A2, A3, x, dx, dy, p1, p2, p3;
      YD = (double x ) calloc (len1 , sizeof(double) ) ;
      getYD_ gen ( X1 , Y1 , YD , len1 ) ;
      / * error checking * /
      if (X2 [0]<X1 [o] | | X2 [len2 - 1]>X1 [len1 - 1 ] )
        {
        printf ("out of range");
        exit ( 0 ) ;
        }
      p3 = X2 [0]-1 ;
      for (i = j = 0 ; i<len2 ; i + + )
        {
        p2 = X2[i] ;
        if(p2>p3)
          {
          for ( ; j<ilen1 && p2 > X1 [j] ; j + + )
            if(p2<X1 [i] ) j-- ;      p1 = X1 [j];
          p3 = X1 [j + 1];
          dx = 1.0 / (X 1 [j + 1 ]-X1 [i] ) ;
          dy = (Y1 [j + 1]-Y1 [j]) * dx ;
          A0 = Y1 [i] ;
          A1 = YD[j] ;
          A2=dx * (3.0 * dy-2. 0 * YD[j]-YD[j+ 1]) ;
          A3=dx * dx * (-2.0 * dy+YD[i]+YD[j+1]) ;
          }
        x = p2-p1 ;
        Y2[i]= ((A3 * x+A2) * x+A1) * x+A0;
        }
      free( (char * )YD) ;
    }// Name : getYD_ gen ( ) .
    // Function : Compute 1st derivaiives of data in X and Y(len entries).
    // The not-a-knot boundary is used.
    // Parameters : Y : is a list of irregular data points (len1 entries).
    // X : x-coordinatcs of the adta stored in Y1.
    // YD : output data (len entries) .
    // Calls : tridiag_gen ( )void getYD_gen (double * X ,doublc * Y ,double * YD ,int len)
    {
      int i ;
      double h0,h1 ,r0,r1 , * A, * B, * C;
      A =(double * ) calloc (len , sizeof (double ) ) ;
      B =(double x ) calloc (len , sizeof(double) ) ;
      C =(double x ) calloc (len , sizeof(double ) ) ;
      h0 =X [1 ]-X [0] ;
      h1 =X [2]-X [1 ] ;
      r0 =(Y[1 ]-Y[0] ) /h0 ;
      r1 = (Y[2]-Y[1] ) /h1 ;
      B[0] =h1 * (h0+h1 ) ;
      C[0]=(h0+h1 ) * (h0+h1 ) ;
      YD[0]=r0 * (3 * h0 * h1+2 * h1 * h1)+r1 * h0 * h0;
      for (i = 1 ; i<len-1 ; i + + )
        {
        h0 = X [i ]-X[i- 1 ] ;
        h1 =x [i + 1 ]-x [i] ;
        r0 = (Y [i]-y [i- 1 ] ) /h0 ;
        r1  (Y[i+ 1 ]-Y[i] ) /h1 ;
        A[I] = h1 ;
        B[i]= 2 * (h0+h1 ) ;
        C[i] = h0 ;
        YD[i] = 3 * (r0 * h1 + r1 * h0) ;
        }
      A[i] = (h0-h1 ) * (h0+h1 ) ;
      B[i] =h0 * (h0+h1 ) ;
      C[i] = h0 ;
      YD[i]=r0 * h1 * h1+r1 * (3 * h0 * h1+2 * h0 * h0) ;
      / * solve for the tridiagonal mairix. * /
      tridiag_gen ( A , B , C , YD , len ) ;
      free( (char * ) A) ;
      free( (char * ) B) ;
      free( (char * ) C) ;
    }// Name : tridiag_gen( ).
    // Function : solve for the tridiagonal matrix using Gauss
    // backsubstitution method.
    // Parameters: A ,B ,C, D : is a list of store data Points (len entries).void tridiag_gen (double * A , double * B , double * C ,double * D , int len )
    {
      int i ;
      double b , * F ;
      F = (double * )calloc (len , sizeof(double ) ) ;
      b = B[0] /b ;
      D[0]= D[0] /b ;
      for ( i=1 ; i< len ; i ++)
        {
        F[i] =C[i- 1 ] /b ;
        b= B[i]-A[i] * F[i] ;
        if(B =0)
          {
          printf ( "getYD_gen : divide by zero") ;
          exit ( 0 ) ;
          }
        D[i]= ( D[i]-D[i-1]* A [i] ) /b ;
        }
      for ( i=len- 2 ; i >= 0 ; i-- )
        D[i]=(D[i+1]*F[i+1]);
      free ( (char * )F) ;
    }你参考参考吧,不知道是不是你想要的
      

  2.   

    使用指定的张力绘制经过一组指定的 Point 结构的基数样条。public void DrawCurve(
       Pen pen,
       Point[] points,
       int offset,
       int numberOfSegments,
       float tension
    );
    参数
    pen 
    Pen 对象,它确定曲线的颜色、宽度和高度。 
    points 
    Point 结构的数组,这些结构定义样条。 
    offset 
    从 points 参数数组中的第一个元素到曲线中起始点的偏移量。 
    numberOfSegments 
    起始点之后要包含在曲线中的段数。 
    tension 
    大于或等于 0.0F 的值,该值指定曲线的张力。 public void DrawCurvePointSegmentTension(PaintEventArgs e){// Create pens.Pen redPen   = new Pen(Color.Red, 3);Pen greenPen = new Pen(Color.Green, 3);// Create points that define curve.Point point1 = new Point( 50,  50);Point point2 = new Point(100,  25);Point point3 = new Point(200,   5);Point point4 = new Point(250,  50);Point point5 = new Point(300, 100);Point point6 = new Point(350, 200);Point point7 = new Point(250, 250);Point[] curvePoints ={point1,point2,point3,point4,point5,point6,point7};// Draw lines between original points to screen.e.Graphics.DrawLines(redPen, curvePoints);// Create offset, number of segments, and tension.int offset = 2;int numSegments = 4;float tension = 1.0F;// Draw curve to screen.e.Graphics.DrawCurve(greenPen, curvePoints, offset, numSegments, tension);}