Jet  v1.3.3
bvh2.h
Go to the documentation of this file.
1 // Copyright (c) 2019 Doyub Kim
2 //
3 // I am making my contributions/submissions to this project solely in my
4 // personal capacity and am not conveying any rights to any intellectual
5 // property of any third parties.
6 
7 #ifndef INCLUDE_JET_BVH2_H_
8 #define INCLUDE_JET_BVH2_H_
9 
12 
13 #include <vector>
14 
15 namespace jet {
16 
25 template <typename T>
26 class Bvh2 final : public IntersectionQueryEngine2<T>,
27  public NearestNeighborQueryEngine2<T> {
28  public:
29  using ContainerType = std::vector<T>;
30  using Iterator = typename ContainerType::iterator;
31  using ConstIterator = typename ContainerType::const_iterator;
32 
34  Bvh2();
35 
37  void build(const std::vector<T>& items,
38  const std::vector<BoundingBox2D>& itemsBounds);
39 
41  void clear();
42 
46  const Vector2D& pt,
47  const NearestNeighborDistanceFunc2<T>& distanceFunc) const override;
48 
50  bool intersects(const BoundingBox2D& box,
51  const BoxIntersectionTestFunc2<T>& testFunc) const override;
52 
54  bool intersects(const Ray2D& ray,
55  const RayIntersectionTestFunc2<T>& testFunc) const override;
56 
59  const BoundingBox2D& box, const BoxIntersectionTestFunc2<T>& testFunc,
60  const IntersectionVisitorFunc2<T>& visitorFunc) const override;
61 
64  const Ray2D& ray, const RayIntersectionTestFunc2<T>& testFunc,
65  const IntersectionVisitorFunc2<T>& visitorFunc) const override;
66 
69  const Ray2D& ray,
70  const GetRayIntersectionFunc2<T>& testFunc) const override;
71 
73  const BoundingBox2D& boundingBox() const;
74 
77 
80 
83 
85  ConstIterator end() const;
86 
88  size_t numberOfItems() const;
89 
91  const T& item(size_t i) const;
92 
94  size_t numberOfNodes() const;
95 
97  std::pair<size_t, size_t> children(size_t i) const;
98 
100  bool isLeaf(size_t i) const;
101 
103  const BoundingBox2D& nodeBound(size_t i) const;
104 
106  Iterator itemOfNode(size_t i);
107 
109  ConstIterator itemOfNode(size_t i) const;
110 
111  private:
112  struct Node {
113  char flags;
114  union {
115  size_t child;
116  size_t item;
117  };
118  BoundingBox2D bound;
119 
120  Node();
121  void initLeaf(size_t it, const BoundingBox2D& b);
122  void initInternal(uint8_t axis, size_t c, const BoundingBox2D& b);
123  bool isLeaf() const;
124  };
125 
126  BoundingBox2D _bound;
127  ContainerType _items;
128  std::vector<BoundingBox2D> _itemBounds;
129  std::vector<Node> _nodes;
130 
131  size_t build(size_t nodeIndex, size_t* itemIndices, size_t nItems,
132  size_t currentDepth);
133 
134  size_t qsplit(size_t* itemIndices, size_t numItems, double pivot,
135  uint8_t axis);
136 };
137 } // namespace jet
138 
139 #include "detail/bvh2-inl.h"
140 
141 #endif // INCLUDE_JET_BVH2_H_
jet::IntersectionQueryEngine2
Abstract base class for 2-D intersection test query engine.
Definition: intersection_query_engine2.h:48
nearest_neighbor_query_engine2.h
jet::Bvh2::nodeBound
const BoundingBox2D & nodeBound(size_t i) const
Returns bounding box of i-th node.
jet::Bvh2::end
Iterator end()
Returns the end iterator of the item.
jet::Bvh2::nearest
NearestNeighborQueryResult2< T > nearest(const Vector2D &pt, const NearestNeighborDistanceFunc2< T > &distanceFunc) const override
jet::Bvh2::item
const T & item(size_t i) const
Returns the item at i.
jet::Bvh2::begin
Iterator begin()
Returns the begin iterator of the item.
jet::Bvh2::intersects
bool intersects(const BoundingBox2D &box, const BoxIntersectionTestFunc2< T > &testFunc) const override
Returns true if given box intersects with any of the stored items.
jet::Ray< T, 2 >
Class for 2-D ray.
Definition: ray2.h:21
jet::Bvh2::end
ConstIterator end() const
Returns the immutable end iterator of the item.
jet::Bvh2::numberOfNodes
size_t numberOfNodes() const
Returns the number of nodes.
jet::BoundingBox2D
BoundingBox2< double > BoundingBox2D
Double-type 2-D BoundingBox.
Definition: bounding_box2.h:124
jet::NearestNeighborQueryResult2
Nearest neighbor query result.
Definition: nearest_neighbor_query_engine2.h:19
jet::Bvh2::clear
void clear()
Clears all the contents of this instance.
jet::Bvh2::Bvh2
Bvh2()
Default constructor.
jet::Bvh2::build
void build(const std::vector< T > &items, const std::vector< BoundingBox2D > &itemsBounds)
Builds bounding volume hierarchy.
jet
Definition: advection_solver2.h:18
jet::BoxIntersectionTestFunc2
std::function< bool(const T &, const BoundingBox2D &)> BoxIntersectionTestFunc2
Box-item intersection test function.
Definition: intersection_query_engine2.h:32
intersection_query_engine2.h
jet::Bvh2::isLeaf
bool isLeaf(size_t i) const
Returns true if i-th node is a leaf node.
jet::Bvh2::intersects
bool intersects(const Ray2D &ray, const RayIntersectionTestFunc2< T > &testFunc) const override
Returns true if given ray intersects with any of the stored items.
jet::Bvh2< Surface2Ptr >::ContainerType
std::vector< Surface2Ptr > ContainerType
Definition: bvh2.h:29
jet::Bvh2::itemOfNode
ConstIterator itemOfNode(size_t i) const
Returns item of i-th node.
jet::Vector< T, 2 >
2-D vector class.
Definition: vector2.h:24
jet::NearestNeighborQueryEngine2
Abstract base class for 2-D nearest neigbor query engine.
Definition: nearest_neighbor_query_engine2.h:31
jet::Bvh2< Surface2Ptr >::ConstIterator
typename ContainerType::const_iterator ConstIterator
Definition: bvh2.h:31
jet::GetRayIntersectionFunc2
std::function< double(const T &, const Ray2D &)> GetRayIntersectionFunc2
Ray-item closest intersection evaluation function.
Definition: intersection_query_engine2.h:40
jet::Bvh2::numberOfItems
size_t numberOfItems() const
Returns the number of items.
jet::Bvh2
Bounding Volume Hierarchy (BVH) in 2D.
Definition: bvh2.h:27
jet::NearestNeighborDistanceFunc2
std::function< double(const T &, const Vector2D &)> NearestNeighborDistanceFunc2
Nearest neighbor distance measure function.
Definition: nearest_neighbor_query_engine2.h:27
jet::Bvh2::itemOfNode
Iterator itemOfNode(size_t i)
Returns item of i-th node.
jet::IntersectionVisitorFunc2
std::function< void(const T &)> IntersectionVisitorFunc2
Visitor function which is invoked for each intersecting item.
Definition: intersection_query_engine2.h:44
jet::Bvh2::begin
ConstIterator begin() const
Returns the immutable begin iterator of the item.
jet::BoundingBox< T, 2 >
2-D axis-aligned bounding box class.
Definition: bounding_box2.h:41
jet::Bvh2::forEachIntersectingItem
void forEachIntersectingItem(const BoundingBox2D &box, const BoxIntersectionTestFunc2< T > &testFunc, const IntersectionVisitorFunc2< T > &visitorFunc) const override
Invokes visitorFunc for every intersecting items.
jet::Bvh2::closestIntersection
ClosestIntersectionQueryResult2< T > closestIntersection(const Ray2D &ray, const GetRayIntersectionFunc2< T > &testFunc) const override
Returns the closest intersection for given ray.
jet::Bvh2::children
std::pair< size_t, size_t > children(size_t i) const
Returns the children indices of i-th node.
jet::Bvh2::forEachIntersectingItem
void forEachIntersectingItem(const Ray2D &ray, const RayIntersectionTestFunc2< T > &testFunc, const IntersectionVisitorFunc2< T > &visitorFunc) const override
Invokes visitorFunc for every intersecting items.
jet::ClosestIntersectionQueryResult2
Closest intersection query result.
Definition: intersection_query_engine2.h:19
jet::Bvh2< Surface2Ptr >::Iterator
typename ContainerType::iterator Iterator
Definition: bvh2.h:30
jet::RayIntersectionTestFunc2
std::function< bool(const T &, const Ray2D &)> RayIntersectionTestFunc2
Ray-item intersection test function.
Definition: intersection_query_engine2.h:36
jet::Bvh2::boundingBox
const BoundingBox2D & boundingBox() const
Returns bounding box of every items.