Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r74422 - in sandbox-branches/geometry/index: boost/geometry/extensions/index boost/geometry/extensions/index/algorithms boost/geometry/extensions/index/algorithms/detail boost/geometry/extensions/index/rtree boost/geometry/extensions/index/rtree/visitors tests
From: adam.wulkiewicz_at_[hidden]
Date: 2011-09-16 15:44:05


Author: awulkiew
Date: 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
New Revision: 74422
URL: http://svn.boost.org/trac/boost/changeset/74422

Log:
k nearest neighbors search implemented, empty predicate added, pop_back() added to pushable_array, glFlush() and glClear() calls removed from gl_draw(), number of found objects added to spatial query, find visitor and corresponding rtree's method removed.
Added:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/
   sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/smallest_for_indexable.hpp (contents, props changed)
   sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/sum_for_indexable.hpp (contents, props changed)
   sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/mindist.hpp (contents, props changed)
   sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/minmaxdist.hpp (contents, props changed)
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp (contents, props changed)
Removed:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp
Text files modified:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp | 27 +++++++
   sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp | 6 +
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp | 30 ++++++++
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp | 134 ++++++++++++++++++++++++++++++++-------
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp | 4 -
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp | 5 +
   sandbox-branches/geometry/index/tests/additional_glut_vis.cpp | 71 +++++++++++++++++---
   sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp | 46 +++++++++---
   8 files changed, 268 insertions(+), 55 deletions(-)

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/smallest_for_indexable.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/smallest_for_indexable.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -0,0 +1,83 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - Get smallest value calculated for indexable's dimensions, used in R-tree k nearest neighbors query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SMALLEST_FOR_INDEXABLE_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SMALLEST_FOR_INDEXABLE_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag,
+ size_t DimensionIndex>
+struct smallest_for_indexable_dimension
+{
+ BOOST_MPL_ASSERT_MSG(
+ (false),
+ NOT_IMPLEMENTED_FOR_THIS_INDEXABLE_TAG_TYPE,
+ (smallest_for_indexable_dimension));
+};
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag,
+ size_t N>
+struct smallest_for_indexable
+{
+ typedef typename smallest_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::result_type result_type;
+
+ template <typename Data>
+ inline static result_type apply(Geometry const& g, Indexable const& i, Data const& data)
+ {
+ result_type r1 = smallest_for_indexable<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::apply(g, i, data);
+
+ result_type r2 = smallest_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::apply(g, i, data);
+
+ return r1 < r2 ? r1 : r2;
+ }
+};
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag>
+struct smallest_for_indexable<Geometry, Indexable, IndexableTag, AlgoTag, 1>
+{
+ typedef typename smallest_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, 0
+ >::result_type result_type;
+
+ template <typename Data>
+ inline static result_type apply(Geometry const& g, Indexable const& i, Data const& data)
+ {
+ return
+ smallest_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, 0
+ >::apply(g, i, data);
+ }
+};
+
+} // namespace detail
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SMALLEST_FOR_INDEXABLE_HPP

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/sum_for_indexable.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/detail/sum_for_indexable.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -0,0 +1,79 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - Sum values calculated for indexable's dimensions, used e.g. in R-tree k nearest neighbors query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SUM_FOR_INDEXABLE_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SUM_FOR_INDEXABLE_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag,
+ size_t DimensionIndex>
+struct sum_for_indexable_dimension
+{
+ BOOST_MPL_ASSERT_MSG(
+ (false),
+ NOT_IMPLEMENTED_FOR_THIS_INDEXABLE_TAG_TYPE,
+ (sum_for_indexable_dimension));
+};
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag,
+ size_t N>
+struct sum_for_indexable
+{
+ typedef typename sum_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::result_type result_type;
+
+ inline static result_type apply(Geometry const& g, Indexable const& i)
+ {
+ return
+ sum_for_indexable<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::apply(g, i) +
+ sum_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, N - 1
+ >::apply(g, i);
+ }
+};
+
+template <
+ typename Geometry,
+ typename Indexable,
+ typename IndexableTag,
+ typename AlgoTag>
+struct sum_for_indexable<Geometry, Indexable, IndexableTag, AlgoTag, 1>
+{
+ typedef typename sum_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, 0
+ >::result_type result_type;
+
+ inline static result_type apply(Geometry const& g, Indexable const& i)
+ {
+ return
+ sum_for_indexable_dimension<
+ Geometry, Indexable, IndexableTag, AlgoTag, 0
+ >::apply(g, i);
+ }
+};
+
+} // namespace detail
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_DETAIL_SUM_FOR_INDEXABLE_HPP

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/mindist.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/mindist.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -0,0 +1,80 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - mindist used in R-tree k nearest neighbors query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINDIST_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINDIST_HPP
+
+#include <boost/geometry/extensions/index/algorithms/detail/sum_for_indexable.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+struct mindist_tag {};
+
+template <
+ typename Point,
+ typename PointIndexable,
+ size_t N>
+struct sum_for_indexable<Point, PointIndexable, point_tag, mindist_tag, N>
+{
+ typedef typename geometry::default_distance_result<Point, PointIndexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, PointIndexable const& i)
+ {
+ return geometry::comparable_distance(pt, i);
+ }
+};
+
+template <
+ typename Point,
+ typename BoxIndexable,
+ size_t DimensionIndex>
+struct sum_for_indexable_dimension<Point, BoxIndexable, box_tag, mindist_tag, DimensionIndex>
+{
+ typedef typename geometry::default_distance_result<Point, BoxIndexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, BoxIndexable const& i)
+ {
+ typedef typename index::traits::coordinate_type<Point>::type point_coord_t;
+ typedef typename index::traits::coordinate_type<BoxIndexable>::type indexable_coord_t;
+
+ point_coord_t pt_c = geometry::get<DimensionIndex>(pt);
+ indexable_coord_t ind_c_min = geometry::get<geometry::min_corner, DimensionIndex>(i);
+ indexable_coord_t ind_c_max = geometry::get<geometry::max_corner, DimensionIndex>(i);
+
+ result_type diff = 0;
+
+ if ( pt_c < ind_c_min )
+ diff = ind_c_min - pt_c;
+ else if ( ind_c_max < pt_c )
+ diff = pt_c - ind_c_max;
+
+ return diff * diff;
+ }
+};
+
+} // namespace detail
+
+template <typename Point, typename Indexable>
+typename geometry::default_distance_result<Point, Indexable>::type
+mindist(Point const& pt, Indexable const& i)
+{
+ return detail::sum_for_indexable<
+ Point,
+ Indexable,
+ typename index::traits::tag<Indexable>::type,
+ detail::mindist_tag,
+ index::traits::dimension<Indexable>::value
+ >::apply(pt, i);
+}
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINDIST_HPP

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/minmaxdist.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/minmaxdist.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -0,0 +1,168 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - minmaxdist used in R-tree k nearest neighbors query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINMAXDIST_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINMAXDIST_HPP
+
+#include <boost/geometry/extensions/index/algorithms/detail/sum_for_indexable.hpp>
+#include <boost/geometry/extensions/index/algorithms/detail/smallest_for_indexable.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+// awulkiew - use if unsigned values may be used as coordinates
+template <typename T>
+inline T diff_abs(T const& v1, T const& v2)
+{
+ return v1 < v2 ? v2 - v1 : v1 - v2;
+}
+
+// minmaxdist component
+
+struct minmaxdist_comp_tag {};
+
+template <
+ typename Point,
+ typename BoxIndexable,
+ size_t DimensionIndex>
+struct sum_for_indexable_dimension<Point, BoxIndexable, box_tag, minmaxdist_comp_tag, DimensionIndex>
+{
+ typedef typename geometry::default_distance_result<Point, BoxIndexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, BoxIndexable const& i)
+ {
+ typedef typename index::traits::coordinate_type<Point>::type point_coord_t;
+ typedef typename index::traits::coordinate_type<BoxIndexable>::type indexable_coord_t;
+
+ point_coord_t pt_c = geometry::get<DimensionIndex>(pt);
+ indexable_coord_t ind_c_min = geometry::get<geometry::min_corner, DimensionIndex>(i);
+ indexable_coord_t ind_c_max = geometry::get<geometry::max_corner, DimensionIndex>(i);
+
+ result_type further_diff = 0;
+
+ if ( (ind_c_min + ind_c_max) / 2 <= pt_c )
+ further_diff = pt_c - ind_c_min;
+ else
+ further_diff = diff_abs(pt_c, ind_c_max); // unsigned values protection
+
+ return further_diff * further_diff;
+ }
+};
+
+template <typename Point, typename Indexable>
+typename geometry::default_distance_result<Point, Indexable>::type
+minmaxdist_comp(Point const& pt, Indexable const& i)
+{
+ return sum_for_indexable<
+ Point,
+ Indexable,
+ typename index::traits::tag<Indexable>::type,
+ minmaxdist_comp_tag,
+ index::traits::dimension<Indexable>::value
+ >::apply(pt, i);
+}
+
+// minmaxdist
+
+struct minmaxdist_tag {};
+
+template <
+ typename Point,
+ typename BoxIndexable,
+ size_t DimensionIndex>
+struct smallest_for_indexable_dimension<Point, BoxIndexable, box_tag, minmaxdist_tag, DimensionIndex>
+{
+ typedef typename geometry::default_distance_result<Point, BoxIndexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, BoxIndexable const& i, result_type const& comp)
+ {
+ typedef typename index::traits::coordinate_type<Point>::type point_coord_t;
+ typedef typename index::traits::coordinate_type<BoxIndexable>::type indexable_coord_t;
+
+ point_coord_t pt_c = geometry::get<DimensionIndex>(pt);
+ indexable_coord_t ind_c_min = geometry::get<geometry::min_corner, DimensionIndex>(i);
+ indexable_coord_t ind_c_max = geometry::get<geometry::max_corner, DimensionIndex>(i);
+
+ indexable_coord_t ind_c_avg = (ind_c_min + ind_c_max) / 2;
+
+ // TODO: awulkiew - optimize! don't calculate 2x pt_c <= ind_c_avg
+ // take particular case pt_c == ind_c_avg into account
+
+ result_type closer_comp = 0;
+ if ( pt_c <= ind_c_avg )
+ closer_comp = diff_abs(pt_c, ind_c_min); // unsigned values protection
+ else
+ closer_comp = diff_abs(pt_c, ind_c_max); // unsigned values protection
+
+ result_type further_comp = 0;
+ if ( ind_c_avg <= pt_c )
+ further_comp = pt_c - ind_c_min;
+ else
+ further_comp = diff_abs(pt_c, ind_c_max); // unsigned values protection
+
+ return (comp + closer_comp * closer_comp) - further_comp * further_comp;
+ }
+};
+
+template <typename Point, typename Indexable, typename IndexableTag>
+struct minmaxdist_impl
+{
+ BOOST_MPL_ASSERT_MSG(
+ (false),
+ NOT_IMPLEMENTED_FOR_THIS_INDEXABLE_TAG_TYPE,
+ (minmaxdist_impl));
+};
+
+template <typename Point, typename Indexable>
+struct minmaxdist_impl<Point, Indexable, point_tag>
+{
+ typedef typename geometry::default_distance_result<Point, Indexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, Indexable const& i)
+ {
+ return geometry::comparable_distance(pt, i);
+ }
+};
+
+template <typename Point, typename Indexable>
+struct minmaxdist_impl<Point, Indexable, box_tag>
+{
+ typedef typename geometry::default_distance_result<Point, Indexable>::type result_type;
+
+ inline static result_type apply(Point const& pt, Indexable const& i)
+ {
+ result_type comp = minmaxdist_comp(pt, i);
+
+ return smallest_for_indexable<
+ Point,
+ Indexable,
+ box_tag,
+ minmaxdist_tag,
+ index::traits::dimension<Indexable>::value
+ >::apply(pt, i, comp);
+ }
+};
+
+} // namespace detail
+
+template <typename Point, typename Indexable>
+typename geometry::default_distance_result<Point, Indexable>::type
+minmaxdist(Point const& pt, Indexable const& i)
+{
+ return detail::minmaxdist_impl<
+ Point,
+ Indexable,
+ typename index::traits::tag<Indexable>::type
+ >::apply(pt, i);
+}
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_ALGORITHMS_MINMAXDIST_HPP

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -23,8 +23,11 @@
 
 namespace detail {
 
+struct empty {};
+
 template <typename Geometry>
 struct covered_by
+ : nonassignable
 {
     covered_by(Geometry const& g) : geometry(g) {}
     Geometry const& geometry;
@@ -32,6 +35,7 @@
 
 template <typename Geometry>
 struct intersects
+ : nonassignable
 {
     intersects(Geometry const& g) : geometry(g) {}
     Geometry const& geometry;
@@ -39,6 +43,7 @@
 
 template <typename Geometry>
 struct overlaps
+ : nonassignable
 {
     overlaps(Geometry const& g) : geometry(g) {}
     Geometry const& geometry;
@@ -46,6 +51,7 @@
 
 template <typename Geometry>
 struct within
+ : nonassignable
 {
     within(Geometry const& g) : geometry(g) {}
     Geometry const& geometry;
@@ -53,6 +59,11 @@
 
 } // namespace detail
 
+inline detail::empty empty()
+{
+ return detail::empty();
+}
+
 template <typename Geometry>
 inline detail::covered_by<Geometry> covered_by(Geometry const& g)
 {
@@ -77,11 +88,11 @@
     return detail::within<Geometry>(g);
 }
 
-// predicates checks
-
 namespace detail
 {
 
+// predicate check
+
 template <typename Geometry, typename Tag>
 struct predicate_check
 {
@@ -92,6 +103,16 @@
     }
 };
 
+template <typename Tag>
+struct predicate_check<empty, Tag>
+{
+ template <typename Geometry, typename Indexable>
+ static inline bool apply(Geometry const&, Indexable const&)
+ {
+ return true;
+ }
+};
+
 template <typename Geometry, typename Tag>
 struct predicate_check<covered_by<Geometry>, Tag>
 {
@@ -132,6 +153,8 @@
     }
 };
 
+// predicates check
+
 template <typename TuplePredicates, typename Tag, unsigned int N>
 struct predicates_check_tuple
 {

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -141,6 +141,12 @@
         m_array[m_size++] = v;
     }
 
+ inline void pop_back()
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ --m_size;
+ }
+
     inline bool empty() const
     {
         return m_size == 0;

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -23,6 +23,16 @@
 
 } // namespace rtree
 
+//template <typename Geometry>
+//struct predicate_check<Geometry, rtree::node_predicates_tag>
+//{
+// template <typename Indexable>
+// static inline bool apply(Geometry const& g, Indexable const& i)
+// {
+// return geometry::intersects(i, g);
+// }
+//};
+
 template <typename Geometry>
 struct predicate_check<covered_by<Geometry>, rtree::node_predicates_tag>
 {
@@ -33,6 +43,26 @@
     }
 };
 
+//template <typename Geometry>
+//struct predicate_check<intersects<Geometry>, rtree::node_predicates_tag>
+//{
+// template <typename Indexable>
+// static inline bool apply(intersects<Geometry> const& p, Indexable const& i)
+// {
+// return geometry::intersects(i, p.geometry);
+// }
+//};
+//
+//template <typename Geometry>
+//struct predicate_check<overlaps<Geometry>, rtree::node_predicates_tag>
+//{
+// template <typename Indexable>
+// static inline bool apply(overlaps<Geometry> const& p, Indexable const& i)
+// {
+// return geometry::overlaps(i, p.geometry);
+// }
+//};
+
 template <typename Geometry>
 struct predicate_check<within<Geometry>, rtree::node_predicates_tag>
 {

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -20,15 +20,15 @@
 #include <boost/geometry/extensions/index/nonassignable.hpp>
 
 #include <boost/geometry/extensions/index/translator/translator.hpp>
-
 #include <boost/geometry/extensions/index/rtree/options.hpp>
+
 #include <boost/geometry/extensions/index/rtree/predicates.hpp>
 //#include <boost/geometry/extensions/index/rtree/filters.hpp>
 
 #include <boost/geometry/extensions/index/rtree/node/node.hpp>
 
-#include <boost/geometry/extensions/index/rtree/visitors/find.hpp>
 #include <boost/geometry/extensions/index/rtree/visitors/query.hpp>
+#include <boost/geometry/extensions/index/rtree/visitors/nearest.hpp>
 #include <boost/geometry/extensions/index/rtree/visitors/destroy.hpp>
 #include <boost/geometry/extensions/index/rtree/visitors/insert.hpp>
 #include <boost/geometry/extensions/index/rtree/visitors/remove.hpp>
@@ -78,25 +78,44 @@
     }
 
     template <typename Predicates, typename OutIter>
- inline void query(Predicates const& pred, OutIter out_it) const
+ inline size_t query(Predicates const& pred, OutIter out_it) const
     {
         detail::rtree::visitors::query<value_type, options_type, translator_type, box_type, Predicates, OutIter>
             find_v(m_translator, pred, out_it);
 
         detail::rtree::apply_visitor(find_v, *m_root);
+
+ return find_v.found_count;
     }
 
- // TODO: delete find method
- template <typename Geometry, typename OutIter>
- inline void find(Geometry const& geom, OutIter out_it) const
+ // TODO: awulkiew - change Point to Geometry?
+ // return number of elements instead of bool?
+
+ template <typename Point>
+ inline size_t nearest(Point const& pt, value_type & v) const
     {
- detail::rtree::visitors::find<value_type, options_type, translator_type, box_type, Geometry, OutIter>
- find_v(m_translator, geom, out_it);
+ return nearest_one(pt, detail::empty(), v);
+ }
 
- detail::rtree::apply_visitor(find_v, *m_root);
+ template <typename Point, typename Predicates>
+ inline size_t nearest(Point const& pt, Predicates const& pred, value_type & v) const
+ {
+ return nearest_one(pt, pred, v);
+ }
+
+ template <typename Point, typename OutIter>
+ inline size_t nearest(Point const& pt, size_t k, OutIter out_it) const
+ {
+ return nearest_k(pt, k, detail::empty(), out_it);
     }
 
- void insert(value_type const& value)
+ template <typename Point, typename Predicates, typename OutIter>
+ inline size_t nearest(Point const& pt, size_t k, Predicates const& pred, OutIter out_it) const
+ {
+ return nearest_k(pt, k, pred, out_it);
+ }
+
+ inline void insert(value_type const& value)
     {
         // TODO: awulkiew - assert for correct value
 
@@ -108,7 +127,7 @@
         ++m_values_count;
     }
 
- void remove(value_type const& value)
+ inline void remove(value_type const& value)
     {
         // TODO: awulkiew - assert for correct value
 
@@ -122,40 +141,77 @@
         --m_values_count;
     }
 
- size_t size() const
+ inline size_t size() const
     {
         return m_values_count;
     }
 
- bool empty() const
+ inline bool empty() const
     {
- // TODO: awulkiew - take root into consideration
         return 0 == m_values_count;
     }
 
- void clear()
- {
- // TODO: awulkiew - implement
- BOOST_GEOMETRY_INDEX_ASSERT(false, "not implemented");
- }
+ // TODO: awulkiew
+ // clear()
+ // aabb/box/get_box/etc.
+ // iterators, begin/end/etc.
+
+ //inline void clear()
+ //{
+ // // TODO: awulkiew - implement
+ // BOOST_GEOMETRY_INDEX_ASSERT(false, "not implemented");
+ //}
 
     template <typename Visitor>
- void apply_visitor(Visitor & visitor) const
+ inline void apply_visitor(Visitor & visitor) const
     {
         detail::rtree::apply_visitor(visitor, *m_root);
     }
 
- translator_type const& get_translator() const
+ inline translator_type const& get_translator() const
     {
         return m_translator;
     }
 
- size_t values_count() const
+ inline size_t values_count() const
     {
         return m_values_count;
     }
 
+ inline size_t depth() const
+ {
+ return m_leafs_level;
+ }
+
 private:
+ template <typename Point, typename Predicates>
+ inline size_t nearest_one(Point const& pt, Predicates const& pred, value_type & v) const
+ {
+ typedef detail::rtree::visitors::nearest_one<value_type, translator_type, Point> result_type;
+ result_type result;
+
+ detail::rtree::visitors::nearest<value_type, options_type, translator_type, box_type, Point, Predicates, result_type>
+ nearest_v(m_translator, pt, pred, result);
+
+ detail::rtree::apply_visitor(nearest_v, *m_root);
+
+ return result.get(v);
+ }
+
+ template <typename Point, typename Predicates, typename OutIter>
+ inline size_t nearest_k(Point const& pt, size_t k, Predicates const& pred, OutIter out_it) const
+ {
+ typedef detail::rtree::visitors::nearest_k<value_type, translator_type, Point> result_type;
+ result_type result(k);
+
+ detail::rtree::visitors::nearest<value_type, options_type, translator_type, box_type, Point, Predicates, result_type>
+ nearest_v(m_translator, pt, pred, result);
+
+ detail::rtree::apply_visitor(nearest_v, *m_root);
+
+ return result.get(out_it);
+ }
+
     size_t m_values_count;
     node *m_root;
     size_t m_leafs_level;
@@ -163,17 +219,47 @@
 };
 
 template <typename Value, typename Options, typename Translator>
