in reply to Re^3: Need Help with perlxstut
in thread Need Help with perlxstut
/***************************************************************** * hilbert_i2c * * Convert an index into a Hilbert curve to a set of coordinates. * Inputs: * nDims: Number of coordinate axes. * nBits: Number of bits per axis. * index: The index, contains nDims*nBits bits (so nDims*nBits m +ust be <= 8*sizeof(bitmask_t)). * Outputs: * coord: The list of nDims coordinates, each with nBits bits. * Assumptions: * nDims*nBits <= (sizeof index) * (bits_per_byte) */ void hilbert_i2c(unsigned nDims, unsigned nBits, bitmask_t index, bitm +ask_t coord[]); /***************************************************************** * hilbert_c2i * * Convert coordinates of a point on a Hilbert curve to its index. * Inputs: * nDims: Number of coordinates. * nBits: Number of bits/coordinate. * coord: Array of n nBits-bit coordinates. * Outputs: * index: Output index value. nDims*nBits bits. * Assumptions: * nDims*nBits <= (sizeof bitmask_t) * (bits_per_byte) */ bitmask_t hilbert_c2i(unsigned nDims, unsigned nBits, bitmask_t const +coord[]); /***************************************************************** * hilbert_cmp, hilbert_ieee_cmp * * Determine which of two points lies further along the Hilbert curve * Inputs: * nDims: Number of coordinates. * nBytes: Number of bytes of storage/coordinate (hilbert_cmp onl +y) * nBits: Number of bits/coordinate. (hilbert_cmp only) * coord1: Array of nDims nBytes-byte coordinates (or doubles for + ieee_cmp). * coord2: Array of nDims nBytes-byte coordinates (or doubles for + ieee_cmp). * Return value: * -1, 0, or 1 according to whether coord1<coord2, coord1==coord2, coord1>coord2 * Assumptions: * nBits <= (sizeof bitmask_t) * (bits_per_byte) */ int hilbert_cmp(unsigned nDims, unsigned nBytes, unsigned nBits, void +const* coord1, void const* coord2); int hilbert_ieee_cmp(unsigned nDims, double const* coord1, double cons +t* coord2); /***************************************************************** * hilbert_box_vtx * * Determine the first or last vertex of a box to lie on a Hilbert cur +ve * Inputs: * nDims: Number of coordinates. * nBytes: Number of bytes/coordinate. * nBits: Number of bits/coordinate. (hilbert_cmp only) * findMin: Is it the least vertex sought? * coord1: Array of nDims nBytes-byte coordinates - one corner of + box * coord2: Array of nDims nBytes-byte coordinates - opposite corn +er * Output: * c1 and c2 modified to refer to selected corner * value returned is log2 of size of largest power-of-two-aligned + box that * contains the selected corner and no other corners * Assumptions: * nBits <= (sizeof bitmask_t) * (bits_per_byte) */ unsigned hilbert_box_vtx(unsigned nDims, unsigned nBytes, unsigned nBits, int findMin, void* c1, void* c2); unsigned hilbert_ieee_box_vtx(unsigned nDims, int findMin, double* c1, double* c2); /***************************************************************** * hilbert_box_pt * * Determine the first or last point of a box to lie on a Hilbert curv +e * Inputs: * nDims: Number of coordinates. * nBytes: Number of bytes/coordinate. * nBits: Number of bits/coordinate. * findMin: Is it the least vertex sought? * coord1: Array of nDims nBytes-byte coordinates - one corner of + box * coord2: Array of nDims nBytes-byte coordinates - opposite corn +er * Output: * c1 and c2 modified to refer to least point * Assumptions: * nBits <= (sizeof bitmask_t) * (bits_per_byte) */ unsigned hilbert_box_pt(unsigned nDims, unsigned nBytes, unsigned nBits, int findMin, void* coord1, void* coord2); unsigned hilbert_ieee_box_pt(unsigned nDims, int findMin, double* c1, double* c2); /***************************************************************** * hilbert_nextinbox * * Determine the first point of a box after a given point to lie on a +Hilbert curve * Inputs: * nDims: Number of coordinates. * nBytes: Number of bytes/coordinate. * nBits: Number of bits/coordinate. * findPrev: Is the previous point sought? * coord1: Array of nDims nBytes-byte coordinates - one corner of + box * coord2: Array of nDims nBytes-byte coordinates - opposite corn +er * point: Array of nDims nBytes-byte coordinates - lower bound o +n point returned * * Output: if returns 1: * c1 and c2 modified to refer to least point after "point" in bo +x else returns 0: arguments unchanged; "point" is beyond the last point of the b +ox * Assumptions: * nBits <= (sizeof bitmask_t) * (bits_per_byte) */ int hilbert_nextinbox(unsigned nDims, unsigned nBytes, unsigned nBits, int findPrev, void* coord1, void* coord2, void const* point); /***************************************************************** * hilbert_incr * * Advance from one point to its successor on a Hilbert curve * Inputs: * nDims: Number of coordinates. * nBits: Number of bits/coordinate. * coord: Array of nDims nBits-bit coordinates. * Output: * coord: Next point on Hilbert curve * Assumptions: * nBits <= (sizeof bitmask_t) * (bits_per_byte) */ void hilbert_incr(unsigned nDims, unsigned nBits, bitmask_t coord[]);
/* define the bitmask_t type as an integer of sufficient size */ typedef unsigned long bitmask_t; /* define the halfmask_t type as an integer of 1/2 the size of bitmask +_t */ typedef unsigned long halfmask_t;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Need Help with perlxstut
by tachyon (Chancellor) on Sep 29, 2004 at 00:23 UTC |