9 Ağustos 2016 Salı

boost geometry

Giriş
Şu satırı dahil ederiz.
#include <boost/geometry.hpp>
Kolay çalışmak için şöyle yaparız.
namespace bg = boost::geometry;
Kendi Sınıfım
Elimde şöyle bir yapı olsun
struct mypoint
{
  double x, y;
};
Önce access metodunu tanımlarım.
namespace traits
{
  template <typename, int>
  struct access;
  
}
Daha sonra 0 ve 1 gibi indeksler için erişim metodları yazarım.
namespace traits
{
  template <>
  struct access<mypoint, 0>
  {
    static double get(mypoint const& p)
    {
      return p.x;
    }
  };

  template <>
  struct access<mypoint, 1>
  {
    static double get(mypoint const& p)
    {
      return p.y;
    }
  };
}
Şöyle kullanırım.
get<0>(a) - get<0>(b);
point_xy Sınıfı
Şu satırı dahil ederiz.
#include <boost/geometry/geometries/point_xy.hpp>
Tanimlama
Şöyle yaparız.
typedef boost::geometry::model::d2::point_xy<double> boostPoint;
point Sınıfı
Şu satırı dahil ederiz.
#include <boost/geometry/geometries/point.hpp>
Tanımlama
Şöyle yaparız.
typedef bg::model::point<double, 2, bg::cs::cartesian> point;
Constructor
Şöyle yaparız.
point(1., 0.)
Point İçin Free Style Metodlar
distance
İki nokta arasındaki mesafeyi verir. Şöyle yaparız.

boostPoint boostPt1 = ...;
boostPoint boostPt2 = ...;

double distance= boost::geometry::distance(boostPt1, boostPt2);
line_string Sınıfı
boost geomerty line_string Sınıfı yazısına taşıdım.

polygon Sınıfı
Şu satırı dahil ederiz.
#include <boost/geometry/geometries/polygon.hpp>
Genellikle şu satırlar da dahil edilir.
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
Kapalı polygon
Varsayılan polygon kapalı ve saat yönündedir. Polygon doldurulurken ilk ve son noktanın aynı olması gerekir.

Açık polygon
Şöyle tanımlanır
polygon <point_type,true,false>

İç ve dış noktalar vector ile tutulur. Dolayısıyla vector metodları kullanılabilir.

Tanımlama
Polygon noktalardan oluştuğu için Point sınıfı ile beraber tanımlanır. Şöyle yaparız.
typedef bg::model::point <double, 2, bg::cs::cartesian> point_type;
typedef bg::model::polygon <point_type> polygon;
Şöyle yaparız.
typedef bg::model::d2::point_xy<double> point_type;
typedef bg::model::polygon<point_type> polygon;
Constructor
Şöyle yaparız.
polygon p;
inner metodu
Polygon içindeki boşluklar inner dizilerine yazılır. Örnek ver.

outer metodu
Polygon dış noktaları outer dizisine yazılır. Açık polygon için şöyle yaparız.
p.outer().push_back(point(0., 0.));
p.outer().push_back(point(1., 0.));
Kapalı polygon için şöyle yaparız.
p.outer().push_back(point_type{10,10});
p.outer().push_back(point_type{11,10});
p.outer().push_back(point_type{10,11});
p.outer().push_back(point_type{10,10});
Yazdırma
Şöyle yaparız.
std::cout << bg::wkt<polygon>(p) << std::endl;
Çıktı olarak şunu alırız.
POLYGON((0 0,1 0,1 2,2 3,0 4))
Polygon İçin Free Style Metodlar
correct metodu
Şu satırı dahil ederiz.
#include <boost/geometry/algorithms/correct.hpp>
Şöyle yaparız.
bg::correct(p);
intersection metodu
Şöyle yaparız.
using point_type = boost::geometry::model::d2::point_xy<double>;
using polygon_type = boost::geometry::model::polygon<point_type>;
using linestring_type = boost::geometry::model::linestring<point_type>;

polygon_type polygon;
...
linestring_type linestring;
...
linestring_type output;
boost::geometry::intersection(polygon, linestring, output);
Kesişimi şöyle dolaşırız.
for(auto iter = output.begin(); iter != output.end(); ++iter) {
  cout << boost::geometry::get<0>(*iter)  << " "
       << boostt::geometry::get<1>(*iter) << endl;
}
Çıktı olarak şunu alırız.
// The output is:
//    11 10
//    12 11
is_valid metodu
Şu satırı dahil ederiz.
#include <boost/geometry/algorithms/is_valid.hpp>
Şöyle yaparız.
typedef bg::model::d2::point_xy<double> TPoint;
typedef bg::model::polygon<TPoint>      TPoly;
TPoly p;

bg::read_wkt("POLYGON((1.504477611940313 3.761194029850755, ...))", p);

std::string reason;
// polys not closed!
if (!bg::is_valid(first, reason))
  std::cout << "polygon not valid: "  << reason << "\n";
read_wkt metodu
Şöyle yaparız.
boost::geometry::read_wkt("POLYGON((-57.0635 -3.58045, ...))", p);
within metodu
Şöyle yaparız.
point_type point (-57.8088, -1.5755);
bool result = boost::geometry::within (point, p);
svg_mapper Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <boost/geometry/io/svg/svg_mapper.hpp>
Tanımlama
Şöyle yaparız.
typedef boost::geometry::model::d2::point_xy<double> point_type;
typedef boost::geometry::svg_mapper<point_type> mapper_type;
Constructor
Şöyle yaparız.
std::ofstream svg("map.svg");
mapper_type mapper(svg, 400, 400);
add metodu
Bir çizgi eklemek için şöyle yaparız.
typedef boost::geometry::model::d2::point_xy<double> point_type;
typedef boost::geometry::model::linestring<point_type> linestring_type;
typedef boost::geometry::svg_mapper<point_type> mapper_type;

linestring_type line {{0.0, 0.0}, {100.0, 0.0}, {400.0, 400.0}};
mapper.add (line);
Polygon eklemek için şöyle yaparız.
typedef boost::geometry::model::d2::point_xy<double> point_type;
typedef boost::geometry::model::polygon<point_type> polygon_type;

polygon_type polygon;
...
mapper.add (polygon);
map metodu
Line yazdırmak için şöyle yaparız.
mapper.map (line, "stroke:rgb(250,0,0);stroke-width:2");
Polygon yazdırmak için şöyle yaparız.

mapper.map(polygon, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1");
map_transformer Sınıfı
Tanımlama
Şöyle yaparız. 4. parametre başlangıç noktasını sol alt köşe yapar.
typedef strategy::transform::map_transformer
    <
        calculation_type,
        geometry::dimension<Point>::type::value,
        geometry::dimension<Point>::type::value,
        true,  // <== Mirror in Y direction!!!
        SameScale
    > transformer_type;







Hiç yorum yok:

Yorum Gönder