boost::geometry: nearest neighbors using a circle

前端 未结 2 1741
借酒劲吻你
借酒劲吻你 2020-12-15 09:46

I am using the Rtree implementation of boost::geometry to store (lots of) 2D points. Now I need to do distance-based nearest neigbors queries.

However, the manual on

2条回答
  •  感情败类
    2020-12-15 10:17

    The last example in the documented "User-defined queries" shows how to use a lambda in the predicate. This lambda can bind other variables in the scope, for instance, the point whose neighbors you are looking for.

    Here is a small example. The example looks for points that are closer to (5, 5) than 2 units, for a collection of points that lie on the straight y = x. It should be easy to modify in order to check first if the sought point is in the R-tree, or get it directly out of the R-tree.

    #include 
    
    #include 
    #include 
    #include 
    
    
    namespace bg = boost::geometry;
    namespace bgi = boost::geometry::index;
    
    typedef bg::model::point point;
    typedef std::pair value;
    
    int main(int argc, char *argv[])
    {
        bgi::rtree< value, bgi::quadratic<16> > rtree;
    
        // create some values
        for ( unsigned i = 0 ; i < 10 ; ++i )
        {
            point p = point(i, i);
            rtree.insert(std::make_pair(p, i));
        }
    
        // search for nearest neighbours
        std::vector returned_values;
        point sought = point(5, 5);
        rtree.query(bgi::satisfies([&](value const& v) {return bg::distance(v.first, sought) < 2;}),
                    std::back_inserter(returned_values));
    
        // print returned values
        value to_print_out;
        for (size_t i = 0; i < returned_values.size(); i++) {
            to_print_out = returned_values[i];
            float x = to_print_out.first.get<0>();
            float y = to_print_out.first.get<1>();
            std::cout << "Select point: " << to_print_out.second << std::endl;
            std::cout << "x: " << x << ", y: " << y << std::endl;
        }
    
        return 0;
    }
    

    Compile and run with Boost installed via Macports on OS X:

    $ c++ -std=c++11 -I/opt/local/include -L/opt/local/lib main.cpp -o geom && ./geom
    Select point: 4
    x: 4, y: 4
    Select point: 5
    x: 5, y: 5
    Select point: 6
    x: 6, y: 6
    

提交回复
热议问题