93 typedef ObjectType TObject;
94 typedef ObjectTraits TObjectTraits;
96 typedef typename TObjectTraits::TObjectIterator TObjectIterator;
97 typedef typename TObjectTraits::TObjectReference TObjectReference;
98 typedef typename TObjectTraits::TPoint TPoint;
99 typedef typename TObjectTraits::TValue TValue;
100 typedef typename TObjectTraits::TParam TParam;
101 typedef typename TObjectTraits::TReference TReference;
102 typedef typename TObjectTraits::TConstReference TConstReference;
104 enum { dimension = TObjectTraits::dimension };
110 Neighbour(TObjectIterator
object, TValue squaredDistance);
112 TObjectIterator object()
const;
113 TPoint position()
const;
114 TValue squaredDistance()
const;
116 TObjectIterator operator->()
const;
117 TObjectReference operator*()
const;
118 bool operator<(
const Neighbour& other)
const;
120 TObjectIterator object_;
121 TValue squaredDistance_;
124 typedef std::vector<Neighbour> TNeighbourhood;
127 KdTree(TObjectIterator first, TObjectIterator last);
128 KdTree(TSelf&& other)
noexcept;
130 TSelf& operator=(TSelf&& other)
noexcept;
133 void reset(TObjectIterator first, TObjectIterator last);
137 TValue
rangeSearch(
const TPoint& target, TParam maxRadius,
size_t maxCount,
138 TNeighbourhood& neighbourhood)
const;
140 template <
typename OutputIterator>
141 OutputIterator
rangeSearch(
const TPoint& target, TParam maxRadius,
142 OutputIterator first)
const;
143 template <
typename RandomIterator>
144 RandomIterator
rangeSearch(
const TPoint& target, TParam maxRadius,
size_t maxCount,
145 RandomIterator first)
const;
151 const TObjectIterator end()
const;
153#ifdef LASS_SPAT_KD_TREE_DIAGNOSTICS
159 typedef std::vector<TObjectIterator> TObjectIterators;
160 typedef typename TObjectIterators::iterator TIteratorIterator;
162 typedef unsigned char TAxis;
163 typedef std::vector<TAxis> TAxes;
165 enum { dummyAxis_ = TAxis(-1)} ;
170 LessDim(TAxis split): split_(split) {}
171 bool operator()(
const TObjectIterator& a,
const TObjectIterator& b)
const
173 return TObjectTraits::position(a)[split_] < TObjectTraits::position(b)[split_];
182 Node(TObjectIterator
object,
const TPoint& position = TPoint(), TAxis axis = dummyAxis_):
183 position_(position), object_(object), axis_(axis) {}
184 const TObjectIterator& object()
const {
return object_; }
185 const TPoint& position()
const {
return position_; }
186 TAxis axis()
const {
return axis_; }
189 TObjectIterator object_;
192 typedef std::vector<Node> TNodes;
195 void balance(
size_t index, TIteratorIterator first, TIteratorIterator last);
196 TAxis findSplitAxis(TIteratorIterator first, TIteratorIterator last)
const;
197 void assignNode(
size_t index, TObjectIterator
object, TAxis splitAxis);
198 size_t findNode(
size_t index,
const TPoint& target)
const;
200 void doNearestNeighbour(
size_t index,
const TPoint& target, Neighbour& best)
const;
202 template <
typename OutputIterator>
203 OutputIterator doRangeSearch(
size_t index,
const TPoint& target,
204 TParam squaredRadius, OutputIterator output)
const;
205 template <
typename RandomIterator>
206 RandomIterator doRangeSearch(
size_t index,
const TPoint& target, TReference squaredRadius,
207 size_t maxCount, RandomIterator first, RandomIterator last)
const;
209 static TValue squaredDistance(
const TPoint& a,
const TPoint& b);
212 std::unique_ptr<TObjectIterator> end_;