-void insert(rtree<Value, Options, Translator> & tree, Value const& v)
+inline void insert(rtree<Value, Options, Translator> & tree, Value const& v)
 {
     tree.insert(v);
 }
 
 template <typename Value, typename Options, typename Translator>
-void remove(rtree<Value, Options, Translator> & tree, Value const& v)
+inline void remove(rtree<Value, Options, Translator> & tree, Value const& v)
 {
     tree.remove(v);
 }
 
+template <typename Value, typename Options, typename Translator, typename Predicates, typename OutIter>
+inline size_t query(rtree<Value, Options, Translator> const& tree, Predicates const& pred, OutIter out_it)
+{
+ return tree.query(pred, out_it);
+}
+
+template <typename Value, typename Options, typename Translator, typename Point>
+inline size_t nearest(rtree<Value, Options, Translator> const& tree, Point const& pt, Value & v)
+{
+ return tree.nearest(pt, v);
+}
+
+template <typename Value, typename Options, typename Translator, typename Point, typename Predicates>
+inline size_t nearest(rtree<Value, Options, Translator> const& tree, Point const& pt, Predicates const& pred, Value & v)
+{
+ return tree.nearest(pt, pred, v);
+}
+
+template <typename Value, typename Options, typename Translator, typename Point, typename OutIter>
+inline size_t nearest(rtree<Value, Options, Translator> const& tree, Point const& pt, size_t k, OutIter out_it)
+{
+ return tree.nearest(pt, k, out_it);
+}
+
+template <typename Value, typename Options, typename Translator, typename Point, typename Predicates, typename OutIter>
+inline size_t nearest(rtree<Value, Options, Translator> const& tree, Point const& pt, size_t k, Predicates const& pred, OutIter out_it)
+{
+ return tree.nearest(pt, k, pred, out_it);
+}
+
 }}} // namespace boost::geometry::index
 
 #endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP

