ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/interp2d.h
Revision: 2.9
Committed: Fri Feb 15 19:15:16 2013 UTC (11 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R2P1, rad5R3
Changes since 2.8: +3 -3 lines
Log Message:
Changed from blkflg to influence flag array

File Contents

# User Rev Content
1 greg 2.9 /* RCSid $Id: interp2d.h,v 2.8 2013/02/15 01:26:47 greg Exp $ */
2 greg 2.1 /*
3 greg 2.4 * Header for interpolation of anisotropic samples on 2-D plane.
4 greg 2.1 *
5     * G.Ward Feb 2013
6     */
7    
8 greg 2.3 #ifndef _RAD_INTERP2D_H_
9     #define _RAD_INTERP2D_H_
10    
11     #ifdef __cplusplus
12     extern "C" {
13     #endif
14    
15 greg 2.4 #define NI2DSMF 0.42f /* minimal smoothing factor */
16 greg 2.1
17     #define NI2DIR (2*4) /* # interpolation directions */
18 greg 2.9 #define NI2DIM 16 /* size of influence map */
19 greg 2.1
20     /* Data structure for interpolant */
21     typedef struct {
22     int ns; /* number of sample positions */
23 greg 2.4 float dmin; /* minimum diameter (default=1) */
24 greg 2.1 float smf; /* smoothing factor (def=NI2DSMF) */
25 greg 2.7 float smin[2]; /* sample minima */
26 greg 2.8 float smax[2]; /* sample maxima */
27     float grid2; /* grid diameter squared */
28 greg 2.7 struct interp2_samp {
29     unsigned short dia[NI2DIR];
30 greg 2.9 unsigned short infl[NI2DIM];
31 greg 2.7 } *da; /* direction array (private) */
32 greg 2.1 float spt[1][2]; /* sample positions (extends struct) */
33     } INTERP2;
34    
35     /* Allocate a new set of interpolation samples (caller assigns spt[] array) */
36     extern INTERP2 *interp2_alloc(int nsamps);
37    
38 greg 2.2 /* Resize interpolation array (caller must assign any new values) */
39     extern INTERP2 *interp2_realloc(INTERP2 *ip, int nsamps);
40    
41 greg 2.5 /* Set minimum distance under which samples will start to merge */
42     extern void interp2_spacing(INTERP2 *ip, double mind);
43    
44     /* Modify smoothing parameter by the given factor */
45     extern void interp2_smooth(INTERP2 *ip, double sf);
46    
47 greg 2.1 /* Assign full set of normalized weights to interpolate the given location */
48     extern int interp2_weights(float wtv[], INTERP2 *ip, double x, double y);
49    
50     /* Get normalized weights and indexes for n best samples in descending order */
51     extern int interp2_topsamp(float wt[], int si[], const int n,
52     INTERP2 *ip, double x, double y);
53     /* Free interpolant */
54     extern void interp2_free(INTERP2 *ip);
55 greg 2.2
56     /* (Re)compute anisotropic basis function interpolant (normally automatic) */
57     extern int interp2_analyze(INTERP2 *ip);
58 greg 2.3
59 greg 2.7 /* Compute unnormalized weight for a position relative to a sample */
60     double interp2_wti(INTERP2 *ip, const int i, double x, double y);
61    
62 greg 2.4 /***************************************************************
63     * Typical use is to allocate an INTERP2 struct and assign the
64     * spt[] array with the ordered sample locations in x & y. (The
65     * actual orientation of the axes is not important so long as
66     * the application is consistent.) During interpolation, either
67     * interp2_weights() is called to obtain a normalized weighting
68     * vector for all the samples, or interp2_topsamp() is called to
69     * get the most important N samples for the specified location.
70     * The weights (and indexes in the case of interp2_topsamp)
71 greg 2.6 * are then used as coefficients for corresponding sample
72     * values in a vector sum that interpolates the function at
73     * that location.
74 greg 2.5 * The minimum distance between sample positions defaults to 1.0.
75 greg 2.6 * Values spaced closer than this will be merged/averaged.
76     * The interp2_spacing() call may be used to alter this distance,
77 greg 2.5 * causing the interpolant to be recalculated during the
78 greg 2.6 * next call to the sampling functions.
79 greg 2.5 * The default smoothing factor NI2DSMF provides near-optimal
80     * interpolation when well-separated values are known
81 greg 2.6 * precisely. Increase this setting by a factor > 1
82 greg 2.5 * with the interp2_smooth() call if greater mixing is desired.
83 greg 2.6 * A call of interp2_smooth(ip,0) resets to the minimum
84 greg 2.5 * default. It is not possible to "sharpen" the data.
85 greg 2.4 **************************************************************/
86    
87 greg 2.3 #ifdef __cplusplus
88     }
89     #endif
90     #endif /* !_RAD_INTERP2D_H_ */