2.1.17.5.9 ocmath_3d_interpolate


Description

This function interpolates an input scattered data points at given 3d xyz coordinates, with the modified Shepard method.

Syntax

int ocmath_3d_interpolate( const double * pX, const double * pY, const double * pZ, double * pQ, UINT nSize, const double * pSrcX, const double * pSrcY, const double * pSrcZ, const double * pSrcF, UINT nSrcSize )

Parameters

pX
[input] pointer to X coordinate to be evaluated. size is nSize
pY
[input] pointer to Y coordinate to be evaluated. size is nSize
pZ
[input] pointer to Z coordinate to be evaluated. size is nSize
pQ
[output] pointer to the interpolation values at evaluation points. size is nSize
nSize
[input] size of evaluation points, nSize > 0
pSrcX
[input] pointer to the X value of original scattered data points, size is nSrcSize.
pSrcY
[input] pointer to the Y value of original scattered data points. size is nSrcSize.
pSrcZ
[input] pointer to the Z value of original scattered data points. size is nSrcSize.
pSrcF
[input] pointer to the F value of original scattered data points. size is nSrcSize.
nSrcSize
[input] size of original scattered data points, nSrcSize ≥ 10.

Return

Return 0 if succeed, or a non-zero Nag error codes:

NE_INT = 90: nSrcSize must be not less than 10. nSize must be larger than 1

NE_DATA_COPLANAR = 2083: All nodes are coplanar. There is no unique solution

NE_DUPLICATE_NODE = 2084: There are duplicate nodes in the dataset. The interpolant can not be derived.

NE_BAD_POINT = 2085: At least one evaluation points lies outside the region of definition of the interpolant.

Examples

EX1

//Before running, make sure a worksheet is active in current project
void ocmath_3d_interpolate_ex1(int nSize)
{
    Worksheet wks = Project.ActiveLayer();
    wks.SetSize(-1,4);
    DataRange drIn;
    drIn.Add("Range1", wks, 0, 0, -1, 0);
    drIn.Add("Range2", wks, 0, 1, -1, 1);
    drIn.Add("Range3", wks, 0, 2, -1, 2);
    drIn.Add("Range4", wks, 0, 3, -1, 3);
    
    vector vSrcX, vSrcY, vSrcZ, vSrcF;
    drIn.GetData(&vSrcX, 0);
    drIn.GetData(&vSrcY, 1);
    drIn.GetData(&vSrcZ, 2);
    drIn.GetData(&vSrcF, 3);
    
    int nSrcSize = vSrcX.GetSize();
    double dmin,dmax;
    vector vx,vy,vz,vf;
    
    vSrcX.GetMinMax(dmin,dmax);
    vx.Data(dmin, dmax, (dmax-dmin)/(nSize-1));
    
    vSrcY.GetMinMax(dmin,dmax);
    vy.Data(dmin, dmax, (dmax-dmin)/(nSize-1));
    
    vSrcZ.GetMinMax(dmin,dmax);
    vz.Data(dmin, dmax, (dmax-dmin)/(nSize-1));
    
    vf.SetSize(nSize);

    int nRet = ocmath_3d_interpolate(vx, vy, vz, vf, nSize, vSrcX, vSrcY, vSrcZ,vSrcF, nSrcSize);
     if (nRet != OE_NOERROR)
    {
        printf("Error occurs when calling ocmath function!\n");
        return
    }
    Worksheet    wksResult;
    wksResult.Create("InterResult");
    while(wksResult.Columns())
        wksResult.DeleteCol(0);
    for(int n=0; n < 4; n++)
        wksResult.AddCol();
    DataRange drOut;
    drOut.Add("X", wksResult, 0, 0, -1, 0);
    drOut.Add("X", wksResult, 0, 1, -1, 1);
    drOut.Add("X", wksResult, 0, 2, -1, 2);
    drOut.Add("X", wksResult, 0, 3, -1, 3);
    drOut.SetData(vx, false, 0);
    drOut.SetData(vy, false, 1);
    drOut.SetData(vz, false, 2);
    drOut.SetData(vf, false, 3);        
}

Remark

This function interpolates the input data exactly and has quadratic accuracy.

The time taken will depend in general on the distribution of the data points.

At worst, O(nSrcSize*(nSrcSize+nSize)) time will be required.

See Also

ocmath_2d_interpolate, ocmath_interpolate

Header to Include

origin.h

Reference

nag_3d_shep_interp(e01tgc), nag_3d_shep_eval(e01thc)