Deleted: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
+++ (empty file)
@@ -1,232 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Boost.Index - R-tree find
-//
-// Copyright 2011 Adam Wulkiewicz.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_FIND_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_FIND_HPP
-
-#include <boost/geometry/extensions/index/rtree/node/node.hpp>
-
-//#include <boost/geometry/extensions/index/rtree/visitors/is_leaf.hpp>
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree { namespace visitors {
-
-//template <size_t N, typename T>
-//class array
-//{
-//public:
-// inline array()
-// : arr_elements(0)
-// {}
-//
-// inline void push(T const& v)
-// {
-// arr[arr_elements++] = v;
-// }
-//
-// inline T pop()
-// {
-// assert(0 < arr_elements);
-// return arr[--arr_elements];
-// }
-//
-// inline bool empty() const
-// {
-// return 0 == arr_elements;
-// }
-//
-// inline size_t size() const
-// {
-// return arr_elements;
-// }
-//
-//private:
-// boost::array<T, N> arr;
-// size_t arr_elements;
-//};
-//
-//template <typename Cont>
-//class dynamic
-//{
-//public:
-// typedef typename Cont::value_type value_type;
-//
-// inline void push(value_type const& v)
-// {
-// cont.push_back(v);
-// }
-//
-// inline value_type pop()
-// {
-// value_type v = cont.back();
-// cont.pop_back();
-// return v;
-// }
-//
-// inline bool empty() const
-// {
-// return cont.empty();
-// }
-//
-// inline size_t size() const
-// {
-// return cont.size();
-// }
-//
-// inline void clear()
-// {
-// cont.clear();
-// }
-//
-//private:
-// Cont cont;
-//};
-//
-//template <size_t N, typename Cont>
-//class array_semi_dynamic
-//{
-//public:
-// typedef typename Cont::value_type value_type;
-//
-// inline array_semi_dynamic()
-// : arr_elements(0)
-// {}
-//
-// inline void push(value_type const& v)
-// {
-// if ( arr_elements < N )
-// arr[arr_elements++] = v;
-// else
-// cont.push_back(v);
-// }
-//
-// inline value_type pop()
-// {
-// if ( !cont.empty() )
-// {
-// value_type v = cont.back();
-// cont.pop_back();
-// return v;
-// }
-// else
-// {
-// assert(0 < arr_elements);
-// return arr[--arr_elements];
-// }
-// }
-//
-// inline bool empty() const
-// {
-// return cont.empty() && 0 == arr_elements;
-// }
-//
-// inline size_t size() const
-// {
-// return arr_elements + cont.size();
-// }
-//
-//private:
-// boost::array<value_type, N> arr;
-// size_t arr_elements;
-// Cont cont;
-//};
-
-// rtree spatial query visitor
-
-template <typename Value, typename Options, typename Translator, typename Box, typename Geometry, typename OutIter>
-struct find
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
- , index::nonassignable
-{
- typedef typename rtree::node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type node;
- typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type internal_node;
- typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type leaf;
-
- inline find(Translator const& t, Geometry const& g, OutIter out_it)
- : tr(t), geom(g), out_iter(out_it)
- {}
-
- inline void operator()(internal_node const& n)
- {
- //typedef typename internal_node::children_type children_type;
-
- //array_semi_dynamic<1024, std::deque<node*> > nodes;
- ////array<1024, node*> nodes;
- ////dynamic< std::deque<node*> > nodes;
- //
- //for (typename children_type::const_iterator it = n.children.begin();
- // it != n.children.end(); ++it)
- //{
- // if ( geometry::intersects(it->first, geom) )
- // {
- // nodes.push(it->second);
- // }
- //}
-
- //while ( !nodes.empty() )
- //{
- // node *n = nodes.pop();
-
- // if ( !boost::apply_visitor(visitors::is_leaf<Value, Box, Tag>(), *n) )
- // {
- // internal_node &in = boost::get<internal_node>(*n);
-
- // for (typename children_type::const_iterator it = in.children.begin();
- // it != in.children.end(); ++it)
- // {
- // if ( geometry::intersects(it->first, geom) )
- // {
- // nodes.push(it->second);
- // }
- // }
- // }
- // else
- // {
- // operator()(boost::get<leaf>(*n));
- // }
- //}
-
- typedef typename rtree::elements_type<internal_node>::type elements_type;
- elements_type const& elements = rtree::elements(n);
-
- for (typename elements_type::const_iterator it = elements.begin();
- it != elements.end(); ++it)
- {
- if ( geometry::intersects(it->first, geom) )
- rtree::apply_visitor(*this, *it->second);
- }
- }
-
- inline void operator()(leaf const& n)
- {
- typedef typename rtree::elements_type<leaf>::type elements_type;
- elements_type const& elements = rtree::elements(n);
-
- for (typename elements_type::const_iterator it = elements.begin();
- it != elements.end(); ++it)
- {
- if ( geometry::intersects(tr(*it), geom) )
- {
- out_iter = *it;
- ++out_iter;
- }
- }
- }
-
- Translator const& tr;
- Geometry const& geom;
- OutIter out_iter;
-};
-
-}}} // namespace detail::rtree::visitors
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_VISITORS_FIND_HPP

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -200,14 +200,10 @@
     typedef typename rtree<Value, Options, Translator>::translator_type translator_type;
     typedef typename rtree<Value, Options, Translator>::box_type box_type;
 
