8 Mart 2018 Perşembe

geometry rtree Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/geometry.hpp>
#include <boost/geometry/extensions/index/rtree/rtree.hpp>
Kolay kullanım için şu şöyle yaparız.
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
rtree space partitioning çözümlerinde bir tanesidir. Bu yapı K-means Clustering gibi clustering (kümeleme) desteği sunmaz.

Tanımlama - box
Şöyle yaparız.
typedef bg::model::point<float,2,bg::cs::cartesian> Point;
typedef bg::model::box<Point> Box;

typedef bgi::rtree<Box,unsigned > RTree;
Tanımlama - std::pair - Box
Şöyle yaparız.
typedef  std::pair<Box,  int>  Value; 
typedef  bgi::rtree<Value,  bgi::linear<32>  >  RTree; 
Şöyle yaparız.
typedef std::pair<box_t, Data> Value;
typedef rtree<Value, bgi::quadratic<16>> RTree;
Tanımlama - std::pair - Point
Örnek
3 boyutlu nokta için şöyle yaparız.
typedef bg::model::point<double , 3, bg::cs::cartesian> BoostPoint;
typedef std::pair<BoostPoint, unsigned> PointValue;
  
typedef bgi::rtree< PointValue, bgi::quadratic<16> > RTree;
3 boyutlu nokta ve dynamic_quadratic için şöyle yaparız.
typedef bgi::rtree<PointValue, bgi::dynamic_quadratic> RTree;
Örnek
İki boyutlu nokta için şöyle yaparız.
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef std::pair<point, unsigned> value;

bgi::rtree< value, bgi::quadratic<16> > rtree;
Constructor - default
Şöyle yaparız.
RTree  rtree; 
Constructor
Şöyle yaparız.
RTree rtree (6,3);
Constructor - Vector
Örnek
Şöyle yaparız.
std::vector<PointValue> points;
for(...)
{
  //fill in the points vector
}

RTree rtree (points);
Örnek
Eğer şöyle tanımladıysak
typedef bgi::rtree<PointValue, bgi::dynamic_quadratic> RTree;
Şöyle yaparız.
RTree rtree (points, points.size());
Örnek
Şöyle yaparız.
std::vector<std::pair<my_point, int>> pts;
pts.emplace_back(std::make_pair(my_point(2,2), 5));
pts.emplace_back(std::make_pair(my_point(3,3), 1));
pts.emplace_back(std::make_pair(my_point(4,5), 3));
pts.emplace_back(std::make_pair(my_point(4,4), 12));
pts.emplace_back(std::make_pair(my_point(1,2), 50));
// ....

bgi::rtree<std::pair<my_point, int>, bgi::dynamic_rstar>
  rtree(pts, bgi::dynamic_rstar(pts.size()));
begin metodu
Şöyle yaparız.
auto it = rtree.begin();
bounds metodu
Örnek ver.
clear metodu 
Örnek ver.
count metodu 
Örnek ver.
elements metodu
Şöyle yaparız.
std::cout<<"number of elements: ";
std::cout<<rtree.elements()<<std::endl;
empty metodu
Şöyle yaparız.
while(!rtree.empty()) {
  ...
}
find metodu
Eğer rtree box ve index içeriyorsa şöyle yaparız.
box query_box = ...;
//search for boxes that are within query_box
std::deque<unsigned> &boxValue = rtree.find (query_box);
insert metodu - box
Eğer rtree box ve index içeriyorsa şöyle yaparız.
unsigned i=0;
box b = ...;
rtree.insert (b,i);
insert metodu - iterator
Şöyle yaparız.
std::vector<Value>  values; 
/*fill the values container*/ 

rtree.insert(values.begin(),  values.end()); 
insert metodu - point
Şöyle yaparız.
// create some values
for ( unsigned i = 0 ; i < 10 ; ++i )
{
  point p = point(i, i);
  rtree.insert(std::make_pair(p, i));
}
print metodu
Şöyle yaparız.
rtree.print();
query metodu - point
Açıklaması şöyle. Buna KNN sorgusu deniyor. K tane nearest neighbor anlamına gelir.
"Get me the nearest 'n' points from here"
query - nearest
Elimizde bir nokta yani p olsun. p'ye en yakın noktaları bulur.

Örnek
Şöyle yaparız
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/index/predicates.hpp>

using Point   = boost::geometry::model::point<float, 2,boost::geometry::cs::cartesian>;
using Segment = boost::geometry::model::segment<Point>;
using Value   = std::pair<Segment, size_t>;


boost::geometry::index::rtree<Value, boost::geometry::index::rstar<16>> rtree;

std::vector<Value> results;
rtree.query(boost::geometry::index::nearest(Point(1, 2), 1), std::back_inserter(results));

Örnek
En yakın noktaları bulup silmek için şöyle yaparız.
value match;
if (rtree.query(bgi::nearest(p, 1), &match)) {
  ...
}
Daha sonra şöyle yaparız.
if (bg::distance(p, match.first) <= 3) {
  rtree.remove(match);
}
query metodu - rectangular box
Açıklaması şöyle
"Get me all the points that are inside this rectangle"
Şöyle yaparız.
my_box box1(1,1,4,4);
std::vector<std::pair<my_point, int>> result;
rtree.query(bgi::covered_by(box1), std::back_inserter(result));
for(const auto &r: result){
  std::cout << r.second << ' ' << '\n';
}
query metodu - user defined query
Şöyle yaparız.
// search for nearest neighbours
std::vector<value> 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));
qbegin metodu - point
Şöyle yaparız.
rtree.qbegin(bgi::nearest(Point(4, 4), 2))
Şöyle yaparız.
for ( Rtree::const_query_iterator it = tree.qbegin(bgi::nearest(pt, 10000)) ;
  it != tree.qend() ; ++it )
{
  // do something with value
   ...
}
remove metodu
Şöyle yaparız.
auto it = rtree.begin();
auto value = *it;
rtree.remove (value);

Hiç yorum yok:

Yorum Gönder