mirror of
https://github.com/boostorg/geometry.git
synced 2026-02-02 21:02:13 +00:00
Add a tip about usage of Boost.Range adaptors with the rtree. Add an example of usage of Boost.Range adaptors. Replace invalid main(void) with main() in examples. Fix MSVC type conversion warnings in examples.
80 lines
2.1 KiB
C++
80 lines
2.1 KiB
C++
// Boost.Geometry Index
|
|
//
|
|
// Quickbook Examples
|
|
//
|
|
// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
|
|
//
|
|
// 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)
|
|
|
|
//[rtree_range_adaptors
|
|
|
|
#include <boost/geometry.hpp>
|
|
#include <boost/geometry/geometries/point.hpp>
|
|
#include <boost/geometry/geometries/box.hpp>
|
|
|
|
#include <boost/geometry/index/rtree.hpp>
|
|
|
|
// Boost.Range
|
|
#include <boost/range.hpp>
|
|
// adaptors
|
|
#include <boost/range/adaptor/indexed.hpp>
|
|
#include <boost/range/adaptor/transformed.hpp>
|
|
|
|
// a container
|
|
#include <vector>
|
|
|
|
// just for output
|
|
#include <iostream>
|
|
|
|
namespace bg = boost::geometry;
|
|
namespace bgi = boost::geometry::index;
|
|
|
|
// Define a function object converting a value_type of indexed Range into std::pair<>.
|
|
// This is a generic implementation but of course it'd be possible to use some
|
|
// specific types. One could also take Value as template parameter and access
|
|
// first_type and second_type members, etc.
|
|
template <typename First, typename Second>
|
|
struct pair_maker
|
|
{
|
|
typedef std::pair<First, Second> result_type;
|
|
template<typename T>
|
|
inline result_type operator()(T const& v) const
|
|
{
|
|
return result_type(v.value(), v.index());
|
|
}
|
|
};
|
|
|
|
int main()
|
|
{
|
|
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
|
|
typedef bg::model::box<point> box;
|
|
|
|
typedef std::vector<box> container;
|
|
typedef container::size_type size_type;
|
|
|
|
typedef std::pair<box, size_type> value;
|
|
|
|
// create a container of boxes
|
|
container boxes;
|
|
for ( size_type i = 0 ; i < 10 ; ++i )
|
|
{
|
|
// add a box into the container
|
|
box b(point(i + 0.0f, i + 0.0f), point(i + 0.5f, i + 0.5f));
|
|
boxes.push_back(b);
|
|
}
|
|
|
|
// create the rtree using default constructor
|
|
bgi::rtree< value, bgi::quadratic<16> >
|
|
rtree(boxes | boost::adaptors::indexed()
|
|
| boost::adaptors::transformed(pair_maker<box, size_type>()));
|
|
|
|
// print the number of values using boxes[0] as indexable
|
|
std::cout << rtree.count(boxes[0]) << std::endl;
|
|
|
|
return 0;
|
|
}
|
|
|
|
//]
|