- glClear(GL_COLOR_BUFFER_BIT);
-
     detail::rtree::visitors::gl_draw<value_type, options_type, translator_type, box_type>
         gl_draw_v(tree.get_translator(), level_first, level_last, z_coord_level_multiplier);
 
     tree.apply_visitor(gl_draw_v);
-
- glFlush();
 }
 
 }}} // namespace boost::geometry::index

Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/nearest.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -0,0 +1,246 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - R-tree k nearest neighbors query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_NEAREST_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_NEAREST_HPP
+
+#include <boost/geometry/extensions/index/algorithms/mindist.hpp>
+#include <boost/geometry/extensions/index/algorithms/minmaxdist.hpp>
+
+#include <boost/geometry/extensions/index/rtree/node/node.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree { namespace visitors {
+
+template <typename Value, typename Translator, typename Point>
+struct nearest_one
+{
+public:
+ typedef typename Translator::indexable_type indexable_type;
+ typedef typename geometry::default_distance_result<Point, indexable_type>::type distance_type;
+
+ inline nearest_one()
+ : comp_mindist(std::numeric_limits<distance_type>::max())
+ {}
+
+ inline void store(Value const& val, distance_type const& curr_mindist)
+ {
+ if ( curr_mindist < comp_mindist )
+ {
+ comp_mindist = curr_mindist;
+ value = val;
+ }
+ }
+
+ inline bool is_mindist_valid() const
+ {
+ return comp_mindist < std::numeric_limits<distance_type>::max();
+ }
+
+ inline distance_type mindist() const
+ {
+ return comp_mindist;
+ }
+
+ inline size_t get(Value & v)
+ {
+ v = value;
+ return is_mindist_valid() ? 1 : 0;
+ }
+
+private:
+ Value value;
+ distance_type comp_mindist;
+};
+
+template <typename Value, typename Translator, typename Point>
+struct nearest_k
+{
+public:
+ typedef typename Translator::indexable_type indexable_type;
+ typedef typename geometry::default_distance_result<Point, indexable_type>::type distance_type;
+
+ inline explicit nearest_k(size_t k)
+ : m_count(k)
+ {
+ // TEMP?
+ m_neighbors.reserve(m_count + 1);
+ }
+
+ inline void store(Value const& val, distance_type const& curr_mindist)
+ {
+ m_neighbors.push_back(std::make_pair(curr_mindist, val));
+ std::sort(m_neighbors.begin(), m_neighbors.end(), neighbors_less);
+
+ if ( m_count < m_neighbors.size() )
+ m_neighbors.pop_back();
+
+ // TODO: awulkiew - test other methods:
+ // heap, manual inserting
+ // don't sort if size < k ?
+ }
+
+ inline bool is_mindist_valid() const
+ {
+ return m_neighbors.size() == m_count;
+ }
+
+ inline distance_type mindist() const
+ {
+ return m_neighbors.size() < m_count ?
+ std::numeric_limits<distance_type>::max() :
+ m_neighbors.back().first;
+ }
+
+ template <typename OutIter>
+ inline size_t get(OutIter & out_it)
+ {
+ typedef typename std::vector< std::pair<distance_type, Value> >::const_iterator neighbors_iterator;
+ for ( neighbors_iterator it = m_neighbors.begin() ; it != m_neighbors.end() ; ++it )
+ *out_it = it->second;
+
+ return m_neighbors.size();
+ }
+
+private:
+ inline static bool neighbors_less(
+ std::pair<distance_type, Value> const& p1,
+ std::pair<distance_type, Value> const& p2)
+ {
+ return p1.first < p2.first;
+ }
+
+ size_t m_count;
+ std::vector< std::pair<distance_type, Value> > m_neighbors;
+};
+
+template <
+ typename Value,
+ typename Options,
+ typename Translator,
+ typename Box,
+ typename Point,
+ typename Predicates,
+ typename Result = typename geometry::default_distance_result<
+ Point,
+ typename Translator::indexable_type
+ >::type
+>
+class nearest
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
+ , index::nonassignable
+{
+public:
+ typedef typename rtree::node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type node;
+ typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type internal_node;
+ typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type leaf;
+
+ typedef typename geometry::default_distance_result<Point, Box>::type node_distance_type;
+
+ inline nearest(Translator const& t, Point const& pt, Predicates const& pr, Result & r)
+ : m_tr(t), m_point(pt), m_pred(pr)
+ , m_result(r)
+ {}
+
+ inline void operator()(internal_node const& n)
+ {
+ // array of active nodes
+ index::pushable_array<
+ std::pair<node_distance_type, const node *>,
+ Options::parameters_type::max_elements
+ > active_branch_list;
+
+ typedef typename rtree::elements_type<internal_node>::type elements_type;
+ elements_type const& elements = rtree::elements(n);
+
+ // fill array of nodes meeting predicates
+ for (typename elements_type::const_iterator it = elements.begin();
+ it != elements.end(); ++it)
+ {
+ if ( index::predicates_check<rtree::node_predicates_tag>(m_pred, it->first) )
+ {
+ active_branch_list.push_back(
+ std::make_pair(index::mindist(m_point, it->first), it->second)
+ );
+ }
+ }
+
+ // if there aren't any nodes in ABL - return
+ if ( active_branch_list.empty() )
+ return;
+
+ // sort array
+ std::sort(active_branch_list.begin(), active_branch_list.end(), abl_mindist_less);
+
+ // recursively visit nodes
+ for ( size_t i = 0 ;; ++i )
+ {
+ // prune nodes
+ prune_nodes(active_branch_list);
+
+ if ( active_branch_list.size() <= i )
+ break;
+
+ rtree::apply_visitor(*this, *active_branch_list[i].second);
+ }
+ }
+
+ inline void operator()(leaf const& n)
+ {
+ typedef typename rtree::elements_type<leaf>::type elements_type;
+ elements_type const& elements = rtree::elements(n);
+
+ // search leaf for closest value meeting predicates
+ for (typename elements_type::const_iterator it = elements.begin();
+ it != elements.end(); ++it)
+ {
+ if ( index::predicates_check<rtree::value_predicates_tag>(m_pred, m_tr(*it)) )
+ {
+ // store value
+ m_result.store(*it, index::mindist(m_point, m_tr(*it)));
+ }
+ }
+ }
+
+private:
+ inline static bool abl_mindist_less(
+ std::pair<node_distance_type, const node *> const& p1,
+ std::pair<node_distance_type, const node *> const& p2)
+ {
+ return p1.first < p2.first;
+ }
+
+ template <typename ActiveBranchList>
+ inline void prune_nodes(ActiveBranchList & abl) const
+ {
+ // if some value were found
+ if ( m_result.is_mindist_valid() )
+ {
+ // prune if box's mindist is further than value's mindist
+ while ( !abl.empty() &&
+ m_result.mindist() < abl.back().first )
+ {
+ abl.pop_back();
+ }
+ }
+ }
+
+ Translator const& m_tr;
+ Point const& m_point;
+ Predicates const& m_pred;
+
+ Result & m_result;
+};
+
+}}} // namespace detail::rtree::visitors
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_NEAREST_HPP

Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -26,7 +26,7 @@
     typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type leaf;
 
     inline query(Translator const& t, Predicates const& p, OutIter out_it)
