📄 interpolate.c
字号:
/*
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2006-2008 Beijing, pengzhen (pengzhenxp@yahoo.com.cn) //
// //
///////////////////////////////////////////////////////////////////////////////
*/
#define CARRE(A) (double)((A)*(A))
#define CUBE(A) (double)((A)*(A)*(A))
static inline void cubic_interpolation( INT* x, INT* y, INT* xs, INT* ys, int n )
{
int i,j,cour,prec;
double p,sig,a,b,c,d,e,f,g,a0,a1,a2,a3,xc;
double ys2[HISTTOGRAM_COUNT],temp[HISTTOGRAM_COUNT] ;
/* Calcul des derivees secondes at points xs[i] */
//double *ys2,*temp ;
//ys2=(double *)malloc(n*sizeof(double));
//temp=(double *)malloc(n*sizeof(double));
ys2[0]=temp[0]=0.0;
for (i=1;i<n-1;i++)
{
sig=((double)xs[i]-(double)xs[i-1])/((double)xs[i+1]-(double)xs[i-1]);
p=sig*ys2[i-1]+2.0;
ys2[i]=(sig-1.0)/p;
temp[i] = ((double)ys[i+1]-(double)ys[i])/((double)xs[i+1]-(double)xs[i]) -
((double)ys[i]-(double)ys[i-1])/((double)xs[i]-(double)xs[i-1]) ;
temp[i]=(6.0*temp[i]/((double)xs[i+1]-(double)xs[i-1])-sig*temp[i-1])/p;
}
ys2[n-1]=0.0;
for (j=n-2;j>=0;j--) ys2[j]=ys2[j]*ys2[j+1]+temp[j];
/* interpolante */
cour=0;
for (j=0;j<(n-1);j++)
{
/* coefficients of polynome */
a=(double)xs[j];
b=(double)xs[j+1];
c=b-a;
d=(double)ys[j];
e=(double)ys[j+1];
f=ys2[j];
g=ys2[j+1];
a0=(b*d-a*e+CUBE(b)*f/6-CUBE(a)*g/6)/c+c*(a*g-b*f)/6;
a1=(e-d-CARRE(b)*f/2+CARRE(a)*g/2)/c+c*(f-g)/6;
a2=(b*f-a*g)/(2*c);
a3=(g-f)/(6*c);
prec=cour;
//while ((int)x[cour]!=(int)xs[j+1]) cour++;
while ((double)x[cour]!=(double)xs[j+1]) cour++;
/* polynome at point x[i] */
for (i=prec;i<cour;i++)
{
xc = x[i];
y[i] = (INT)( a0+a1*xc+a2*CARRE(xc)+a3*CUBE(xc) ) ;
if( y[i] <0) y[i] =0; /* peng zhen */
}
}
y[cour]=(INT)ys[n-1];
}
#undef CARRE
#undef CUBE
static inline void line_interpolation_data_b( BYTE color, BYTE* data, int stride,
int x0, int y0, int x1, int y1 )
{
BYTE* pix = data;
BYTE* pix1 ;
int dx = (x1 - x0);
int dy = (y1 - y0);
int dx1 = ABS(dx) ;
int dy1 = ABS(dy) ;
int sx , sy ;
int cn = 0 ;
int x , y ;
if( dx1 > dy1 ) // x direction
{
sx = (256) ;
sy = (dx !=0) ? (dy*256) / dx : 0 ;
cn = dx1 + 1 ;
if (dx>0) pix1 = data + y0 * stride + x0 ;
else pix1 = data + y1 * stride + x1 ;
}
else // y direction
{
sx = (dy !=0) ? (dx*256) / dy : 0 ;
sy = (256) ;
cn = dy1 + 1 ;
if (dy>0) pix1 = data + y0 * stride + x0 ;
else pix1 = data + y1 * stride + x1 ;
}
x = y = 0 ;
while( cn -- )
{
pix = pix1 + (y/256)*stride + (x)/256 ;
*pix = color ;
x += sx ;
y += sy ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -