86 public SplitHeuristics,
util::NonCopyable,
private impl::QuadTreeHelper<ObjectTraits, typename ObjectTraits::TPoint>
90 typedef QuadTree<ObjectType, ObjectTraits, SplitHeuristics> TSelf;
91 typedef ObjectType TObjectType;
92 typedef ObjectTraits TObjectTraits;
93 typedef SplitHeuristics TSplitHeuristics;
95 typedef typename TObjectTraits::TObjectIterator TObjectIterator;
96 typedef typename TObjectTraits::TObjectReference TObjectReference;
97 typedef typename TObjectTraits::TAabb TAabb;
98 typedef typename TObjectTraits::TRay TRay;
99 typedef typename TObjectTraits::TPoint TPoint;
100 typedef typename TObjectTraits::TVector TVector;
101 typedef typename TObjectTraits::TValue TValue;
102 typedef typename TObjectTraits::TParam TParam;
103 typedef typename TObjectTraits::TReference TReference;
104 typedef typename TObjectTraits::TConstReference TConstReference;
105 typedef typename TObjectTraits::TInfo TInfo;
107 static constexpr size_t dimension = TObjectTraits::dimension;
108 static constexpr size_t defaultMaxObjectsPerLeaf = 10;
109 static constexpr size_t defaultMaxDepth = 10;
115 Neighbour(TObjectIterator
object, TValue squaredDistance):
116 object_(
object), squaredDistance_(squaredDistance) {}
117 TObjectIterator object()
const {
return object_; }
118 TValue squaredDistance()
const {
return squaredDistance_; }
119 TObjectIterator operator->()
const {
return object_; }
120 TObjectReference operator*()
const {
return TObjectTraits::object(object_); }
121 bool operator<(
const Neighbour& other)
const {
return squaredDistance_ < other.squaredDistance_; }
122 bool operator==(
const Neighbour& other)
const {
return object_ == other.object_; }
124 TObjectIterator object_;
125 TValue squaredDistance_;
128 QuadTree(
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
129 QuadTree(
const TAabb& aabb,
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
130 QuadTree(
const TAabb& aabb, TObjectIterator end,
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
131 QuadTree(TObjectIterator first, TObjectIterator last,
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
138 void reset(TObjectIterator first, TObjectIterator last);
145 bool contains(
const TPoint& p,
const TInfo* info = 0)
const;
152 template <
typename OutputIterator>
153 OutputIterator
find(
const TPoint& p, OutputIterator result,
const TInfo* info = 0)
const;
155 template <
typename OutputIterator>
156 OutputIterator
find(
const TAabb& box, OutputIterator result,
const TInfo* info = 0)
const;
158 template <
typename OutputIterator>
159 OutputIterator
find(
const TRay& ray, TParam minT, TParam maxT, OutputIterator result,
const TInfo* info = 0)
const;
161 const TObjectIterator intersect(
const TRay& ray, TReference t, TParam tMin = 0,
162 const TInfo* info = 0)
const;
164 bool intersects(
const TRay& ray, TParam tMin = 0,
165 TParam maxT = std::numeric_limits<TValue>::infinity(),
const TInfo* info = 0)
const;
167 const Neighbour nearestNeighbour(
const TPoint& point,
const TInfo* info = 0)
const;
169 template <
typename RandomIterator>
170 RandomIterator rangeSearch(
const TPoint& center, TParam maxRadius,
size_t maxCount,
171 RandomIterator first,
const TInfo* info = 0)
const;
182 void add(TObjectIterator
object);
183 void remove(TObjectIterator
object);
184 size_t objectCount()
const;
186 const TAabb& aabb()
const;
190 const TValue averageDepth()
const;
191 bool isEmpty()
const;
193 void swap(QuadTree& other);
194 const TObjectIterator end()
const;
198 static constexpr size_t numChildren = 1 << dimension;
200 typedef std::vector<TObjectIterator> TObjectIterators;
212 TObjectIterators data;
215 QuadNode(
const TAabb& bounds, TNodesAllocator& allocator);
218 void add(TObjectIterator
object,
const TSplitHeuristics& heuristics,
size_t level = 0,
bool mayDecompose =
true);
219 bool remove(TObjectIterator
object);
221 bool isLeaf()
const {
return !children; }
222 const TPoint center()
const;
223 const TValue sqrDistance(
const TPoint& point)
const;
224 size_t objectCount()
const;
225 size_t depth()
const;
226 const TValue averageDepth()
const;
227 void decompose(
const TSplitHeuristics& heuristics,
size_t level = 0);
232 TNodesAllocator& allocator_;
234 void deleteChildren(
size_t count);
237 const TObjectIterator doIntersect(
const QuadNode& node,
238 const TRay& ray, TReference t, TParam tMin,
const TInfo* info,
239 const TVector& tNear,
const TVector& tFar,
const TPoint& support,
const TVector& invDir,
size_t flipMask)
const;
241 bool doIntersects(
const QuadNode& node,
242 const TRay& ray, TParam tMin, TParam tMax,
const TInfo* info,
243 const TVector& tNear,
const TVector& tFar,
const TPoint& support,
const TVector& invDir,
size_t flipMask)
const;
245 template <
typename OutputIterator>
246 OutputIterator doFind(
const QuadNode& node,
247 const TAabb& box, OutputIterator result,
const TInfo* info)
const;
249 template <
typename OutputIterator>
250 OutputIterator doFind(
const QuadNode& node,
251 const TRay& ray, TParam tMin, TParam tMax, OutputIterator result,
const TInfo* info,
252 const TVector& tNear,
const TVector& tFar,
const TPoint& support,
const TVector& invDir,
size_t flipMask)
const;
254 void doNearestNeighbour(
const QuadNode& node,
255 const TPoint& point,
const TInfo* info, Neighbour& best)
const;
257 template <
typename RandomIterator>
258 RandomIterator doRangeSearch(
const QuadNode& node,
259 const TPoint& target, TReference squaredRadius,
size_t maxCount, RandomIterator first, RandomIterator last,
const TInfo* info)
const;
263 TObjectIterator end_;
264 std::unique_ptr<TNodesAllocator> nodesAllocator_;