- : tr(t), pred(p), out_iter(out_it)
+ : tr(t), pred(p), out_iter(out_it), found_count(0)
     {}
 
     inline void operator()(internal_node const& n)
@@ -54,6 +54,8 @@
             {
                 out_iter = *it;
                 ++out_iter;
+
+ ++found_count;
             }
         }
     }
@@ -61,6 +63,7 @@
     Translator const& tr;
     Predicates const& pred;
     OutIter out_iter;
+ size_t found_count;
 };
 
 }}} // namespace detail::rtree::visitors

Modified: sandbox-branches/geometry/index/tests/additional_glut_vis.cpp
==============================================================================
--- sandbox-branches/geometry/index/tests/additional_glut_vis.cpp (original)
+++ sandbox-branches/geometry/index/tests/additional_glut_vis.cpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -20,14 +20,36 @@
 typedef boost::geometry::model::point<float, 2, boost::geometry::cs::cartesian> P;
 typedef boost::geometry::model::box<P> B;
 //boost::geometry::index::rtree<B> t(2, 1);
+
 boost::geometry::index::rtree<
     B,
     boost::geometry::index::rstar<4, 2> > t;
 std::vector<B> vect;
 
+bool is_nearest = false;
+P search_point;
+std::vector<B> nearest_boxes;
+
 void render_scene(void)
 {
+ glClear(GL_COLOR_BUFFER_BIT);
+
     boost::geometry::index::gl_draw(t);
+
+ if ( is_nearest )
+ {
+ glColor3f(1.0f, 0.5f, 0.0f);
+ glBegin(GL_TRIANGLES);
+ glVertex3f(boost::geometry::get<0>(search_point), boost::geometry::get<1>(search_point), t.depth());
+ glVertex3f(boost::geometry::get<0>(search_point) + 1, boost::geometry::get<1>(search_point), t.depth());
+ glVertex3f(boost::geometry::get<0>(search_point) + 1, boost::geometry::get<1>(search_point) + 1, t.depth());
+ glEnd();
+
+ for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i )
+ boost::geometry::index::detail::rtree::visitors::detail::gl_draw_indexable(nearest_boxes[i], t.depth());
+ }
+
+ glFlush();
 }
 
 void resize(int w, int h)
