跪求标准样条曲线算法 找本计算机图形学看一看,里面一般都有,不过一般都是数学表达式,有原代码也大部分是pascal语言 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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) ;}你参考参考吧,不知道是不是你想要的 使用指定的张力绘制经过一组指定的 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);} 想做一个简单的聊天软件 另气新贴:麻烦大家帮我看看,为什么这三行代码,一到clear()就崩溃? 居中问题 200求教:通过反射调用方法时,如何捕捉方法抛出的异常 字符型转整型用什么方法? 关键字out的问题 用c语言编写矩阵转换时出现程序运行中断 windowservice 访问 webservice 的问题 关于传递参数process.StartInfo.Arguments的问题? 一个控件是如何写成的? 想买手机 什么牌子的好呀? [UP有分解决即刻结帖]控件与数据正确绑定情况下调GetChanges()无法正确获得界面修改
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) ;
}你参考参考吧,不知道是不是你想要的
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);}