00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VOXCOORD_H
00018 #define VOXCOORD_H
00019
00020 #include <stdint.h>
00021 #include <camvox/Vector.h>
00022
00023 namespace camvox {
00024
00045 class VoxCoord {
00046 public:
00047 uint32_t v[3];
00048 int depth;
00049
00052 VoxCoord(void) {
00053 v[0] = 0;
00054 v[1] = 0;
00055 v[2] = 0;
00056 depth = 0;
00057 }
00058
00061 VoxCoord(const VoxCoord &a) {
00062 v[0] = a.v[0];
00063 v[1] = a.v[1];
00064 v[2] = a.v[2];
00065 depth = a.depth;
00066 }
00067
00070 VoxCoord &operator=(const VoxCoord &a) {
00071 v[0] = a.v[0];
00072 v[1] = a.v[1];
00073 v[2] = a.v[2];
00074 depth = a.depth;
00075 return *this;
00076 }
00077
00087 VoxCoord nextNeighbour(int x, int y, int z) const {
00088 VoxCoord r = *this;
00089
00090 uint32_t movement = 0x80000000 >> depth;
00091 r.v[0]+= movement * x;
00092 r.v[1]+= movement * y;
00093 r.v[2]+= movement * z;
00094 return r;
00095 }
00096
00101 VoxCoord childCoord(int child_index) const {
00102 VoxCoord r = *this;
00103 r.depth++;
00104
00105 return r.nextNeighbour(child_index & 1, (child_index >> 1) & 1, (child_index >> 2) & 1);
00106 }
00107
00112 IntervalVector boundingBox(double scale) const {
00113 VoxCoord opposite = nextNeighbour(1, 1, 1);
00114
00115 IntervalVector r = IntervalVector(
00116 Interval(v[0] * scale, opposite.v[0] * scale),
00117 Interval(v[1] * scale, opposite.v[1] * scale),
00118 Interval(v[2] * scale, opposite.v[2] * scale),
00119 1.0
00120 );
00121
00122
00123 return r;
00124 }
00125
00129 double size(double scale) const {
00130 return (0x80000000 >> depth) * scale;
00131 }
00132 };
00133
00134 }
00135 #endif