| 2.1.17.5.9 ocmath_3d_interpolate
 DescriptionThis function interpolates an input scattered data points at given 3d xyz coordinates, with the modified Shepard method.
 Syntaxint 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.
 ReturnReturn 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.
 ExamplesEX1
 //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);        
}RemarkThis 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 Alsoocmath_2d_interpolate, ocmath_interpolate
 Header to Includeorigin.h
 Referencenag_3d_shep_interp(e01tgc), nag_3d_shep_eval(e01thc)
 |