11#ifndef PBAT_GEOMETRY_AXISALIGNEDBOUNDINGBOX_H
12#define PBAT_GEOMETRY_AXISALIGNEDBOUNDINGBOX_H
14#include <Eigen/Geometry>
28class AxisAlignedBoundingBox :
public Eigen::AlignedBox<Scalar, Dims>
31 using BaseType = Eigen::AlignedBox<Scalar, Dims>;
34 static auto constexpr kDims = Dims;
36 AxisAlignedBoundingBox() =
default;
42 AxisAlignedBoundingBox(
BaseType const& box);
47 AxisAlignedBoundingBox(
BaseType&& box);
68 template <
class TDerivedMin,
class TDerivedMax>
69 AxisAlignedBoundingBox(
70 Eigen::DenseBase<TDerivedMin>
const& min,
71 Eigen::DenseBase<TDerivedMax>
const& max);
78 template <
class TDerived>
79 AxisAlignedBoundingBox(Eigen::DenseBase<TDerived>
const& P);
86 template <
class TDerived>
87 std::vector<Index>
contained(Eigen::MatrixBase<TDerived>
const& P)
const;
91inline AxisAlignedBoundingBox<Dims>::AxisAlignedBoundingBox(
BaseType const& box)
97inline AxisAlignedBoundingBox<Dims>::AxisAlignedBoundingBox(
BaseType&& box)
117template <
class TDerivedMin,
class TDerivedMax>
118inline AxisAlignedBoundingBox<Dims>::AxisAlignedBoundingBox(
119 Eigen::DenseBase<TDerivedMin>
const& min,
120 Eigen::DenseBase<TDerivedMax>
const& max)
126template <
class TDerived>
127inline AxisAlignedBoundingBox<Dims>::AxisAlignedBoundingBox(Eigen::DenseBase<TDerived>
const& P)
128 :
BaseType(P.rowwise().minCoeff(), P.rowwise().maxCoeff())
133template <
class TDerived>
134inline std::vector<Index>
137 std::vector<Index> inds{};
138 inds.reserve(
static_cast<std::size_t
>(P.cols()));
139 for (
auto i = 0; i < P.cols(); ++i)
141 if (BaseType::template contains(P.col(i)))
143 inds.push_back(
static_cast<Index>(i));
163template <auto kDims, auto kClusterNodes,
class FCluster,
class TDerivedL,
class TDerivedU>
167 Eigen::DenseBase<TDerivedL>& L,
168 Eigen::DenseBase<TDerivedU>& U)
170 using MatrixType = std::invoke_result_t<FCluster, Index>;
171 for (
auto c = 0; c < nClusters; ++c)
173 MatrixType
const& XC = fCluster(c);
174 L.col(c).template head<kDims>() = XC.rowwise().minCoeff();
175 U.col(c).template head<kDims>() = XC.rowwise().maxCoeff();
191template <auto kDims, auto kClusterNodes,
class FCluster,
class TDerivedB>
194 using MatrixType = std::invoke_result_t<FCluster, Index>;
195 for (
auto c = 0; c < nClusters; ++c)
197 MatrixType
const& XC = fCluster(c);
198 B.col(c).template head<kDims>() = XC.rowwise().minCoeff();
199 B.col(c).template tail<kDims>() = XC.rowwise().maxCoeff();
225 Eigen::DenseBase<TDerivedX>
const& X,
226 Eigen::DenseBase<TDerivedE>
const& E,
227 Eigen::DenseBase<TDerivedL>& L,
228 Eigen::DenseBase<TDerivedU>& U)
232 return X(Eigen::placeholders::all, E.col(e))
233 .template topLeftCorner<kDims, kElemNodes>();
252template <auto kDims, auto kElemNodes,
class TDerivedX,
class TDerivedE,
class TDerivedB>
254 Eigen::DenseBase<TDerivedX>
const& X,
255 Eigen::DenseBase<TDerivedE>
const& E,
256 Eigen::DenseBase<TDerivedB>& B)
260 return X(Eigen::placeholders::all, E.col(e))
261 .template topLeftCorner<kDims, kElemNodes>();
static auto constexpr kDims
Number of dimensions.
Definition AxisAlignedBoundingBox.h:34
std::vector< Index > contained(Eigen::MatrixBase< TDerived > const &P) const
Get indices of points in P contained in the bounding box.
Definition AxisAlignedBoundingBox.h:135
AxisAlignedBoundingBox SelfType
Self type.
Definition AxisAlignedBoundingBox.h:32
AxisAlignedBoundingBox & operator=(BaseType const &box)
Copy assign AxisAlignedBoundingBox from Eigen::AlignedBox.
Definition AxisAlignedBoundingBox.h:103
Eigen::AlignedBox< Scalar, Dims > BaseType
Base type.
Definition AxisAlignedBoundingBox.h:31
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
void ClustersToAabbs(FCluster fCluster, Index nClusters, Eigen::DenseBase< TDerivedL > &L, Eigen::DenseBase< TDerivedU > &U)
Computes AABBs of nClusters kDims-dimensional point clusters.
Definition AxisAlignedBoundingBox.h:164
void MeshToAabbs(Eigen::DenseBase< TDerivedX > const &X, Eigen::DenseBase< TDerivedE > const &E, Eigen::DenseBase< TDerivedL > &L, Eigen::DenseBase< TDerivedU > &U)
Computes AABBs of nElemNodes simplex mesh elements in kDims dimensions.
Definition AxisAlignedBoundingBox.h:224
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17