ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/hilbert.h
Revision: 3.2
Committed: Fri Feb 18 18:41:04 2011 UTC (13 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R1, rad4R2P1, rad5R3, HEAD
Changes since 3.1: +1 -0 lines
Log Message:
Added missing RCS tags

File Contents

# User Rev Content
1 greg 3.2 /* RCSid $Id$ */
2 greg 3.1 /* C header file for Hilbert curve functions */
3     #if !defined(_hilbert_h_)
4     #define _hilbert_h_
5    
6     #ifdef __cplusplus
7     extern "C" {
8     #endif
9    
10     /* define the bitmask_t type as an integer of sufficient size */
11     typedef unsigned long long bitmask_t;
12     /* define the halfmask_t type as an integer of 1/2 the size of bitmask_t */
13     typedef unsigned long halfmask_t;
14    
15     /*****************************************************************
16     * hilbert_i2c
17     *
18     * Convert an index into a Hilbert curve to a set of coordinates.
19     * Inputs:
20     * nDims: Number of coordinate axes.
21     * nBits: Number of bits per axis.
22     * index: The index, contains nDims*nBits bits (so nDims*nBits must be <= 8*sizeof(bitmask_t)).
23     * Outputs:
24     * coord: The list of nDims coordinates, each with nBits bits.
25     * Assumptions:
26     * nDims*nBits <= (sizeof index) * (bits_per_byte)
27     */
28    
29     void hilbert_i2c(unsigned nDims, unsigned nBits, bitmask_t index, bitmask_t coord[]);
30    
31     /*****************************************************************
32     * hilbert_c2i
33     *
34     * Convert coordinates of a point on a Hilbert curve to its index.
35     * Inputs:
36     * nDims: Number of coordinates.
37     * nBits: Number of bits/coordinate.
38     * coord: Array of n nBits-bit coordinates.
39     * Outputs:
40     * index: Output index value. nDims*nBits bits.
41     * Assumptions:
42     * nDims*nBits <= (sizeof bitmask_t) * (bits_per_byte)
43     */
44    
45     bitmask_t hilbert_c2i(unsigned nDims, unsigned nBits, bitmask_t const coord[]);
46    
47     /*****************************************************************
48     * hilbert_cmp, hilbert_ieee_cmp
49     *
50     * Determine which of two points lies further along the Hilbert curve
51     * Inputs:
52     * nDims: Number of coordinates.
53     * nBytes: Number of bytes of storage/coordinate (hilbert_cmp only)
54     * nBits: Number of bits/coordinate. (hilbert_cmp only)
55     * coord1: Array of nDims nBytes-byte coordinates (or doubles for ieee_cmp).
56     * coord2: Array of nDims nBytes-byte coordinates (or doubles for ieee_cmp).
57     * Return value:
58     * -1, 0, or 1 according to whether
59     coord1<coord2, coord1==coord2, coord1>coord2
60     * Assumptions:
61     * nBits <= (sizeof bitmask_t) * (bits_per_byte)
62     */
63    
64     int hilbert_cmp(unsigned nDims, unsigned nBytes, unsigned nBits, void const* coord1, void const* coord2);
65     int hilbert_ieee_cmp(unsigned nDims, double const* coord1, double const* coord2);
66    
67     /*****************************************************************
68     * hilbert_box_vtx
69     *
70     * Determine the first or last vertex of a box to lie on a Hilbert curve
71     * Inputs:
72     * nDims: Number of coordinates.
73     * nBytes: Number of bytes/coordinate.
74     * nBits: Number of bits/coordinate. (hilbert_box_vtx only)
75     * findMin: Is it the least vertex sought?
76     * coord1: Array of nDims nBytes-byte coordinates - one corner of box
77     * coord2: Array of nDims nBytes-byte coordinates - opposite corner
78     * Output:
79     * c1 and c2 modified to refer to selected corner
80     * value returned is log2 of size of largest power-of-two-aligned box that
81     * contains the selected corner and no other corners
82     * Assumptions:
83     * nBits <= (sizeof bitmask_t) * (bits_per_byte)
84     */
85     unsigned
86     hilbert_box_vtx(unsigned nDims, unsigned nBytes, unsigned nBits,
87     int findMin, void* c1, void* c2);
88     unsigned
89     hilbert_ieee_box_vtx(unsigned nDims,
90     int findMin, double* c1, double* c2);
91    
92     /*****************************************************************
93     * hilbert_box_pt
94     *
95     * Determine the first or last point of a box to lie on a Hilbert curve
96     * Inputs:
97     * nDims: Number of coordinates.
98     * nBytes: Number of bytes/coordinate.
99     * nBits: Number of bits/coordinate.
100     * findMin: Is it the least vertex sought?
101     * coord1: Array of nDims nBytes-byte coordinates - one corner of box
102     * coord2: Array of nDims nBytes-byte coordinates - opposite corner
103     * Output:
104     * c1 and c2 modified to refer to least point
105     * Assumptions:
106     * nBits <= (sizeof bitmask_t) * (bits_per_byte)
107     */
108     unsigned
109     hilbert_box_pt(unsigned nDims, unsigned nBytes, unsigned nBits,
110     int findMin, void* coord1, void* coord2);
111     unsigned
112     hilbert_ieee_box_pt(unsigned nDims,
113     int findMin, double* c1, double* c2);
114    
115     /*****************************************************************
116     * hilbert_nextinbox
117     *
118     * Determine the first point of a box after a given point to lie on a Hilbert curve
119     * Inputs:
120     * nDims: Number of coordinates.
121     * nBytes: Number of bytes/coordinate.
122     * nBits: Number of bits/coordinate.
123     * findPrev: Is the previous point sought?
124     * coord1: Array of nDims nBytes-byte coordinates - one corner of box
125     * coord2: Array of nDims nBytes-byte coordinates - opposite corner
126     * point: Array of nDims nBytes-byte coordinates - lower bound on point returned
127     *
128     * Output:
129     if returns 1:
130     * c1 and c2 modified to refer to least point after "point" in box
131     else returns 0:
132     arguments unchanged; "point" is beyond the last point of the box
133     * Assumptions:
134     * nBits <= (sizeof bitmask_t) * (bits_per_byte)
135     */
136     int
137     hilbert_nextinbox(unsigned nDims, unsigned nBytes, unsigned nBits,
138     int findPrev, void* coord1, void* coord2,
139     void const* point);
140    
141     /*****************************************************************
142     * hilbert_incr
143     *
144     * Advance from one point to its successor on a Hilbert curve
145     * Inputs:
146     * nDims: Number of coordinates.
147     * nBits: Number of bits/coordinate.
148     * coord: Array of nDims nBits-bit coordinates.
149     * Output:
150     * coord: Next point on Hilbert curve
151     * Assumptions:
152     * nBits <= (sizeof bitmask_t) * (bits_per_byte)
153     */
154    
155     void
156     hilbert_incr(unsigned nDims, unsigned nBits, bitmask_t coord[]);
157    
158     #ifdef __cplusplus
159     }
160     #endif
161    
162     #endif /* _hilbert_h_ */