ocmath_tps_fit
Description
This function perform 2D interpolation using thin plate spline method.
Syntax
int ocmath_tps_fit(int nNode, const double *x, const double *y, const double *z, double dSmooth, ocmath_strTPS *strTPS, double* dRegularization)
Parameters
- nNode
- [input] the number of scatters.
- x
- [input] the position and the x-coordinates of each points.
- y
- [input] the position and the y-coordinates of each points.
- z
- [input] the position and the z-coordinates of each points.
- dSmooth
- [input] the smooth factor.
- strTPS
- [output] contains the interpolation coefficients of the fitting.
- dRegularization
- [output] the regularization factor defined by the value of dsmooth.
Return
OE_NOERROR for successful or
OE_INVALID_POINT Not enough points (n<3) or all the points are colinear;
OE_NULL_POINTER if pointer is null.
OE_INVALID_SMOOTH Parameter dSmooth should not be less than zero.
Examples
EX1
#include <wks2mat.h>
int ocmath_tps_fit_ex1()
{
// tabulated data on a 3x3 regular grid, points of form (x,y,f(x,y))
const int iQuantity = 9;
double afX[] = {0.0, 0.5, 1.0,0.0, 0.5, 1.0,0.0, 0.5, 1.0};
double afY[] = {0.0, 0.0, 0.0,0.5, 0.5, 0.5,1.0, 1.0, 1.0};
double afF[] = {1.0, 2.0, 3.0,3.0, 2.0, 1.0,1.0, 2.0, 3.0};
// resample on a 7x7 regular grid
const int iResample = 6;
const double fInv = 1.0/(double)iResample;
int i, j;
// no smoothing, exact interpolation at grid points
ocmath_strTPS strTPS;
ocmath_tps_initial(&strTPS);
double dSmooth = 0.1;
double dReg;
int nRe = ocmath_tps_fit(iQuantity, afX, afY, afF,
dSmooth, &strTPS, &dReg);
if(nRe)
{
printf("intp error %d\n", nRe);
return -1;
}
else
{
printf("The regularization parameter is %g\n\n",dReg);
}
// Output the results
printf( "smooth parameter is %g\n", dSmooth);
double x, y, z;
for (j = 0; j <= iResample; j++)
{
y = fInv*j;
for (i = 0; i <= iResample; i++)
{
x = fInv*i;
ocmath_tps_eval(1, &x, &y, &z, &strTPS);
printf("%9.6f\t", z);
}
printf("\n");
}
ocmath_tps_free(&strTPS);
return 0;
}
EX2
// This example demonstrates the usage of thin plate spline fitting and XY gridding.
// To test, create an Origin workshhet with three columns that contain XYZ scatters.
// The result will be stored in a newly created Origin matrix window.
#include <wks2mat.h>
void ocmath_tps_fit_ex2()
{
int nRows = 100;
int nCols = 100;
Worksheet wks = Project.ActiveLayer();
wks.SetSize(-1, 3);
Dataset dsX(wks, 0), dsY(wks, 1), dsZ(wks, 2);
vector vXsrc(dsX), vYsrc(dsY), vZsrc(dsZ);
vector vXdest(nRows * nCols), vYdest(nRows * nCols), vZdest(nRows * nCols);
int nSize = vXsrc.GetSize();
double dXmin, dXmax, dYmin, dYmax;
vXsrc.GetMinMax(dXmin, dXmax);
vYsrc.GetMinMax(dYmin, dYmax);
MatrixLayer ml;
ml.Create();
MatrixObject mo = ml.MatrixObjects(0);
mo.SetNumRows(nRows);
mo.SetNumCols(nCols);
mo.SetXY(dXmin, dYmin, dXmax, dYmax);
Matrix& mat = mo.GetDataObject();
ocmath_strTPS strTPS;
ocmath_tps_initial(&strTPS);
double dSmooth = 0.0; // no smoothing, exact interpolation at grid points
double dReg;
int iRet;
// Initialization
iRet = ocmath_tps_fit(nSize, vXsrc, vYsrc, vZsrc, dSmooth, &strTPS, &dReg);
if(iRet) {
printf("intp error %d\n", iRet);
return;
}
// Create XY gridding.
iRet = ocmath_mat_to_regular_xyz(NULL, nRows, nCols, dXmin, dXmax, dYmin, dYmax, vXdest, vYdest, NULL);
if (iRet <= 0) {
printf("Failed to create XY gridding!\n");
return;
}
// Interpolation
ocmath_tps_eval(nRows * nCols, vXdest, vYdest, mat, &strTPS);
ocmath_tps_free(&strTPS);
}
Remark
See Also
ocmath_tps_eval
header to Include
wks2mat.h
Reference
|