@@ -65,16 +87,14 @@
         boost::geometry::index::insert(t, b);
         vect.push_back(b);
 
- std::cout << t << "\n\n";
-
         std::cout << "inserted: ";
         boost::geometry::index::detail::rtree::visitors::detail::print_indexable(std::cout, b);
         std::cout << '\n';
- std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK\n" : "WRONG BOXES!\n" );
- std::cout << ( boost::geometry::index::are_levels_ok(t) ? "levels OK\n" : "WRONG LEVELS!\n" );
- std::cout << "\n\n";
 
- glutPostRedisplay();
+ std::cout << "\n" << t << "\n";
+ std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK\n" : "WRONG BOXES!\n" );
+ std::cout << ( boost::geometry::index::are_levels_ok(t) ? "levels OK\n" : "WRONG LEVELS!\n" );
+ std::cout << "\n";
     }
     else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN )
     {
@@ -87,16 +107,45 @@
         boost::geometry::index::remove(t, b);
         vect.erase(vect.begin() + i);
 
- std::cout << '\n' << t << "\n\n";
         std::cout << "removed: ";
         boost::geometry::index::detail::rtree::visitors::detail::print_indexable(std::cout, b);
         std::cout << '\n';
- std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK\n" : "WRONG BOXES!\n" );
- std::cout << ( boost::geometry::index::are_levels_ok(t) ? "levels OK\n" : "WRONG LEVELS!\n" );
- std::cout << "\n\n";
 
- glutPostRedisplay();
+ std::cout << "\n" << t << "\n";
+ std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK\n" : "WRONG BOXES!\n" );
+ std::cout << ( boost::geometry::index::are_levels_ok(t) ? "levels OK\n" : "WRONG LEVELS!\n" );
+ std::cout << "\n";
+ }
+ else if ( button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN )
+ {
+ float x = ( rand() % 1000 ) / 10.0f;
+ float y = ( rand() % 1000 ) / 10.0f;
+
+ search_point = P(x, y);
+ nearest_boxes.clear();
+ is_nearest = t.nearest(search_point, 3, std::back_inserter(nearest_boxes));
+
+ if ( is_nearest )
+ {
+ std::cout << "search point: ";
+ boost::geometry::index::detail::rtree::visitors::detail::print_indexable(std::cout, search_point);
+ std::cout << "\nfound: ";
+ for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i )
+ {
+ boost::geometry::index::detail::rtree::visitors::detail::print_indexable(std::cout, nearest_boxes[i]);
+ std::cout << '\n';
+ }
+ }
+ else
+ std::cout << "nearest not found\n";
+
+ std::cout << "\n" << t << "\n";
+ std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK\n" : "WRONG BOXES!\n" );
+ std::cout << ( boost::geometry::index::are_levels_ok(t) ? "levels OK\n" : "WRONG LEVELS!\n" );
+ std::cout << "\n";
     }
