⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpolate.c

📁 ZPAV (H265) PC(X86) demo ZPAV (H265) 是 音视频 压缩解压 协议
💻 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 + -