OpenVDB  6.2.0
Coord.h
Go to the documentation of this file.
1 //
3 // Copyright (c) DreamWorks Animation LLC
4 //
5 // All rights reserved. This software is distributed under the
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
7 //
8 // Redistributions of source code must retain the above copyright
9 // and license notice and the following restrictions and disclaimer.
10 //
11 // * Neither the name of DreamWorks Animation nor the names of
12 // its contributors may be used to endorse or promote products derived
13 // from this software without specific prior written permission.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
28 //
30 
31 #ifndef OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
32 #define OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
33 
34 #include <functional>// for std::hash
35 #include <algorithm> // for std::min(), std::max()
36 #include <array> // for std::array
37 #include <iostream>
38 #include <limits>
39 #include <openvdb/Platform.h>
40 #include "Math.h"
41 #include "Vec3.h"
42 
43 namespace tbb { class split; } // forward declaration
44 
45 
46 namespace openvdb {
48 namespace OPENVDB_VERSION_NAME {
49 namespace math {
50 
52 class Coord
53 {
54 public:
55  using Int32 = int32_t;
56  using Index32 = uint32_t;
57  using Vec3i = Vec3<Int32>;
59 
60  using ValueType = Int32;
61  using Limits = std::numeric_limits<ValueType>;
62 
63  Coord(): mVec{{0, 0, 0}} {}
64  explicit Coord(Int32 xyz): mVec{{xyz, xyz, xyz}} {}
65  Coord(Int32 x, Int32 y, Int32 z): mVec{{x, y, z}} {}
66  explicit Coord(const Vec3i& v): mVec{{v[0], v[1], v[2]}} {}
67  explicit Coord(const Vec3I& v): mVec{{Int32(v[0]), Int32(v[1]), Int32(v[2])}} {}
68  explicit Coord(const Int32* v): mVec{{v[0], v[1], v[2]}} {}
69 
71  static Coord min() { return Coord(Limits::min()); }
72 
74  static Coord max() { return Coord(Limits::max()); }
75 
78  template<typename T> static Coord round(const Vec3<T>& xyz)
79  {
80  return Coord(Int32(Round(xyz[0])), Int32(Round(xyz[1])), Int32(Round(xyz[2])));
81  }
84  template<typename T> static Coord floor(const Vec3<T>& xyz)
85  {
86  return Coord(Int32(Floor(xyz[0])), Int32(Floor(xyz[1])), Int32(Floor(xyz[2])));
87  }
88 
91  template<typename T> static Coord ceil(const Vec3<T>& xyz)
92  {
93  return Coord(Int32(Ceil(xyz[0])), Int32(Ceil(xyz[1])), Int32(Ceil(xyz[2])));
94  }
95 
98  {
99  mVec[0] = x;
100  mVec[1] = y;
101  mVec[2] = z;
102  return *this;
103  }
105  Coord& reset(Int32 xyz) { return this->reset(xyz, xyz, xyz); }
106 
107  Coord& setX(Int32 x) { mVec[0] = x; return *this; }
108  Coord& setY(Int32 y) { mVec[1] = y; return *this; }
109  Coord& setZ(Int32 z) { mVec[2] = z; return *this; }
110 
111  Coord& offset(Int32 dx, Int32 dy, Int32 dz)
112  {
113  mVec[0] += dx;
114  mVec[1] += dy;
115  mVec[2] += dz;
116  return *this;
117  }
118  Coord& offset(Int32 n) { return this->offset(n, n, n); }
119  Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
120  {
121  return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz);
122  }
123  Coord offsetBy(Int32 n) const { return offsetBy(n, n, n); }
124 
125  Coord& operator+=(const Coord& rhs)
126  {
127  mVec[0] += rhs[0];
128  mVec[1] += rhs[1];
129  mVec[2] += rhs[2];
130  return *this;
131  }
132  Coord& operator-=(const Coord& rhs)
133  {
134  mVec[0] -= rhs[0];
135  mVec[1] -= rhs[1];
136  mVec[2] -= rhs[2];
137  return *this;
138  }
139  Coord operator+(const Coord& rhs) const
140  {
141  return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]);
142  }
143  Coord operator-(const Coord& rhs) const
144  {
145  return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]);
146  }
147  Coord operator-() const { return Coord(-mVec[0], -mVec[1], -mVec[2]); }
148 
149  Coord operator>> (size_t n) const { return Coord(mVec[0]>>n, mVec[1]>>n, mVec[2]>>n); }
150  Coord operator<< (size_t n) const { return Coord(mVec[0]<<n, mVec[1]<<n, mVec[2]<<n); }
151  Coord& operator<<=(size_t n) { mVec[0]<<=n; mVec[1]<<=n; mVec[2]<<=n; return *this; }
152  Coord& operator>>=(size_t n) { mVec[0]>>=n; mVec[1]>>=n; mVec[2]>>=n; return *this; }
153  Coord operator& (Int32 n) const { return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); }
154  Coord operator| (Int32 n) const { return Coord(mVec[0] | n, mVec[1] | n, mVec[2] | n); }
155  Coord& operator&= (Int32 n) { mVec[0]&=n; mVec[1]&=n; mVec[2]&=n; return *this; }
156  Coord& operator|= (Int32 n) { mVec[0]|=n; mVec[1]|=n; mVec[2]|=n; return *this; }
157 
158  Int32 x() const { return mVec[0]; }
159  Int32 y() const { return mVec[1]; }
160  Int32 z() const { return mVec[2]; }
161  Int32 operator[](size_t i) const { assert(i < 3); return mVec[i]; }
162  Int32& x() { return mVec[0]; }
163  Int32& y() { return mVec[1]; }
164  Int32& z() { return mVec[2]; }
165  Int32& operator[](size_t i) { assert(i < 3); return mVec[i]; }
166 
167  const Int32* data() const { return mVec.data(); }
168  Int32* data() { return mVec.data(); }
169  const Int32* asPointer() const { return mVec.data(); }
170  Int32* asPointer() { return mVec.data(); }
171  Vec3d asVec3d() const { return Vec3d(double(mVec[0]), double(mVec[1]), double(mVec[2])); }
172  Vec3s asVec3s() const { return Vec3s(float(mVec[0]), float(mVec[1]), float(mVec[2])); }
173  Vec3i asVec3i() const { return Vec3i(mVec.data()); }
174  Vec3I asVec3I() const { return Vec3I(Index32(mVec[0]), Index32(mVec[1]), Index32(mVec[2])); }
175  void asXYZ(Int32& x, Int32& y, Int32& z) const { x = mVec[0]; y = mVec[1]; z = mVec[2]; }
176 
177  bool operator==(const Coord& rhs) const
178  {
179  return (mVec[0] == rhs.mVec[0] && mVec[1] == rhs.mVec[1] && mVec[2] == rhs.mVec[2]);
180  }
181  bool operator!=(const Coord& rhs) const { return !(*this == rhs); }
182 
184  bool operator<(const Coord& rhs) const
185  {
186  return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false
187  : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false
188  : this->z() < rhs.z() ? true : false;
189  }
191  bool operator<=(const Coord& rhs) const
192  {
193  return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false
194  : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false
195  : this->z() <=rhs.z() ? true : false;
196  }
198  bool operator>(const Coord& rhs) const { return !(*this <= rhs); }
200  bool operator>=(const Coord& rhs) const { return !(*this < rhs); }
201 
203  void minComponent(const Coord& other)
204  {
205  mVec[0] = std::min(mVec[0], other.mVec[0]);
206  mVec[1] = std::min(mVec[1], other.mVec[1]);
207  mVec[2] = std::min(mVec[2], other.mVec[2]);
208  }
209 
211  void maxComponent(const Coord& other)
212  {
213  mVec[0] = std::max(mVec[0], other.mVec[0]);
214  mVec[1] = std::max(mVec[1], other.mVec[1]);
215  mVec[2] = std::max(mVec[2], other.mVec[2]);
216  }
217 
219  static inline Coord minComponent(const Coord& lhs, const Coord& rhs)
220  {
221  return Coord(std::min(lhs.x(), rhs.x()),
222  std::min(lhs.y(), rhs.y()),
223  std::min(lhs.z(), rhs.z()));
224  }
225 
227  static inline Coord maxComponent(const Coord& lhs, const Coord& rhs)
228  {
229  return Coord(std::max(lhs.x(), rhs.x()),
230  std::max(lhs.y(), rhs.y()),
231  std::max(lhs.z(), rhs.z()));
232  }
233 
236  static inline bool lessThan(const Coord& a, const Coord& b)
237  {
238  return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]);
239  }
240 
242  size_t minIndex() const { return MinIndex(mVec); }
243 
245  size_t maxIndex() const { return MaxIndex(mVec); }
246 
247  void read(std::istream& is) { is.read(reinterpret_cast<char*>(mVec.data()), sizeof(mVec)); }
248  void write(std::ostream& os) const
249  {
250  os.write(reinterpret_cast<const char*>(mVec.data()), sizeof(mVec));
251  }
252 
257  template<int Log2N = 20>
258  size_t hash() const
259  {
260  return ((1<<Log2N)-1) & (mVec[0]*73856093 ^ mVec[1]*19349663 ^ mVec[2]*83492791);
261  }
262 
263 private:
264  std::array<Int32, 3> mVec;
265 }; // class Coord
266 
267 
269 
270 
276 {
277 public:
278  using Index64 = uint64_t;
280 
284  template<bool ZYXOrder>
285  class Iterator
286  {
287  public:
289  Iterator(const CoordBBox& b): mPos(b.min()), mMin(b.min()), mMax(b.max()) {}
293  Iterator& operator++() { ZYXOrder ? next<2,1,0>() : next<0,1,2>(); return *this; }
295  operator bool() const { return ZYXOrder ? (mPos[0] <= mMax[0]) : (mPos[2] <= mMax[2]); }
297  const Coord& operator*() const { return mPos; }
299  bool operator==(const Iterator& other) const
300  {
301  return ((mPos == other.mPos) && (mMin == other.mMin) && (mMax == other.mMax));
302  }
304  bool operator!=(const Iterator& other) const { return !(*this == other); }
305  private:
306  template<size_t a, size_t b, size_t c>
307  void next()
308  {
309  if (mPos[a] < mMax[a]) { ++mPos[a]; } // this is the most common case
310  else if (mPos[b] < mMax[b]) { mPos[a] = mMin[a]; ++mPos[b]; }
311  else if (mPos[c] <= mMax[c]) { mPos[a] = mMin[a]; mPos[b] = mMin[b]; ++mPos[c]; }
312  }
313  Coord mPos, mMin, mMax;
314  friend class CoordBBox; // for CoordBBox::end()
315  };// CoordBBox::Iterator
316 
317  using ZYXIterator = Iterator</*ZYX=*/true>;
318  using XYZIterator = Iterator</*ZYX=*/false>;
319 
321  CoordBBox(): mMin(Coord::max()), mMax(Coord::min()) {}
323  CoordBBox(const Coord& min, const Coord& max): mMin(min), mMax(max) {}
326  ValueType xMax, ValueType yMax, ValueType zMax)
327  : mMin(xMin, yMin, zMin), mMax(xMax, yMax, zMax)
328  {
329  }
332  CoordBBox(CoordBBox& other, const tbb::split&): mMin(other.mMin), mMax(other.mMax)
333  {
334  assert(this->is_divisible());
335  const size_t n = this->maxExtent();
336  mMax[n] = (mMin[n] + mMax[n]) >> 1;
337  other.mMin[n] = mMax[n] + 1;
338  }
339 
340  static CoordBBox createCube(const Coord& min, ValueType dim)
341  {
342  return CoordBBox(min, min.offsetBy(dim - 1));
343  }
344 
346  static CoordBBox inf() { return CoordBBox(Coord::min(), Coord::max()); }
347 
348  const Coord& min() const { return mMin; }
349  const Coord& max() const { return mMax; }
350 
351  Coord& min() { return mMin; }
352  Coord& max() { return mMax; }
353 
354  void reset() { mMin = Coord::max(); mMax = Coord::min(); }
355  void reset(const Coord& min, const Coord& max) { mMin = min; mMax = max; }
356  void resetToCube(const Coord& min, ValueType dim) { mMin = min; mMax = min.offsetBy(dim - 1); }
357 
360  Coord getStart() const { return mMin; }
363  Coord getEnd() const { return mMax.offsetBy(1); }
364 
366  ZYXIterator begin() const { return ZYXIterator{*this}; }
368  ZYXIterator beginZYX() const { return ZYXIterator{*this}; }
370  XYZIterator beginXYZ() const { return XYZIterator{*this}; }
371 
373  ZYXIterator end() const { ZYXIterator it{*this}; it.mPos[0] = mMax[0] + 1; return it; }
375  ZYXIterator endZYX() const { return end(); }
377  XYZIterator endXYZ() const { XYZIterator it{*this}; it.mPos[2] = mMax[2] + 1; return it; }
378 
379  bool operator==(const CoordBBox& rhs) const { return mMin == rhs.mMin && mMax == rhs.mMax; }
380  bool operator!=(const CoordBBox& rhs) const { return !(*this == rhs); }
381 
383  bool empty() const
384  {
385 #if defined(__GNUC__) && !defined(__INTEL_COMPILER)
386  #pragma GCC diagnostic push
387  #pragma GCC diagnostic ignored "-Wstrict-overflow"
388 #endif
389  return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]);
390 #if defined(__GNUC__) && !defined(__INTEL_COMPILER)
391  #pragma GCC diagnostic pop
392 #endif
393  }
396  operator bool() const { return !this->empty(); }
399  bool hasVolume() const { return !this->empty(); }
400 
402  Vec3d getCenter() const { return 0.5 * Vec3d((mMin + mMax).asPointer()); }
403 
407  Coord dim() const { return empty() ? Coord(0) : (mMax.offsetBy(1) - mMin); }
409  Coord extents() const { return this->dim(); }
412  Index64 volume() const
413  {
414  const Coord d = this->dim();
415  return Index64(d[0]) * Index64(d[1]) * Index64(d[2]);
416  }
418  bool is_divisible() const { return mMin[0]<mMax[0] && mMin[1]<mMax[1] && mMin[2]<mMax[2]; }
419 
421  size_t minExtent() const { return this->dim().minIndex(); }
422 
424  size_t maxExtent() const { return this->dim().maxIndex(); }
425 
427  bool isInside(const Coord& xyz) const
428  {
429  return !(Coord::lessThan(xyz,mMin) || Coord::lessThan(mMax,xyz));
430  }
431 
433  bool isInside(const CoordBBox& b) const
434  {
435  return !(Coord::lessThan(b.mMin,mMin) || Coord::lessThan(mMax,b.mMax));
436  }
437 
439  bool hasOverlap(const CoordBBox& b) const
440  {
441  return !(Coord::lessThan(mMax,b.mMin) || Coord::lessThan(b.mMax,mMin));
442  }
443 
445  void expand(ValueType padding)
446  {
447  mMin.offset(-padding);
448  mMax.offset( padding);
449  }
450 
452  CoordBBox expandBy(ValueType padding) const
453  {
454  return CoordBBox(mMin.offsetBy(-padding),mMax.offsetBy(padding));
455  }
456 
458  void expand(const Coord& xyz)
459  {
460  mMin.minComponent(xyz);
461  mMax.maxComponent(xyz);
462  }
463 
465  void expand(const CoordBBox& bbox)
466  {
467  mMin.minComponent(bbox.min());
468  mMax.maxComponent(bbox.max());
469  }
471  void intersect(const CoordBBox& bbox)
472  {
473  mMin.maxComponent(bbox.min());
474  mMax.minComponent(bbox.max());
475  }
478  void expand(const Coord& min, Coord::ValueType dim)
479  {
480  mMin.minComponent(min);
481  mMax.maxComponent(min.offsetBy(dim-1));
482  }
485  void translate(const Coord& t) { mMin += t; mMax += t; }
486 
488  void moveMin(const Coord& min) { mMax += min - mMin; mMin = min; }
489 
491  void moveMax(const Coord& max) { mMin += max - mMax; mMax = max; }
492 
497  void getCornerPoints(Coord *p) const
498  {
499  assert(p != nullptr);
500  p->reset(mMin.x(), mMin.y(), mMin.z()); ++p;
501  p->reset(mMin.x(), mMin.y(), mMax.z()); ++p;
502  p->reset(mMin.x(), mMax.y(), mMin.z()); ++p;
503  p->reset(mMin.x(), mMax.y(), mMax.z()); ++p;
504  p->reset(mMax.x(), mMin.y(), mMin.z()); ++p;
505  p->reset(mMax.x(), mMin.y(), mMax.z()); ++p;
506  p->reset(mMax.x(), mMax.y(), mMin.z()); ++p;
507  p->reset(mMax.x(), mMax.y(), mMax.z());
508  }
509 
511  CoordBBox operator>> (size_t n) const { return CoordBBox(mMin>>n, mMax>>n); }
513  CoordBBox operator<< (size_t n) const { return CoordBBox(mMin<<n, mMax<<n); }
514  CoordBBox& operator<<=(size_t n) { mMin <<= n; mMax <<= n; return *this; }
515  CoordBBox& operator>>=(size_t n) { mMin >>= n; mMax >>= n; return *this; }
516  CoordBBox operator& (Coord::Int32 n) const { return CoordBBox(mMin & n, mMax & n); }
517  CoordBBox operator| (Coord::Int32 n) const { return CoordBBox(mMin | n, mMax | n); }
518  CoordBBox& operator&= (Coord::Int32 n) { mMin &= n; mMax &= n; return *this; }
519  CoordBBox& operator|= (Coord::Int32 n) { mMin |= n; mMax |= n; return *this; }
521 
523  void read(std::istream& is) { mMin.read(is); mMax.read(is); }
525  void write(std::ostream& os) const { mMin.write(os); mMax.write(os); }
526 
527 private:
528  Coord mMin, mMax;
529 }; // class CoordBBox
530 
531 
533 
534 
535 inline std::ostream& operator<<(std::ostream& os, const Coord& xyz)
536 {
537  os << xyz.asVec3i(); return os;
538 }
539 
540 
541 inline Coord
542 Abs(const Coord& xyz)
543 {
544  return Coord(Abs(xyz[0]), Abs(xyz[1]), Abs(xyz[2]));
545 }
546 
547 
549 template<typename T>
552 operator+(const Vec3<T>& v0, const Coord& v1)
553 {
555  result[0] += v1[0];
556  result[1] += v1[1];
557  result[2] += v1[2];
558  return result;
559 }
560 
561 template<typename T>
563 operator+(const Coord& v1, const Vec3<T>& v0)
564 {
566  result[0] += v1[0];
567  result[1] += v1[1];
568  result[2] += v1[2];
569  return result;
570 }
572 
573 
575 template <typename T>
578 operator-(const Vec3<T>& v0, const Coord& v1)
579 {
581  result[0] -= v1[0];
582  result[1] -= v1[1];
583  result[2] -= v1[2];
584  return result;
585 }
586 
587 template <typename T>
589 operator-(const Coord& v1, const Vec3<T>& v0)
590 {
592  result[0] -= v1[0];
593  result[1] -= v1[1];
594  result[2] -= v1[2];
595  return -result;
596 }
598 
599 inline std::ostream&
600 operator<<(std::ostream& os, const CoordBBox& b)
601 {
602  os << b.min() << " -> " << b.max();
603  return os;
604 }
605 
606 } // namespace math
607 } // namespace OPENVDB_VERSION_NAME
608 } // namespace openvdb
609 
611 
612 // template specialization of std::hash with Coord, which
613 // allows for Coord to be used as the key in std::unordered_map
614 namespace std {// injected in namespace std
615 
616 template<>
617 struct hash<openvdb::math::Coord>
618 {
619  using Coord = openvdb::math::Coord;
621  using result_type = std::size_t;
622  std::size_t operator()(const Coord& ijk) const noexcept { return ijk.Coord::hash<>(); }
623 };// std::hash<openvdb::math::Coord>
624 
625 }// namespace std
626 
627 #endif // OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
628 
629 // Copyright (c) DreamWorks Animation LLC
630 // All rights reserved. This software is distributed under the
631 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
void getCornerPoints(Coord *p) const
Populates an array with the eight corner points of this bounding box.
Definition: Coord.h:497
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:119
Coord offsetBy(Int32 n) const
Definition: Coord.h:123
ZYXIterator begin() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:366
Int32 * asPointer()
Definition: Coord.h:170
Coord & setX(Int32 x)
Definition: Coord.h:107
void read(std::istream &is)
Definition: Coord.h:247
void translate(const Coord &t)
Translate this bounding box by (tx, ty, tz).
Definition: Coord.h:485
Coord & operator-=(const Coord &rhs)
Definition: Coord.h:132
ZYXIterator end() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:373
bool operator==(const Iterator &other) const
Return true if this iterator and the given iterator point to the same coordinate. ...
Definition: Coord.h:299
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
size_t minIndex() const
Return the index (0, 1 or 2) with the smallest value.
Definition: Coord.h:242
uint32_t Index32
Definition: Coord.h:56
Coord Abs(const Coord &xyz)
Definition: Coord.h:542
void expand(const Coord &min, Coord::ValueType dim)
Union this bounding box with the cubical bounding box of the given size and with the given minimum co...
Definition: Coord.h:478
Int32 z() const
Definition: Coord.h:160
Vec3< typename promote< T, typename Coord::ValueType >::type > operator+(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be added to or subtracted from a Vec3.
Definition: Coord.h:563
Int32 * data()
Definition: Coord.h:168
const std::enable_if<!VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:133
Coord getEnd() const
Return the maximum coordinate plus one.
Definition: Coord.h:363
Coord operator+(const Coord &rhs) const
Definition: Coord.h:139
static Coord floor(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz (node centered conversion)...
Definition: Coord.h:84
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:52
Coord(const Int32 *v)
Definition: Coord.h:68
Int32 y() const
Definition: Coord.h:159
CoordBBox()
The default constructor produces an empty bounding box.
Definition: Coord.h:321
const Coord & min() const
Definition: Coord.h:348
Int32 & operator[](size_t i)
Definition: Coord.h:165
Vec3d getCenter() const
Return the floating-point position of the center of this bounding box.
Definition: Coord.h:402
bool operator!=(const CoordBBox &rhs) const
Definition: Coord.h:380
Index64 volume() const
Return the integer volume of coordinates spanned by this bounding box.
Definition: Coord.h:412
float Round(float x)
Return x rounded to the nearest integer.
Definition: Math.h:793
Int32 & y()
Definition: Coord.h:163
const Coord & max() const
Definition: Coord.h:349
Definition: Coord.h:614
Coord dim() const
Return the dimensions of the coordinates spanned by this bounding box.
Definition: Coord.h:407
ZYXIterator endZYX() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:375
static Coord ceil(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz+1 (node centered conversion)...
Definition: Coord.h:91
size_t maxExtent() const
Return the index (0, 1 or 2) of the longest axis.
Definition: Coord.h:424
Coord argument_type
Definition: Coord.h:620
Vec3< int32_t > Vec3i
Definition: Vec3.h:686
const Coord & operator*() const
Return a const reference to the coordinate currently pointed to.
Definition: Coord.h:297
Coord(Int32 x, Int32 y, Int32 z)
Definition: Coord.h:65
Coord::ValueType ValueType
Definition: Coord.h:279
static Coord maxComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise maximum of the two Coords.
Definition: Coord.h:227
Coord getStart() const
Return the minimum coordinate.
Definition: Coord.h:360
Vec3< typename promote< T, Coord::ValueType >::type > operator-(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be subtracted from a Vec3.
Definition: Coord.h:589
bool operator<=(const Coord &rhs) const
Lexicographic less than or equal to.
Definition: Coord.h:191
Int32 & z()
Definition: Coord.h:164
void reset(const Coord &min, const Coord &max)
Definition: Coord.h:355
Coord & min()
Definition: Coord.h:351
Coord()
Definition: Coord.h:63
Vec3< double > Vec3d
Definition: Vec3.h:689
Int32 & x()
Definition: Coord.h:162
Coord operator-() const
Definition: Coord.h:147
Int32 operator[](size_t i) const
Definition: Coord.h:161
Coord(const Vec3i &v)
Definition: Coord.h:66
void reset()
Definition: Coord.h:354
bool operator<(const Coord &rhs) const
Lexicographic less than.
Definition: Coord.h:184
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:910
Definition: Mat.h:197
uint64_t Index64
Definition: Coord.h:278
void expand(const CoordBBox &bbox)
Union this bounding box with the given bounding box.
Definition: Coord.h:465
Iterator & operator++()
Increment the iterator to point to the next coordinate.
Definition: Coord.h:293
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:128
bool operator==(const CoordBBox &rhs) const
Definition: Coord.h:379
Coord & offset(Int32 dx, Int32 dy, Int32 dz)
Definition: Coord.h:111
bool hasOverlap(const CoordBBox &b) const
Return true if the given bounding box overlaps with this bounding box.
Definition: Coord.h:439
Vec3s asVec3s() const
Definition: Coord.h:172
std::size_t result_type
Definition: Coord.h:621
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:275
ZYXIterator beginZYX() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:368
Coord & operator+=(const Coord &rhs)
Definition: Coord.h:125
Coord(Int32 xyz)
Definition: Coord.h:64
bool operator!=(const Coord &rhs) const
Definition: Coord.h:181
void maxComponent(const Coord &other)
Perform a component-wise maximum with the other Coord.
Definition: Coord.h:211
Int32 ValueType
Definition: Coord.h:60
Definition: Exceptions.h:40
bool operator>=(const Coord &rhs) const
Lexicographic greater than or equal to.
Definition: Coord.h:200
void moveMax(const Coord &max)
Move this bounding box to the specified max.
Definition: Coord.h:491
const Int32 * asPointer() const
Definition: Coord.h:169
void write(std::ostream &os) const
Serialize this bounding box to the given stream.
Definition: Coord.h:525
size_t hash() const
Return a hash value for this coordinate.
Definition: Coord.h:258
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: Coord.h:523
CoordBBox & operator<<=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:514
XYZIterator endXYZ() const
Return an XYZ-order iterator that points past the maximum coordinate.
Definition: Coord.h:377
Iterator(const CoordBBox &b)
C-tor from a bounding box.
Definition: Coord.h:289
Vec3< float > Vec3s
Definition: Vec3.h:688
void moveMin(const Coord &min)
Move this bounding box to the specified min.
Definition: Coord.h:488
Vec3d asVec3d() const
Definition: Coord.h:171
uint64_t Index64
Definition: Types.h:60
Coord & reset(Int32 xyz)
Reset all three coordinates with the same specified argument.
Definition: Coord.h:105
bool operator!=(const Iterator &other) const
Return true if this iterator and the given iterator point to different coordinates.
Definition: Coord.h:304
Coord & offset(Int32 n)
Definition: Coord.h:118
CoordBBox(CoordBBox &other, const tbb::split &)
Splitting constructor for use in TBB ranges.
Definition: Coord.h:332
CoordBBox expandBy(ValueType padding) const
Return a new instance that is expanded by the specified padding.
Definition: Coord.h:452
static Coord min()
Return the smallest possible coordinate.
Definition: Coord.h:71
Vec3I asVec3I() const
Definition: Coord.h:174
bool operator==(const Coord &rhs) const
Definition: Coord.h:177
CoordBBox(const Coord &min, const Coord &max)
Construct a bounding box with the given min and max bounds.
Definition: Coord.h:323
bool is_divisible() const
Return true if this bounding box can be subdivided [mainly for use by TBB].
Definition: Coord.h:418
XYZIterator beginXYZ() const
Return an XYZ-order iterator that points to the minimum coordinate.
Definition: Coord.h:370
static Coord minComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise minimum of the two Coords.
Definition: Coord.h:219
const std::enable_if<!VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:129
bool isInside(const CoordBBox &b) const
Return true if the given bounding box is inside this bounding box.
Definition: Coord.h:433
Coord & reset(Int32 x, Int32 y, Int32 z)
Reset all three coordinates with the specified arguments.
Definition: Coord.h:97
void expand(ValueType padding)
Pad this bounding box with the specified padding.
Definition: Coord.h:445
Coord & max()
Definition: Coord.h:352
static Coord round(const Vec3< T > &xyz)
Return xyz rounded to the closest integer coordinates (cell centered conversion). ...
Definition: Coord.h:78
Coord(const Vec3I &v)
Definition: Coord.h:67
openvdb::math::Coord Coord
Definition: Coord.h:619
Coord operator-(const Coord &rhs) const
Definition: Coord.h:143
Definition: Coord.h:43
Coord extents() const
Definition: Coord.h:409
void resetToCube(const Coord &min, ValueType dim)
Definition: Coord.h:356
int32_t Int32
Definition: Coord.h:55
static CoordBBox inf()
Return an "infinite" bounding box, as defined by the Coord value range.
Definition: Coord.h:346
size_t minExtent() const
Return the index (0, 1 or 2) of the shortest axis.
Definition: Coord.h:421
Vec3i asVec3i() const
Definition: Coord.h:173
CoordBBox(ValueType xMin, ValueType yMin, ValueType zMin, ValueType xMax, ValueType yMax, ValueType zMax)
Construct from individual components of the min and max bounds.
Definition: Coord.h:325
void minComponent(const Coord &other)
Perform a component-wise minimum with the other Coord.
Definition: Coord.h:203
std::numeric_limits< ValueType > Limits
Definition: Coord.h:61
static Coord max()
Return the largest possible coordinate.
Definition: Coord.h:74
bool empty() const
Return true if this bounding box is empty (i.e., encloses no coordinates).
Definition: Coord.h:383
static bool lessThan(const Coord &a, const Coord &b)
Definition: Coord.h:236
int32_t Int32
Definition: Types.h:63
void intersect(const CoordBBox &bbox)
Intersect this bounding box with the given bounding box.
Definition: Coord.h:471
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:180
void expand(const Coord &xyz)
Expand this bounding box to enclose point (x, y, z).
Definition: Coord.h:458
bool operator>(const Coord &rhs) const
Lexicographic greater than.
Definition: Coord.h:198
bool isInside(const Coord &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: Coord.h:427
Iterator over the Coord domain covered by a CoordBBox.
Definition: Coord.h:285
Coord & operator<<=(size_t n)
Definition: Coord.h:151
void write(std::ostream &os) const
Definition: Coord.h:248
Coord & operator>>=(size_t n)
Definition: Coord.h:152
Int32 x() const
Definition: Coord.h:158
const Int32 * data() const
Definition: Coord.h:167
int Ceil(float x)
Return the ceiling of x.
Definition: Math.h:830
std::ostream & operator<<(std::ostream &os, const CoordBBox &b)
Definition: Coord.h:600
static CoordBBox createCube(const Coord &min, ValueType dim)
Definition: Coord.h:340
bool hasVolume() const
Return true if this bounding box is nonempty (i.e., encloses at least one coordinate).
Definition: Coord.h:399
uint32_t Index32
Definition: Types.h:59
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:931
std::size_t operator()(const Coord &ijk) const noexcept
Definition: Coord.h:622
void asXYZ(Int32 &x, Int32 &y, Int32 &z) const
Definition: Coord.h:175
math::Vec3< Index32 > Vec3I
Definition: Types.h:80
Coord & setY(Int32 y)
Definition: Coord.h:108
Coord & setZ(Int32 z)
Definition: Coord.h:109
int Floor(float x)
Return the floor of x.
Definition: Math.h:822
CoordBBox & operator>>=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:515
size_t maxIndex() const
Return the index (0, 1 or 2) with the largest value.
Definition: Coord.h:245