+
+ glutPostRedisplay();
 }
 
 int main(int argc, char **argv)

Modified: sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp
==============================================================================
--- sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp (original)
+++ sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp 2011-09-16 15:44:04 EDT (Fri, 16 Sep 2011)
@@ -90,16 +90,21 @@
     {
         boost::mt19937 rng;
         //rng.seed(static_cast<unsigned int>(std::time(0)));
-
         float max_val = static_cast<float>(values_count / 2);
         boost::uniform_real<float> range(-max_val, max_val);
-
         boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > rnd(rng, range);
         
+ //::srand( ::time(NULL) );
+ //float factor = values_count / float(RAND_MAX);
+ //float comp = values_count / 2;
+
         std::cout << "randomizing data\n";
         for ( size_t i = 0 ; i < values_count ; ++i )
         {
             coords.push_back(std::make_pair(rnd(), rnd()));
+ //float x = rand() * factor + comp;
+ //float y = rand() * factor + comp;
+ //coords.push_back( std::make_pair( x, y ));
         }
         std::cout << "randomized\n";
     }
@@ -134,7 +139,7 @@
 
     // searching test
     {
- std::cout << "find(B) searching time test...\n";
+ std::cout << "query(intersects(B)) searching time test...\n";
         tim.restart();
         size_t temp = 0;
         for (size_t i = 0 ; i < queries_count ; ++i )
@@ -142,7 +147,7 @@
             float x = coords[i].first;
             float y = coords[i].second;
             std::deque< std::pair<B, size_t> > result;
- t.find(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
+ t.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result));
             temp += result.size();
         }
         std::cout << "time: " << tim.elapsed() << "s\n";
