diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-03-11 14:21:55 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-03-11 14:21:55 +0000 |
commit | 02e97ac0ae8dabba3167b2fdc503633ae2c8f5e3 (patch) | |
tree | e7f177b94c78e68ddab70a800c712e1ce1df0eb4 /Eigen/src | |
parent | b8f46090ff9980f08a33c854acecca2be396e090 (diff) |
minor changes in AlignedBox needed for BVH module
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Geometry/AlignedBox.h | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/Eigen/src/Geometry/AlignedBox.h b/Eigen/src/Geometry/AlignedBox.h index 14ec9261e..64e66a6ba 100644 --- a/Eigen/src/Geometry/AlignedBox.h +++ b/Eigen/src/Geometry/AlignedBox.h @@ -41,7 +41,7 @@ template <typename _Scalar, int _AmbientDim> class AlignedBox { public: -EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1) +EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim) enum { AmbientDimAtCompileTime = _AmbientDim }; typedef _Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; @@ -85,6 +85,9 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== /** \returns a non const reference to the maximal corner */ inline VectorType& max() { return m_max; } + /** \returns the center of the box */ + inline VectorType center() const { return (m_min + m_max) / 2; } + /** \returns true if the point \a p is inside the box \c *this. */ inline bool contains(const VectorType& p) const { return (m_min.cwise()<=p).all() && (p.cwise()<=m_max).all(); } @@ -105,6 +108,14 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== inline AlignedBox& clamp(const AlignedBox& b) { m_min = m_min.cwise().max(b.m_min); m_max = m_max.cwise().min(b.m_max); return *this; } + /** Returns an AlignedBox that is the intersection of \a b and \c *this */ + inline AlignedBox intersection(const AlignedBox &b) const + { return AlignedBox(m_min.cwise().max(b.m_min), m_max.cwise().min(b.m_max)); } + + /** Returns an AlignedBox that is the union of \a b and \c *this */ + inline AlignedBox merged(const AlignedBox &b) const + { return AlignedBox(m_min.cwise().min(b.m_min), m_max.cwise().max(b.m_max)); } + /** Translate \c *this by the vector \a t and returns a reference to \c *this. */ inline AlignedBox& translate(const VectorType& t) { m_min += t; m_max += t; return *this; } @@ -115,6 +126,12 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== */ inline Scalar squaredExteriorDistance(const VectorType& p) const; + /** \returns the squared distance between the boxes \a b and \c *this, + * and zero if the boxes intersect. + * \sa exteriorDistance() + */ + inline Scalar squaredExteriorDistance(const AlignedBox& b) const; + /** \returns the distance between the point \a p and the box \c *this, * and zero if \a p is inside the box. * \sa squaredExteriorDistance() @@ -122,6 +139,13 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== inline Scalar exteriorDistance(const VectorType& p) const { return ei_sqrt(squaredExteriorDistance(p)); } + /** \returns the distance between the boxes \a b and \c *this, + * and zero if the boxes intersect. + * \sa squaredExteriorDistance() + */ + inline Scalar exteriorDistance(const AlignedBox& b) const + { return ei_sqrt(squaredExteriorDistance(b)); } + /** \returns \c *this with scalar type casted to \a NewScalarType * * Note that if \a NewScalarType is equal to the current scalar type of \c *this @@ -170,4 +194,19 @@ inline Scalar AlignedBox<Scalar,AmbiantDim>::squaredExteriorDistance(const Vecto return dist2; } +template<typename Scalar,int AmbiantDim> +inline Scalar AlignedBox<Scalar,AmbiantDim>::squaredExteriorDistance(const AlignedBox& b) const +{ + Scalar dist2 = 0.; + Scalar aux; + for (int k=0; k<dim(); ++k) + { + if ((aux = (b.m_min[k]-m_max[k]))>0.) + dist2 += aux*aux; + else if ( (aux = (m_min[k]-b.m_max[k]))>0. ) + dist2 += aux*aux; + } + return dist2; +} + #endif // EIGEN_ALIGNEDBOX_H |