| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899 |
- //
- // SPDX-License-Identifier: BSD-3-Clause
- // Copyright Contributors to the OpenEXR Project.
- //
- //
- // Axis-aligned bounding box
- //
- #ifndef INCLUDED_IMATHBOX_H
- #define INCLUDED_IMATHBOX_H
- #include "ImathExport.h"
- #include "ImathNamespace.h"
- #include "ImathVec.h"
- IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
- ///
- /// The `Box<V>` template represents an axis-aligned bounding box defined by
- /// minimum and maximum values of type `V`. The `min` and `max` members are
- /// public.
- ///
- /// The type `V` is typically an Imath vector (i.e. `V2i`, `V3f`, etc) and must
- /// implement an index `operator[]` that returns a type (typically as scalar)
- /// that supports assignment, comparison, and arithmetic operators.
- ///
- /// `V` must also provide a constructor that takes a float and/or double for
- /// use in initializing the box.
- ///
- /// `V` must also provide a function `V::dimensions()` which returns the
- /// number of dimensions in the class (since its assumed its a vector) --
- /// preferably, this returns a constant expression, typically 2 or 3.
- ///
- template <class V> class IMATH_EXPORT_TEMPLATE_TYPE Box
- {
- public:
- /// @{
- /// @name Direct access to bounds
-
- /// The minimum value of the box.
- V min;
- /// The maximum value of the box.
- V max;
- /// @}
- /// @{
- /// @name Constructors
- /// Construct an empty bounding box. This initializes the mimimum to
- /// std::numeric_limits<V::baseType>::max() and the maximum to
- /// std::numeric_limits<V::baseType>::lowest().
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box() IMATH_NOEXCEPT;
- /// Construct a bounding box that contains a single point.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const V& point) IMATH_NOEXCEPT;
- /// Construct a bounding box with the given minimum and maximum values.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const V& minV, const V& maxV) IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Comparison
-
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Box<V>& src) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Box<V>& src) const IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Manipulation
- /// Set the box to be empty. A box is empty if the mimimum is greater
- /// than the maximum. makeEmpty() sets the mimimum to `V::baseTypeMax()`
- /// and the maximum to `V::baseTypeLowest()`.
- IMATH_HOSTDEVICE void makeEmpty() IMATH_NOEXCEPT;
- /// Extend the box to include the given point.
- IMATH_HOSTDEVICE void extendBy (const V& point) IMATH_NOEXCEPT;
- /// Extend the box to include the given box.
- IMATH_HOSTDEVICE void extendBy (const Box<V>& box) IMATH_NOEXCEPT;
- /// Make the box include the entire range of `V`.
- IMATH_HOSTDEVICE void makeInfinite() IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Query
-
- /// Return the size of the box. The size is of type `V`, defined
- /// as `(max-min)`. An empty box has a size of `V(0)`, i.e. 0 in
- /// each dimension.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 V size() const IMATH_NOEXCEPT;
- /// Return the center of the box. The center is defined as
- /// `(max+min)/2`. The center of an empty box is undefined.
- IMATH_HOSTDEVICE constexpr V center() const IMATH_NOEXCEPT;
- /// Return true if the given point is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const V& point) const IMATH_NOEXCEPT;
- /// Return true if the given box is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const Box<V>& box) const IMATH_NOEXCEPT;
- /// Return the major axis of the box. The major axis is the dimension with
- /// the greatest difference between maximum and minimum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 unsigned int majorAxis() const IMATH_NOEXCEPT;
- /// Return true if the box is empty, false otherwise. An empty box's
- /// minimum is greater than its maximum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isEmpty() const IMATH_NOEXCEPT;
- /// Return true if the box is larger than a single point, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool hasVolume() const IMATH_NOEXCEPT;
- /// Return true if the box contains all points, false otherwise.
- /// An infinite box has a mimimum of`V::baseTypeLowest()`
- /// and a maximum of `V::baseTypeMax()`.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isInfinite() const IMATH_NOEXCEPT;
- /// @}
- };
- //--------------------
- // Convenient typedefs
- //--------------------
- /// 2D box of base type `short`.
- typedef Box<V2s> Box2s;
- /// 2D box of base type `int`.
- typedef Box<V2i> Box2i;
- /// 2D box of base type `int64_t`.
- typedef Box<V2i64> Box2i64;
- /// 2D box of base type `float`.
- typedef Box<V2f> Box2f;
- /// 2D box of base type `double`.
- typedef Box<V2d> Box2d;
- /// 3D box of base type `short`.
- typedef Box<V3s> Box3s;
- /// 3D box of base type `int`.
- typedef Box<V3i> Box3i;
- /// 3D box of base type `int64_t`.
- typedef Box<V3i64> Box3i64;
- /// 3D box of base type `float`.
- typedef Box<V3f> Box3f;
- /// 3D box of base type `double`.
- typedef Box<V3d> Box3d;
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<V>::Box() IMATH_NOEXCEPT
- {
- makeEmpty();
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<V>::Box (const V& point) IMATH_NOEXCEPT
- {
- min = point;
- max = point;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<V>::Box (const V& minV, const V& maxV) IMATH_NOEXCEPT
- {
- min = minV;
- max = maxV;
- }
- template <class V>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<V>::operator== (const Box<V>& src) const IMATH_NOEXCEPT
- {
- return (min == src.min && max == src.max);
- }
- template <class V>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<V>::operator!= (const Box<V>& src) const IMATH_NOEXCEPT
- {
- return (min != src.min || max != src.max);
- }
- template <class V>
- IMATH_HOSTDEVICE inline void
- Box<V>::makeEmpty() IMATH_NOEXCEPT
- {
- min = V (V::baseTypeMax());
- max = V (V::baseTypeLowest());
- }
- template <class V>
- IMATH_HOSTDEVICE inline void
- Box<V>::makeInfinite() IMATH_NOEXCEPT
- {
- min = V (V::baseTypeLowest());
- max = V (V::baseTypeMax());
- }
- template <class V>
- IMATH_HOSTDEVICE inline void
- Box<V>::extendBy (const V& point) IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (point[i] < min[i])
- min[i] = point[i];
- if (point[i] > max[i])
- max[i] = point[i];
- }
- }
- template <class V>
- IMATH_HOSTDEVICE inline void
- Box<V>::extendBy (const Box<V>& box) IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (box.min[i] < min[i])
- min[i] = box.min[i];
- if (box.max[i] > max[i])
- max[i] = box.max[i];
- }
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<V>::intersects (const V& point) const IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (point[i] < min[i] || point[i] > max[i])
- return false;
- }
- return true;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<V>::intersects (const Box<V>& box) const IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (box.max[i] < min[i] || box.min[i] > max[i])
- return false;
- }
- return true;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline V
- Box<V>::size() const IMATH_NOEXCEPT
- {
- if (isEmpty())
- return V (0);
- return max - min;
- }
- template <class V>
- IMATH_HOSTDEVICE constexpr inline V
- Box<V>::center() const IMATH_NOEXCEPT
- {
- return (max + min) / 2;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<V>::isEmpty() const IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (max[i] < min[i])
- return true;
- }
- return false;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<V>::isInfinite() const IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (min[i] != V::baseTypeLowest() || max[i] != V::baseTypeMax())
- return false;
- }
- return true;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<V>::hasVolume() const IMATH_NOEXCEPT
- {
- for (unsigned int i = 0; i < min.dimensions(); i++)
- {
- if (max[i] <= min[i])
- return false;
- }
- return true;
- }
- template <class V>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline unsigned int
- Box<V>::majorAxis() const IMATH_NOEXCEPT
- {
- unsigned int major = 0;
- V s = size();
- for (unsigned int i = 1; i < min.dimensions(); i++)
- {
- if (s[i] > s[major])
- major = i;
- }
- return major;
- }
- //-------------------------------------------------------------------
- //
- // Partial class specializations for Imath::Vec2<T> and Imath::Vec3<T>
- //
- //-------------------------------------------------------------------
- template <typename V> class Box;
- ///
- /// The Box<Vec2<T>> template represents a 2D bounding box defined by
- /// minimum and maximum values of type Vec2<T>. The min and max members are
- /// public.
- ///
- template <class T> class IMATH_EXPORT_TEMPLATE_TYPE Box<Vec2<T>>
- {
- public:
- /// @{
- /// @name Direct access to bounds
-
- /// The minimum value of the box.
- Vec2<T> min;
- /// The maximum value of the box.
- Vec2<T> max;
- /// @}
-
- /// @{
- /// @name Constructors and Assignment
- /// Empty by default
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box() IMATH_NOEXCEPT;
- /// Construct a bounding box that contains a single point.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const Vec2<T>& point) IMATH_NOEXCEPT;
- /// Construct a bounding box with the given minimum and maximum points
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const Vec2<T>& minT, const Vec2<T>& maxT) IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Comparison
-
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Box<Vec2<T>>& src) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Box<Vec2<T>>& src) const IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Manipulation
- /// Set the Box to be empty. A Box is empty if the mimimum is
- /// greater than the maximum. makeEmpty() sets the mimimum to
- /// std::numeric_limits<T>::max() and the maximum to
- /// std::numeric_limits<T>::lowest().
- IMATH_HOSTDEVICE void makeEmpty() IMATH_NOEXCEPT;
- /// Extend the Box to include the given point.
- IMATH_HOSTDEVICE void extendBy (const Vec2<T>& point) IMATH_NOEXCEPT;
- /// Extend the Box to include the given box.
- IMATH_HOSTDEVICE void extendBy (const Box<Vec2<T>>& box) IMATH_NOEXCEPT;
- /// Make the box include the entire range of T.
- IMATH_HOSTDEVICE void makeInfinite() IMATH_NOEXCEPT;
- /// @}
- /// @{
- /// @name Query
-
- /// Return the size of the box. The size is of type `V`, defined as
- /// `(max-min)`. An empty box has a size of `V(0)`, i.e. 0 in each dimension.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Vec2<T> size() const IMATH_NOEXCEPT;
- /// Return the center of the box. The center is defined as
- /// `(max+min)/2`. The center of an empty box is undefined.
- IMATH_HOSTDEVICE constexpr Vec2<T> center() const IMATH_NOEXCEPT;
- /// Return true if the given point is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const Vec2<T>& point) const IMATH_NOEXCEPT;
- /// Return true if the given box is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const Box<Vec2<T>>& box) const IMATH_NOEXCEPT;
- /// Return the major axis of the box. The major axis is the dimension with
- /// the greatest difference between maximum and minimum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 unsigned int majorAxis() const IMATH_NOEXCEPT;
- /// Return true if the box is empty, false otherwise. An empty box's
- /// minimum is greater than its maximum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isEmpty() const IMATH_NOEXCEPT;
- /// Return true if the box is larger than a single point, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool hasVolume() const IMATH_NOEXCEPT;
- /// Return true if the box contains all points, false otherwise.
- /// An infinite box has a mimimum of `V::baseTypeMin()`
- /// and a maximum of `V::baseTypeMax()`.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isInfinite() const IMATH_NOEXCEPT;
- /// @}
- };
- //----------------
- // Implementation
- //----------------
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec2<T>>::Box() IMATH_NOEXCEPT
- {
- makeEmpty();
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec2<T>>::Box (const Vec2<T>& point) IMATH_NOEXCEPT
- {
- min = point;
- max = point;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec2<T>>::Box (const Vec2<T>& minT, const Vec2<T>& maxT) IMATH_NOEXCEPT
- {
- min = minT;
- max = maxT;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<Vec2<T>>::operator== (const Box<Vec2<T>>& src) const IMATH_NOEXCEPT
- {
- return (min == src.min && max == src.max);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<Vec2<T>>::operator!= (const Box<Vec2<T>>& src) const IMATH_NOEXCEPT
- {
- return (min != src.min || max != src.max);
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec2<T>>::makeEmpty() IMATH_NOEXCEPT
- {
- min = Vec2<T> (Vec2<T>::baseTypeMax());
- max = Vec2<T> (Vec2<T>::baseTypeLowest());
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec2<T>>::makeInfinite() IMATH_NOEXCEPT
- {
- min = Vec2<T> (Vec2<T>::baseTypeLowest());
- max = Vec2<T> (Vec2<T>::baseTypeMax());
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec2<T>>::extendBy (const Vec2<T>& point) IMATH_NOEXCEPT
- {
- if (point[0] < min[0])
- min[0] = point[0];
- if (point[0] > max[0])
- max[0] = point[0];
- if (point[1] < min[1])
- min[1] = point[1];
- if (point[1] > max[1])
- max[1] = point[1];
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec2<T>>::extendBy (const Box<Vec2<T>>& box) IMATH_NOEXCEPT
- {
- if (box.min[0] < min[0])
- min[0] = box.min[0];
- if (box.max[0] > max[0])
- max[0] = box.max[0];
- if (box.min[1] < min[1])
- min[1] = box.min[1];
- if (box.max[1] > max[1])
- max[1] = box.max[1];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec2<T>>::intersects (const Vec2<T>& point) const IMATH_NOEXCEPT
- {
- if (point[0] < min[0] || point[0] > max[0] || point[1] < min[1] || point[1] > max[1])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec2<T>>::intersects (const Box<Vec2<T>>& box) const IMATH_NOEXCEPT
- {
- if (box.max[0] < min[0] || box.min[0] > max[0] || box.max[1] < min[1] || box.min[1] > max[1])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Vec2<T>
- Box<Vec2<T>>::size() const IMATH_NOEXCEPT
- {
- if (isEmpty())
- return Vec2<T> (0);
- return max - min;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Vec2<T>
- Box<Vec2<T>>::center() const IMATH_NOEXCEPT
- {
- return (max + min) / 2;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec2<T>>::isEmpty() const IMATH_NOEXCEPT
- {
- if (max[0] < min[0] || max[1] < min[1])
- return true;
- return false;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec2<T>>::isInfinite() const IMATH_NOEXCEPT
- {
- if (min[0] != std::numeric_limits<T>::lowest() ||
- max[0] != std::numeric_limits<T>::max() ||
- min[1] != std::numeric_limits<T>::lowest() ||
- max[1] != std::numeric_limits<T>::max())
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec2<T>>::hasVolume() const IMATH_NOEXCEPT
- {
- if (max[0] <= min[0] || max[1] <= min[1])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline unsigned int
- Box<Vec2<T>>::majorAxis() const IMATH_NOEXCEPT
- {
- unsigned int major = 0;
- Vec2<T> s = size();
- if (s[1] > s[major])
- major = 1;
- return major;
- }
- ///
- /// The Box<Vec3> template represents a 3D bounding box defined by
- /// minimum and maximum values of type Vec3.
- ///
- template <class T> class IMATH_EXPORT_TEMPLATE_TYPE Box<Vec3<T>>
- {
- public:
- /// @{
- /// @name Direct access to bounds
-
- /// The minimum value of the box.
- Vec3<T> min;
- /// The maximum value of the box.
- Vec3<T> max;
- /// @}
- /// @{
- /// @name Constructors
- /// Empty by default
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box() IMATH_NOEXCEPT;
- /// Construct a bounding box that contains a single point.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const Vec3<T>& point) IMATH_NOEXCEPT;
- /// Construct a bounding box with the given minimum and maximum points
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Box (const Vec3<T>& minT, const Vec3<T>& maxT) IMATH_NOEXCEPT;
- /// @}
- /// Equality
- IMATH_HOSTDEVICE constexpr bool operator== (const Box<Vec3<T>>& src) const IMATH_NOEXCEPT;
- /// Inequality
- IMATH_HOSTDEVICE constexpr bool operator!= (const Box<Vec3<T>>& src) const IMATH_NOEXCEPT;
- /// Set the Box to be empty. A Box is empty if the mimimum is
- /// greater than the maximum. makeEmpty() sets the mimimum to
- /// std::numeric_limits<T>::max() and the maximum to
- /// std::numeric_limits<T>::lowest().
- IMATH_HOSTDEVICE void makeEmpty() IMATH_NOEXCEPT;
- /// Extend the Box to include the given point.
- IMATH_HOSTDEVICE void extendBy (const Vec3<T>& point) IMATH_NOEXCEPT;
- /// Extend the Box to include the given box.
- IMATH_HOSTDEVICE void extendBy (const Box<Vec3<T>>& box) IMATH_NOEXCEPT;
- /// Make the box include the entire range of T.
- IMATH_HOSTDEVICE void makeInfinite() IMATH_NOEXCEPT;
- /// Return the size of the box. The size is of type `V`, defined as
- /// (max-min). An empty box has a size of V(0), i.e. 0 in each dimension.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Vec3<T> size() const IMATH_NOEXCEPT;
- /// Return the center of the box. The center is defined as
- /// (max+min)/2. The center of an empty box is undefined.
- IMATH_HOSTDEVICE constexpr Vec3<T> center() const IMATH_NOEXCEPT;
- /// Return true if the given point is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const Vec3<T>& point) const IMATH_NOEXCEPT;
- /// Return true if the given box is inside the box, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool intersects (const Box<Vec3<T>>& box) const IMATH_NOEXCEPT;
- /// Return the major axis of the box. The major axis is the dimension with
- /// the greatest difference between maximum and minimum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 unsigned int majorAxis() const IMATH_NOEXCEPT;
- /// Return true if the box is empty, false otherwise. An empty box's
- /// minimum is greater than its maximum.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isEmpty() const IMATH_NOEXCEPT;
- /// Return true if the box is larger than a single point, false otherwise.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool hasVolume() const IMATH_NOEXCEPT;
- /// Return true if the box contains all points, false otherwise.
- /// An infinite box has a mimimum of`V::baseTypeMin()`
- /// and a maximum of `V::baseTypeMax()`.
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 bool isInfinite() const IMATH_NOEXCEPT;
- };
- //----------------
- // Implementation
- //----------------
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec3<T>>::Box() IMATH_NOEXCEPT
- {
- makeEmpty();
- }
- template <class T> IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec3<T>>::Box (const Vec3<T>& point) IMATH_NOEXCEPT
- {
- min = point;
- max = point;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Box<Vec3<T>>::Box (const Vec3<T>& minT, const Vec3<T>& maxT) IMATH_NOEXCEPT
- {
- min = minT;
- max = maxT;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<Vec3<T>>::operator== (const Box<Vec3<T>>& src) const IMATH_NOEXCEPT
- {
- return (min == src.min && max == src.max);
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline bool
- Box<Vec3<T>>::operator!= (const Box<Vec3<T>>& src) const IMATH_NOEXCEPT
- {
- return (min != src.min || max != src.max);
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec3<T>>::makeEmpty() IMATH_NOEXCEPT
- {
- min = Vec3<T> (Vec3<T>::baseTypeMax());
- max = Vec3<T> (Vec3<T>::baseTypeLowest());
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec3<T>>::makeInfinite() IMATH_NOEXCEPT
- {
- min = Vec3<T> (Vec3<T>::baseTypeLowest());
- max = Vec3<T> (Vec3<T>::baseTypeMax());
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec3<T>>::extendBy (const Vec3<T>& point) IMATH_NOEXCEPT
- {
- if (point[0] < min[0])
- min[0] = point[0];
- if (point[0] > max[0])
- max[0] = point[0];
- if (point[1] < min[1])
- min[1] = point[1];
- if (point[1] > max[1])
- max[1] = point[1];
- if (point[2] < min[2])
- min[2] = point[2];
- if (point[2] > max[2])
- max[2] = point[2];
- }
- template <class T>
- IMATH_HOSTDEVICE inline void
- Box<Vec3<T>>::extendBy (const Box<Vec3<T>>& box) IMATH_NOEXCEPT
- {
- if (box.min[0] < min[0])
- min[0] = box.min[0];
- if (box.max[0] > max[0])
- max[0] = box.max[0];
- if (box.min[1] < min[1])
- min[1] = box.min[1];
- if (box.max[1] > max[1])
- max[1] = box.max[1];
- if (box.min[2] < min[2])
- min[2] = box.min[2];
- if (box.max[2] > max[2])
- max[2] = box.max[2];
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec3<T>>::intersects (const Vec3<T>& point) const IMATH_NOEXCEPT
- {
- if (point[0] < min[0] || point[0] > max[0] || point[1] < min[1] || point[1] > max[1] ||
- point[2] < min[2] || point[2] > max[2])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec3<T>>::intersects (const Box<Vec3<T>>& box) const IMATH_NOEXCEPT
- {
- if (box.max[0] < min[0] || box.min[0] > max[0] || box.max[1] < min[1] || box.min[1] > max[1] ||
- box.max[2] < min[2] || box.min[2] > max[2])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline Vec3<T>
- Box<Vec3<T>>::size() const IMATH_NOEXCEPT
- {
- if (isEmpty())
- return Vec3<T> (0);
- return max - min;
- }
- template <class T>
- IMATH_HOSTDEVICE constexpr inline Vec3<T>
- Box<Vec3<T>>::center() const IMATH_NOEXCEPT
- {
- return (max + min) / 2;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec3<T>>::isEmpty() const IMATH_NOEXCEPT
- {
- if (max[0] < min[0] || max[1] < min[1] || max[2] < min[2])
- return true;
- return false;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec3<T>>::isInfinite() const IMATH_NOEXCEPT
- {
- if (min[0] != std::numeric_limits<T>::lowest() ||
- max[0] != std::numeric_limits<T>::max() ||
- min[1] != std::numeric_limits<T>::lowest() ||
- max[1] != std::numeric_limits<T>::max() ||
- min[2] != std::numeric_limits<T>::lowest() ||
- max[2] != std::numeric_limits<T>::max())
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline bool
- Box<Vec3<T>>::hasVolume() const IMATH_NOEXCEPT
- {
- if (max[0] <= min[0] || max[1] <= min[1] || max[2] <= min[2])
- return false;
- return true;
- }
- template <class T>
- IMATH_HOSTDEVICE IMATH_CONSTEXPR14 inline unsigned int
- Box<Vec3<T>>::majorAxis() const IMATH_NOEXCEPT
- {
- unsigned int major = 0;
- Vec3<T> s = size();
- if (s[1] > s[major])
- major = 1;
- if (s[2] > s[major])
- major = 2;
- return major;
- }
- IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
- #endif // INCLUDED_IMATHBOX_H
|