| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef BINARY_NODE_INCLUDED |
| #define BINARY_NODE_INCLUDED |
|
|
| class BinaryNode |
| { |
| public: |
| static inline int CenterCount( int depth ) { return 1<<depth; } |
| static inline int CornerCount( int depth ) { return (1<<depth)+1; } |
| static inline int CumulativeCenterCount( int maxDepth ) { return (1<<(maxDepth+1))-1; } |
| static inline int CumulativeCornerCount( int maxDepth ) { return (1<<(maxDepth+1))+maxDepth; } |
| static inline int CenterIndex( int depth , int offSet ) { return (1<<depth)+offSet-1; } |
| static inline int CornerIndex( int depth , int offSet ) { return (1<<depth)+offSet-1+depth; } |
|
|
| static inline int CornerIndex( int maxDepth , int depth , int offSet , int forwardCorner ){ return (offSet+forwardCorner)<<(maxDepth-depth); } |
| template< class Real > static inline Real Width( int depth ){ return Real(1.0/(1<<depth)); } |
| template< class Real > static inline void CenterAndWidth( int depth , int offset , Real& center , Real& width ){ width = Real (1.0/(1<<depth) ) , center = Real((0.5+offset)*width); } |
| template< class Real > static inline void CornerAndWidth( int depth , int offset , Real& corner , Real& width ){ width = Real(1.0/(1<<depth) ) , corner = Real(offset*width); } |
| template< class Real > static inline void CenterAndWidth( int idx , Real& center , Real& width ) |
| { |
| int depth , offset; |
| CenterDepthAndOffset( idx , depth , offset ); |
| CenterAndWidth( depth , offset , center , width ); |
| } |
| template< class Real > static inline void CornerAndWidth( int idx , Real& corner , Real& width ) |
| { |
| int depth , offset; |
| CornerDepthAndOffset( idx , depth , offset ); |
| CornerAndWidth( depth , offset , corner , width ); |
| } |
| static inline void CenterDepthAndOffset( int idx , int& depth , int& offset ) |
| { |
| offset = idx , depth = 0; |
| while( offset>=(1<<depth) ) offset -= (1<<depth) , depth++; |
| } |
| static inline void CornerDepthAndOffset( int idx , int& depth , int& offset ) |
| { |
| offset = idx , depth = 0; |
| while( offset>=( (1<<depth)+1 ) ) offset -= ( (1<<depth)+1 ) , depth++; |
| } |
| }; |
|
|
| #endif |
|
|