--- ray/src/common/interp2d.h 2013/02/09 20:56:40 2.3 +++ ray/src/common/interp2d.h 2013/02/11 23:33:35 2.5 @@ -1,6 +1,6 @@ -/* RCSid $Id: interp2d.h,v 2.3 2013/02/09 20:56:40 greg Exp $ */ +/* RCSid $Id: interp2d.h,v 2.5 2013/02/11 23:33:35 greg Exp $ */ /* - * Header for interpolation of anisotropic values on 2-D plane. + * Header for interpolation of anisotropic samples on 2-D plane. * * G.Ward Feb 2013 */ @@ -12,16 +12,16 @@ extern "C" { #endif -#define NI2DSMF 0.42f /* minimal smoothing radius */ +#define NI2DSMF 0.42f /* minimal smoothing factor */ #define NI2DIR (2*4) /* # interpolation directions */ /* Data structure for interpolant */ typedef struct { int ns; /* number of sample positions */ - float rmin; /* minimum valid radius (default=.5) */ + float dmin; /* minimum diameter (default=1) */ float smf; /* smoothing factor (def=NI2DSMF) */ - unsigned short (*ra)[NI2DIR]; /* anisotropic radii (private) */ + unsigned short (*da)[NI2DIR]; /* anisotropic distances (private) */ float spt[1][2]; /* sample positions (extends struct) */ } INTERP2; @@ -31,6 +31,12 @@ extern INTERP2 *interp2_alloc(int nsamps); /* Resize interpolation array (caller must assign any new values) */ extern INTERP2 *interp2_realloc(INTERP2 *ip, int nsamps); +/* Set minimum distance under which samples will start to merge */ +extern void interp2_spacing(INTERP2 *ip, double mind); + +/* Modify smoothing parameter by the given factor */ +extern void interp2_smooth(INTERP2 *ip, double sf); + /* Assign full set of normalized weights to interpolate the given location */ extern int interp2_weights(float wtv[], INTERP2 *ip, double x, double y); @@ -43,6 +49,31 @@ extern void interp2_free(INTERP2 *ip); /* (Re)compute anisotropic basis function interpolant (normally automatic) */ extern int interp2_analyze(INTERP2 *ip); +/*************************************************************** + * Typical use is to allocate an INTERP2 struct and assign the + * spt[] array with the ordered sample locations in x & y. (The + * actual orientation of the axes is not important so long as + * the application is consistent.) During interpolation, either + * interp2_weights() is called to obtain a normalized weighting + * vector for all the samples, or interp2_topsamp() is called to + * get the most important N samples for the specified location. + * The weights (and indexes in the case of interp2_topsamp) + * are then used as coefficients for corresponding sample values + * in a vector sum that interpolates the function at that + * location. + * The minimum distance between sample positions defaults to 1.0. + * Values spaced closer than this will be merged (averaged). The + * interp2_spacing() call may be used to alter this member, + * causing the interpolant to be recalculated during the + * next call to either of the sampling functions. + * The default smoothing factor NI2DSMF provides near-optimal + * interpolation when well-separated values are known + * precisely. Increase this setting by a factor > 1.0 + * with the interp2_smooth() call if greater mixing is desired. + * A call of interp2_smooth(ip,0.0) resets to the minimum + * default. It is not possible to "sharpen" the data. + **************************************************************/ + #ifdef __cplusplus } #endif