3.9.5.3 OriginC: Interpolation and Gridding



XYZ Gridding by Renka Cline Method(Origin80 SR0)

#include <Origin.h>
#include <OC_nag.h>
int xyz_gridding_in_renka_cline(const vector& vx, const vector& vy, const vector& vz, 
                                const vector& vxGrid, const vector& vyGrid, matrix& mat) 
{
	Nag_Scat_Struct  comm;
	NagError  fail;
	//INIT_FAIL
	fail.code = NE_NOERROR;
	fail.print = 0;

	int nSize = vx.GetSize();
        vector<int> triang(7*nSize);
        vector<double> grads(2*nSize);
        int nRows = mat.GetNumRows();
	int nCols = mat.GetNumCols();
	//nag_2d_scat_interpolan
        //nag_2d_scat_interpolant (e01sac) has been replaced by nag_2d_triang_interp (e01sjc) at Mark 25
	e01sjc(nSize, vx, vy, vz, triang, grads, &fail);
	if (fail.code != NE_NOERROR)
	{
		printf("Error from e01sjc: %s\n", fail.message);
		return fail.code;
	}
	//nag_2d_scat_eval
        //nag_2d_scat_eval (e01sbc) has been replaced by nag_2d_triang_eval (e01skc) at Mark 25	
	for(int ii=0; ii < nRows; ii++)
	{
		for(int jj=0; jj < nCols; jj++)
		{
			e01skc(nSize,vx, vy, vz, triang, grads, vxGrid[jj], vyGrid[ii], &mat[jj][ii], &fail);
		}
	}
	if (fail.code != NE_NOERROR && fail.code != NW_VALUE_EXTRAPOLATED)
	{
		printf("Error from e01skc: %s\n", fail.message);
		return fail.code;
	}
	
	return OE_NOERROR;	
}

1d Spline and NAG_FREE(Origin80 SR4)

#include <Origin.h>
#include <OC_nag.h> // must include this to see nag related macros and prototypes

// to run this example, you need to have 4 columns in the active
// worksheet and fill col(A) with a few rows by row number and col(B) by same
// number of rows of random values.
// This function will generate results in col(C) and col(D)
void test_e01bac(int nX = 0, int nY = 1, int nXFit = 2, int nYFit = 3)
{
	Worksheet wks = Project.ActiveLayer();
	// the knots in nX and nY
	Dataset aa(wks, nX);
	Dataset bb(wks, nY);
	vector vx, vy;
	vx = aa;
	vy = bb;
	Nag_Spline spline;
	int m = vx.GetSize();
	NagError fail = {0};
	e01bac(m, vx, vy, &spline, &fail);
	printf("Number of distinct knots = %d\n", m-2);
	printf("Distinct knots located at\n");
	for(int j = 3; j <m+1; j++)
		printf("%8.4f%s", spline.lamda[j], (j-3)%5==4 || j==m? "\n":" ");
	printf("\n\n   J B-spline coeff c\n\n");
	for(j=0; j <m; j++)
		printf("\n   %d  %13.4f\n", j+1, spline.c[j]);

	// put fit into col(nYFit) from x=col(nXFit)
	Dataset fitx(wks, nXFit);
	Dataset fity(wks, nYFit);
	// generate the X from original X by using each mid point, so total m-1 new points
	fitx.SetSize(m-1);
	for(int ii = 0; ii < m - 1; ii++)
		fitx[ii] = (aa[ii] + aa[ii+1]) * 0.5;
	//now we can get the spline fit
	fity.SetSize(fitx.GetSize());
	for(j=0; j<fity.GetSize(); j++)
	{
		double yy = NANUM;
		NagError fail = {0};
		e02bbc(fitx[j], &yy, &spline, &fail);
		fity[j] = yy;
	}
	//Free memory allocated by e01bac
	NAG_FREE(spline.lamda);
	NAG_FREE(spline.c);
}