15#ifndef AABBTREE_BOX_HXX
16#define AABBTREE_BOX_HXX
27template <
typename Real, Integer N>
class Ray;
50template <
typename Real, Integer N>
class Box {
51 static_assert(std::is_floating_point<Real>::value,
52 "Box Real type must be a floating-point type.");
53 static_assert(N > 0,
"Box dimension must be positive.");
108 template <
typename = std::enable_if<N == 1>>
120 template <
typename = std::enable_if<N == 2>>
121 Box(Real
const x_min, Real
const y_min, Real
const x_max, Real
const y_max)
135 template <
typename = std::enable_if<N == 3>>
136 Box(Real
const x_min, Real
const y_min, Real
const z_min, Real
const x_max,
137 Real
const y_max, Real
const z_max)
138 :
m_min(x_min, y_min, z_min),
m_max(x_max, y_max, z_max) {}
146 template <
typename OtherReal>
165 if constexpr (std::is_same<Real, NewReal>::value) {
201 for (
Integer i{0}; i < N; ++i) {
223 Real
const tol = Eigen::NumTraits<Real>::dummy_precision())
const {
233 Real
const tol = Eigen::NumTraits<Real>::dummy_precision())
const {
243 return std::distance(sizes.data(),
244 std::max_element(sizes.data(), sizes.data() + N));
256 for (
Integer i{0}; i < N; ++i) {
257 if (Real
const tmp_length{
m_max(i) -
m_min(i)}; max_length < tmp_length) {
258 max_length = tmp_length;
273 ipos = Eigen::Vector<Integer, N>::LinSpaced(N, 0, N - 1);
274 std::sort(ipos.data(), ipos.data() + N,
304 for (
Integer i{0}; i < N; ++i) {
334 m_min.setConstant(+std::numeric_limits<Real>::infinity());
335 m_max.setConstant(-std::numeric_limits<Real>::infinity());
346 for (
int d = 0; d <
m_min.size(); ++d)
358 return (
m_min.template head<d>().array() <=
359 b.
m_max.template head<d>().array())
361 (b.
m_min.template head<d>().array() <=
362 m_max.template head<d>().array())
375 return (b_out.
m_min.array() <= b_out.
m_max.array()).all();
448 Real
const x_min{
m_min(dim)};
449 Real
const x_max{
m_max(dim)};
450 bool const on_left{x_max < x + tol};
451 bool const on_right{x - tol < x_min};
452 if (on_left && on_right) {
454 }
else if (on_left) {
456 }
else if (on_right) {
469 return (
m_min.array() <= p.array()).all() &&
470 (p.array() <=
m_max.array()).all();
480 return (
m_min.array() <= p.array()).all() &&
481 (p.array() <=
m_max.array()).all();
492 return (
m_min.template head<d>().array() <= p.template head<d>().array()) &&
493 (p.template head<d>().array() <=
m_max.template head<d>().array());
502 return (
m_min.array() <= b.
m_min.array()).all() &&
539 for (
Integer i{0}; i < N; ++i) {
540 if (
m_min[i] > p[i]) {
541 Real aux{
m_min[i] - p[i]};
543 }
else if (p[i] >
m_max[i]) {
544 Real aux{p[i] -
m_max[i]};
565 return (p - c).squaredNorm();
603 for (
Integer i{0}; i < N; ++i) {
604 Real
const aux1{std::abs(
m_min[i] - p[i])};
605 Real
const aux2{std::abs(
m_max[i] - p[i])};
606 Real
const aux3{std::max(aux1, aux2)};
607 dist2 += aux3 * aux3;
622 for (
Integer i{0}; i < N; ++i) {
623 Real
const aux1{std::abs(
m_min[i] - p[i])};
624 Real
const aux2{std::abs(
m_max[i] - p[i])};
627 return (f - p).squaredNorm();
667 for (
Integer i{0}; i < N; ++i) {
694 for (
Integer i{0}; i < N; ++i) {
702 p1[i] = p2[i] = 0.5 * (std::min(
m_max[i], b.
m_max[i]) +
706 return (p2 - p1).squaredNorm();
745 for (
Integer i{0}; i < N; ++i) {
746 Real
const aux{std::max(
m_max[i], b.
m_max[i]) -
764 return (p2 - p1).squaredNorm();
800 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
813 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
828 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
845 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
860 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
877 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
892 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
907 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
922 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
939 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
947 void print(std::ostream &os)
const {
948 os <<
"BOX INFO" << std::endl
949 <<
"\tmin = " <<
m_min.transpose() << std::endl
950 <<
"\tmax = " <<
m_max.transpose() << std::endl;
962template <
typename Real, Integer N>
A class representing an axis-aligned bounding box (AABB) in N-dimensional space.
Definition Box.hxx:50
Box & extend(Point const &p)
Definition Box.hxx:511
Box()
Definition Box.hxx:76
Real squared_interior_distance(Box const &b) const
Definition Box.hxx:663
Box & extend(Box const &b)
Definition Box.hxx:523
Point m_max
Definition Box.hxx:63
Box transformed(Transform const &t) const
Definition Box.hxx:413
Real squared_exterior_distance(Point const &p) const
Definition Box.hxx:601
void set_degenerate(Point const &p)
Definition Box.hxx:325
bool is_empty() const
Definition Box.hxx:213
Real squared_exterior_distance(Ray< Real, N > const &r, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:890
bool quasi_intersects(Point const &p) const
Definition Box.hxx:491
bool is_approx(Box const &b, Real const tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:222
Real squared_interior_distance(Ray< Real, N > const &r, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:843
Box(Real const x_min, Real const y_min, Real const z_min, Real const x_max, Real const y_max, Real const z_max)
Definition Box.hxx:136
Real squared_exterior_distance(Ray< Real, N > const &r, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:905
Real exterior_distance(Ray< Real, N > const &r, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:937
Real squared_exterior_distance(Box const &b, Point &p1, Point &p2) const
Definition Box.hxx:761
Real interior_distance(Ray< Real, N > const &r, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:858
Real baricenter(Integer i) const
Definition Box.hxx:289
void reorder()
Definition Box.hxx:200
void set_empty()
Definition Box.hxx:333
bool is_degenerate(Real const tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:232
bool contains(Box const &b) const
Definition Box.hxx:501
Box(Real const x_min, Real const y_min, Real const x_max, Real const y_max)
Definition Box.hxx:121
Real exterior_distance(Box const &b) const
Definition Box.hxx:775
Real surface() const
Definition Box.hxx:301
Box & translate(Vector const &t)
Definition Box.hxx:392
Side which_side(Real const x, Real const tol, Integer const dim) const
Definition Box.hxx:447
Real squared_exterior_distance(Point const &p, Point &f) const
Definition Box.hxx:621
Box(Real const x_min, Real const x_max)
Definition Box.hxx:109
Box< NewReal, N > cast() const
Definition Box.hxx:164
Real squared_interior_distance(Point const &p) const
Definition Box.hxx:537
Real squared_interior_distance(Box const &b, Point &p1, Point &p2) const
Definition Box.hxx:690
Real interior_distance(Point const &p) const
Definition Box.hxx:576
bool intersects(Ray< Real, N > const &r, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:799
Real exterior_distance(Point const &p) const
Definition Box.hxx:638
void sort_axes_length(Vector &sizes, Eigen::Vector< Integer, N > &ipos) const
Definition Box.hxx:271
Box & operator=(Box const &b)=default
Real squared_interior_distance(Ray< Real, N > const &r, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:826
bool contains(Point const &p) const
Definition Box.hxx:468
Real interior_distance(Point const &p, Point &c) const
Definition Box.hxx:589
Point const & min() const
Definition Box.hxx:176
Box & transform(Transform const &t)
Definition Box.hxx:427
AABBtree::BoxUniquePtrList< Real, N > BoxUniquePtrList
Definition Box.hxx:58
Box(Box const &b)
Definition Box.hxx:82
AABBtree::Vector< Real, N > Vector
Definition Box.hxx:56
Real squared_interior_distance(Point const &p, Point &c) const
Definition Box.hxx:561
Box(Point const &p)
Definition Box.hxx:99
bool quasi_intersects(Box const &b) const
Definition Box.hxx:357
Point baricenter() const
Definition Box.hxx:282
bool intersect(Box const &b_in, Box &b_out) const
Definition Box.hxx:372
AABBtree::BoxUniquePtr< Real, N > BoxUniquePtr
Definition Box.hxx:57
Real interior_distance(Ray< Real, N > const &r, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:875
Integer longest_axis() const
Definition Box.hxx:241
bool intersect(Ray< Real, N > const &r, Point &c, Point &f, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:812
AABBtree::Point< Real, N > Point
Definition Box.hxx:55
Side
Definition Box.hxx:437
@ RIGHT
Definition Box.hxx:437
@ INSIDE
Definition Box.hxx:437
@ LEFT
Definition Box.hxx:437
Real squared_exterior_distance(Box const &b) const
Definition Box.hxx:743
Box(Point const &t_min, Point const &t_max)
Definition Box.hxx:93
Point m_min
Definition Box.hxx:61
Integer longest_axis(Real &max_length, Real &mid_point) const
Definition Box.hxx:253
Point & min()
Definition Box.hxx:182
Point & max()
Definition Box.hxx:194
Real exterior_distance(Ray< Real, N > const &r, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Box.hxx:920
Vector diagonal() const
Definition Box.hxx:319
Real interior_distance(Box const &b) const
Definition Box.hxx:717
void print(std::ostream &os) const
Definition Box.hxx:947
bool intersects(Box const &b) const
Definition Box.hxx:343
bool intersects(Point const &p) const
Definition Box.hxx:479
Real exterior_distance(Box const &b, Point &p1, Point &p2) const
Definition Box.hxx:789
Real exterior_distance(Point const &p, Point &f) const
Definition Box.hxx:651
Point const & max() const
Definition Box.hxx:188
Real interior_distance(Box const &b, Point &p1, Point &p2) const
Definition Box.hxx:731
Real volume() const
Definition Box.hxx:295
Box(Box< OtherReal, N > const &b)
Definition Box.hxx:147
Box translated(Vector const &t) const
Definition Box.hxx:403
Box merged(Box const &b) const
Definition Box.hxx:383
A mathematical ray in N-dimensional space.
Definition Ray.hxx:38
Real interior_distance(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:479
bool intersect(Box< Real, N > const &b, Point &c, Point &f, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:286
Real squared_exterior_distance(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:512
bool intersects(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:252
Real squared_interior_distance(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:381
Real exterior_distance(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:608
Namespace for the AABBtree library.
Definition AABBtree.hh:81
Eigen::Vector< Real, N > Point
Definition AABBtree.hh:105
std::ostream & operator<<(std::ostream &os, Box< Real, N > const &b)
Definition Box.hxx:963
std::unique_ptr< Box< Real, N > > BoxUniquePtr
Definition AABBtree.hh:101
std::vector< BoxUniquePtr< Real, N > > BoxUniquePtrList
Definition AABBtree.hh:103
Eigen::Vector< Real, N > Vector
Definition AABBtree.hh:104
AABBTREE_DEFAULT_INTEGER_TYPE Integer
The Integer type used in the AABBtree class.
Definition AABBtree.hh:89