15#ifndef AABBTREE_RAY_HXX
16#define AABBTREE_RAY_HXX
38template <
typename Real, Integer N>
class Ray {
39 static_assert(std::is_floating_point<Real>::value,
40 "Ray Real type must be a floating-point type.");
41 static_assert(N > 0,
"Ray dimension must be positive.");
85 template <
typename = std::enable_if<N == 1>>
97 template <
typename = std::enable_if<N == 2>>
98 Ray(Real
const o_x, Real
const o_y, Real
const d_x, Real
const d_y)
112 template <
typename = std::enable_if<N == 3>>
113 Ray(Real
const o_x, Real
const o_y, Real
const o_z, Real
const d_x,
114 Real
const d_y, Real
const d_z)
122 template <
typename OtherReal>
134 if constexpr (std::is_same<Real, NewReal>::value) {
187 Real
const tol = Eigen::NumTraits<Real>::dummy_precision())
const {
240 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
242 return std::abs(v.cross(
m_direction).norm()) < tol &&
253 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
260 t_min.setConstant(-std::numeric_limits<Real>::infinity());
261 t_max.setConstant(std::numeric_limits<Real>::infinity());
262 for (
Integer i{0}; i < N; ++i) {
266 if (t_min[i] > t_max[i]) {
267 std::swap(t_min[i], t_max[i]);
273 Real t_entry{t_min.maxCoeff()};
274 Real t_exit{t_max.minCoeff()};
275 return t_entry <= t_exit && t_exit >= -tol;
287 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
294 t_min.setConstant(-std::numeric_limits<Real>::infinity());
295 t_max.setConstant(std::numeric_limits<Real>::infinity());
296 for (
Integer i{0}; i < N; ++i) {
300 if (t_min[i] > t_max[i]) {
301 std::swap(t_min[i], t_max[i]);
307 Real t_entry{t_min.maxCoeff()};
308 Real t_exit{t_max.minCoeff()};
309 if (t_entry > t_exit && t_exit < -tol) {
325 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
341 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
345 return (c - p).squaredNorm();
355 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
368 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
383 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
401 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
410 t_min.setConstant(-std::numeric_limits<Real>::infinity());
411 t_max.setConstant(std::numeric_limits<Real>::infinity());
412 for (
Integer i{0}; i < N; ++i) {
416 if (t_min[i] > t_max[i]) {
417 std::swap(t_min[i], t_max[i]);
422 Vector sides{b_max - b_min};
424 for (
Integer j{0}; j < N; ++j) {
429 p1[j] += 0.5 * sides[j];
430 p2[j] += 0.5 * sides[j];
432 p1[j] -= 0.5 * sides[j];
433 p2[j] -= 0.5 * sides[j];
441 Real t_entry{t_min.maxCoeff()}, t_exit{t_max.minCoeff()};
442 if (t_entry <= t_exit && t_exit >= 0.0) {
447 for (
Integer i{0}; i < N; ++i) {
450 }
else if (
m_origin[i] > b_max[i]) {
467 return (p2 - p1).squaredNorm();
481 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
498 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
514 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
530 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
539 t_min.setConstant(-std::numeric_limits<Real>::infinity());
540 t_max.setConstant(std::numeric_limits<Real>::infinity());
541 for (
Integer i{0}; i < N; ++i) {
545 if (t_min[i] > t_max[i]) {
546 std::swap(t_min[i], t_max[i]);
551 Vector sides{b_max - b_min};
553 for (
Integer j{0}; j < N; ++j) {
558 p1[j] -= 0.5 * sides[j];
559 p2[j] -= 0.5 * sides[j];
561 p1[j] += 0.5 * sides[j];
562 p2[j] += 0.5 * sides[j];
570 Real t_entry{t_min.maxCoeff()}, t_exit{t_max.minCoeff()};
571 if (t_entry <= t_exit && t_exit >= 0) {
576 for (
Integer i{0}; i < N; ++i) {
579 }
else if (
m_origin[i] > b_max[i]) {
596 return (p2 - p1).squaredNorm();
610 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
627 Real tol = Eigen::NumTraits<Real>::dummy_precision())
const {
635 void print(std::ostream &os)
const {
636 os <<
"RAY INFO" << std::endl
637 <<
"\to = " <<
m_origin.transpose() << std::endl
638 <<
"\td = " <<
m_direction.transpose() << std::endl;
650template <
typename Real, Integer N>
A class representing an axis-aligned bounding box (AABB) in N-dimensional space.
Definition Box.hxx:50
Real interior_distance(Point const &p) const
Definition Box.hxx:576
Real exterior_distance(Point const &p) const
Definition Box.hxx:638
bool contains(Point const &p) const
Definition Box.hxx:468
Point const & min() const
Definition Box.hxx:176
Point const & max() const
Definition Box.hxx:188
A mathematical ray in N-dimensional space.
Definition Ray.hxx:38
Real distance(Point const &p, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:354
Point const & origin() const
Definition Ray.hxx:151
void print(std::ostream &os) const
Definition Ray.hxx:635
Real interior_distance(Box< Real, N > const &b, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:496
Vector const & direction() const
Definition Ray.hxx:163
AABBtree::Point< Real, N > Point
Definition Ray.hxx:43
Real interior_distance(Box< Real, N > const &b, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:479
Vector m_direction
Definition Ray.hxx:47
Ray(Ray const &r)
Definition Ray.hxx:69
Ray & transform(Transform const &t)
Definition Ray.hxx:227
bool contains(Point const &p, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:239
bool is_approx(Ray const &r, Real const tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:186
Ray translated(Vector const &t) const
Definition Ray.hxx:207
Real squared_distance(Point const &p, Point &c, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:340
Ray normalized() const
Definition Ray.hxx:178
Real squared_interior_distance(Box< Real, N > const &b, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:399
Ray(Ray< OtherReal, N > const &r)
Definition Ray.hxx:123
Ray transformed(Transform const &t) const
Definition Ray.hxx:217
Vector & direction()
Definition Ray.hxx:157
Ray(Point const &o, Vector const &d)
Definition Ray.hxx:76
AABBtree::Vector< Real, N > Vector
Definition Ray.hxx:44
Ray(Real const o, Real const d)
Definition Ray.hxx:86
Ray< NewReal, N > cast() const
Definition Ray.hxx:133
Point & origin()
Definition Ray.hxx:145
Real squared_exterior_distance(Box< Real, N > const &b, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:528
Point m_origin
Definition Ray.hxx:46
Ray(Real const o_x, Real const o_y, Real const o_z, Real const d_x, Real const d_y, Real const d_z)
Definition Ray.hxx:113
Real distance(Point const &p, Point &c, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:367
Ray & normalize()
Definition Ray.hxx:169
bool intersect(Box< Real, N > const &b, Point &c, Point &f, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:286
Ray(Real const o_x, Real const o_y, Real const d_x, Real const d_y)
Definition Ray.hxx:98
Real squared_distance(Point const &p, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:324
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
Real exterior_distance(Box< Real, N > const &b, Point &p1, Point &p2, Real tol=Eigen::NumTraits< Real >::dummy_precision()) const
Definition Ray.hxx:625
Ray & translate(Vector const &t)
Definition Ray.hxx:197
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
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