@@ -151,7 +156,7 @@
 
     // searching test
     {
- std::cout << "query(intersects(B)) searching time test...\n";
+ std::cout << "query(B) searching time test...\n";
         tim.restart();
         size_t temp = 0;
         for (size_t i = 0 ; i < queries_count ; ++i )
@@ -159,7 +164,7 @@
             float x = coords[i].first;
             float y = coords[i].second;
             std::deque< std::pair<B, size_t> > result;
- t.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result));
+ t.query(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
             temp += result.size();
         }
         std::cout << "time: " << tim.elapsed() << "s\n";
@@ -168,16 +173,31 @@
 
     // searching test
     {
- std::cout << "query(B) searching time test...\n";
+ std::cout << "nearest searching time test...\n";
         tim.restart();
         size_t temp = 0;
- for (size_t i = 0 ; i < queries_count ; ++i )
+ for (size_t i = 0 ; i < queries_count / 10 ; ++i )
         {
- float x = coords[i].first;
- float y = coords[i].second;
- std::deque< std::pair<B, size_t> > result;
- t.query(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
- temp += result.size();
+ float x = coords[i].first + 100;
+ float y = coords[i].second + 100;
+ std::pair<B, size_t> result;
+ temp += t.nearest(P(x, y), result);
+ }
+ std::cout << "time: " << tim.elapsed() << "s\n";
+ std::cout << "found: " << temp << "\n";
+ }
+
+ // searching test
+ {
+ std::cout << "nearest searching time test...\n";
+ tim.restart();
+ size_t temp = 0;
+ for (size_t i = 0 ; i < queries_count / 10 ; ++i )
+ {
+ float x = coords[i].first + 100;
+ float y = coords[i].second + 100;
+ std::vector< std::pair<B, size_t> > result;
+ temp += t.nearest(P(x, y), 5, std::back_inserter(result));
         }
         std::cout << "time: " << tim.elapsed() << "s\n";
         std::cout << "found: " << temp << "\n";


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk