73class AabpTree:
public SplitHeuristics
77 typedef AabpTree<ObjectType, ObjectTraits, SplitHeuristics> TSelf;
79 typedef ObjectType TObject;
80 typedef ObjectTraits TObjectTraits;
81 typedef SplitHeuristics TSplitHeuristics;
83 typedef typename TObjectTraits::TObjectIterator TObjectIterator;
84 typedef typename TObjectTraits::TObjectReference TObjectReference;
85 typedef typename TObjectTraits::TAabb TAabb;
86 typedef typename TObjectTraits::TRay TRay;
87 typedef typename TObjectTraits::TPoint TPoint;
88 typedef typename TObjectTraits::TVector TVector;
89 typedef typename TObjectTraits::TValue TValue;
90 typedef typename TObjectTraits::TParam TParam;
91 typedef typename TObjectTraits::TReference TReference;
92 typedef typename TObjectTraits::TConstReference TConstReference;
93 typedef typename TObjectTraits::TInfo TInfo;
97 dimension = TObjectTraits::dimension,
98 defaultMaxObjectsPerLeaf = 1,
102 typedef std::vector<TObjectIterator> TObjectIterators;
108 Neighbour(TObjectIterator
object, TValue squaredDistance):
109 object_(
object), squaredDistance_(squaredDistance) {}
110 TObjectIterator object()
const {
return object_; }
111 TValue squaredDistance()
const {
return squaredDistance_; }
112 TObjectIterator operator->()
const {
return object_; }
113 TObjectReference operator*()
const {
return TObjectTraits::object(object_); }
114 bool operator<(
const Neighbour& other)
const {
return squaredDistance_ < other.squaredDistance_; }
116 TObjectIterator object_;
117 TValue squaredDistance_;
120 AabpTree(
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
121 AabpTree(TObjectIterator first, TObjectIterator last,
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
122 AabpTree(TSelf&& other)
noexcept;
124 TSelf& operator=(TSelf&& other)
noexcept;
127 void reset(TObjectIterator first, TObjectIterator last);
129 const TAabb& aabb()
const;
131 bool contains(
const TPoint& point,
const TInfo* info = 0)
const;
133 template <
typename OutputIterator>
134 OutputIterator find(
const TPoint& point, OutputIterator result,
const TInfo* info = 0)
const;
135 template <
typename OutputIterator>
136 OutputIterator find(
const TAabb& box, OutputIterator result,
const TInfo* info = 0)
const;
137 template <
typename OutputIterator>
138 OutputIterator find(
const TRay& ray, TParam minT, TParam maxT, OutputIterator result,
const TInfo* info = 0)
const;
140 const TObjectIterator intersect(
const TRay& ray, TReference t, TParam minT = 0,
const TInfo* info = 0)
const;
141 bool intersects(
const TRay& ray, TParam minT = 0, TParam maxT = std::numeric_limits<TValue>::infinity(),
const TInfo* info = 0)
const;
143 const Neighbour nearestNeighbour(
const TPoint& point,
const TInfo* info = 0)
const;
144 template <
typename RandomIterator>
145 RandomIterator rangeSearch(
const TPoint& center, TParam maxRadius,
size_t maxCount, RandomIterator first,
const TInfo* info = 0)
const;
147 void swap(TSelf& other);
148 bool isEmpty()
const;
149 const TObjectIterator end()
const;
156 TObjectIterator object;
157 Input(
const TAabb& aabb, TObjectIterator
object): aabb(aabb), object(
object) {}
159 typedef std::vector<Input> TInputs;
160 typedef typename TInputs::iterator TInputIterator;
162 typedef unsigned TIndex;
163 typedef num::NumTraits<TIndex>::signedType TSignedIndex;
164 static constexpr size_t maxSize =
static_cast<size_t>(num::NumTraits<TSignedIndex>::max) + 1;
171 LASS_ASSERT(axis < dimension);
172 axis_ =
static_cast<TSignedIndex
>(axis);
174 Node(TIndex first, TIndex last)
176 LASS_ASSERT(last > first);
178 last_ = -
static_cast<TSignedIndex
>(last) - 1;
179 LASS_ASSERT(last_ < 0);
182 bool isInternal()
const {
return axis_ >= 0; }
183 TParam leftBound()
const { LASS_ASSERT(isInternal());
return leftBound_; }
184 void setLeftBound(TParam x) { LASS_ASSERT(isInternal()); leftBound_ = x; }
185 TParam rightBound()
const { LASS_ASSERT(isInternal());
return rightBound_; }
186 void setRightBound(TParam x) { LASS_ASSERT(isInternal()); rightBound_ = x; }
187 size_t axis()
const { LASS_ASSERT(isInternal());
return static_cast<size_t>(axis_); }
188 TIndex right()
const { LASS_ASSERT(isInternal());
return right_; }
189 void setRight(TIndex right) { LASS_ASSERT(isInternal()); right_ = right; }
191 bool isLeaf()
const {
return last_ < 0; }
192 TIndex first()
const { LASS_ASSERT(isLeaf());
return first_; }
193 TIndex last()
const { LASS_ASSERT(isLeaf());
return static_cast<TIndex
>(-(last_ + 1)); }
209 typedef std::vector<Node> TNodes;
215 BalanceResult(
const TAabb& aabb, TIndex index): aabb(aabb), index(index) {}
218 const BalanceResult balance(TInputIterator iFirst, TInputIterator iLast);
219 TIndex addLeafNode(TInputIterator iFirst, TInputIterator iLast);
220 TIndex addInternalNode(
size_t iAxis);
222 bool doContains(TIndex index,
const TPoint& point,
const TInfo* info)
const;
224 template <
typename OutputIterator>
225 OutputIterator doFind(TIndex index,
const TPoint& point, OutputIterator iResult,
const TInfo* info)
const;
226 template <
typename OutputIterator>
227 OutputIterator doFind(TIndex index,
const TAabb& box, OutputIterator iResult,
const TInfo* info)
const;
228 template <
typename OutputIterator>
229 OutputIterator doFind(TIndex index,
const TRay& ray, TParam tMin, TParam tMax, OutputIterator iResult,
const TInfo* info,
230 const TVector& reciprocalDirection, TParam tNear, TParam tFar)
const;
232 const TObjectIterator doIntersect(
233 TIndex index,
const TRay& ray, TReference t, TParam tMin,
const TInfo* info,
234 const TVector& reciprocalDirection, TParam tNear, TParam tFar)
const;
235 bool doIntersects(TIndex index,
const TRay& ray, TParam tMin, TParam tMax,
const TInfo* info,
236 const TVector& reciprocalDirection, TParam tNear, TParam tFar)
const;
238 void doNearestNeighbour(TIndex index,
const TPoint& point,
const TInfo* info, Neighbour& best)
const;
239 template <
typename RandomIterator>
240 RandomIterator doRangeSearch(TIndex index,
const TPoint& point, TReference squaredRadius,
241 size_t maxCount, RandomIterator first, RandomIterator last,
const TInfo* info)
const;
243 void getChildren(TIndex index,
const TPoint& target, TIndex indices[2], TValue signedDistances[2])
const;
246 TObjectIterators objects_;
248 std::unique_ptr<TObjectIterator> end_;