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);
}
|