19 Ağustos 2016 Cuma

CvMat Yapısı

Giriş
C ile programlarken kullanılır.

cvCreateMat metodu
Boş bir matris yaratır. Şöyle yaparız
CvMat* m = cvCreateMat(3, 3, CV_32FC1);
cvRelease metodu
Şöyle yaparız.
CvMat* m = ...;
cvReleaseMat(&m);
cvSetData metodu
Boş matrise veri atar. Şöyle yaparız
float data[9] = {0, 1, 2, 3,  4, 5, 6, 7, 8};
cvSetData(m, data, m->step);


10 Ağustos 2016 Çarşamba

python'dan C++ Kullanmak

BOOST_PYTHON_IMPORT
Şöyle yaparız.
class A {
    ... // constructor is omitted 
public:
    const std::string str1;
};
class B {
public:
    std::shared_ptr<A> a;
}

BOOST_PYTHON_IMPORT(wrapped) {

    class_<A, std::shared_ptr<A>>("APy")
    .def_readonly("str1", &A::str1);

    class_<B>("BPy")
    .def_readwrite("a", &B::a);
}
Python'da kullanmak için şöyle yaparız.
import wrapped as wr
b = wr.BPy()
s1 = b.a.str1 // APy wrapper created
s2 = b.a.str1 // new APy wrapper created even though object is the same

class_ Sınıfı
C++ kodunu python'dan çağırmak için kullanılır

Constructor
Elimizde şöyle bir sınıf olsun
class Example
{
public:
  Example()
  {
    std::cout << "hello\n";
  }
  Example(const Example& e)
  {
    std::cout << "copy\n";
    counter++;
  }
  ~Example()
  {
    std::cout << "bye\n";
  }
  Example& count()
  {
    std::cout << "Count: " << counter << std::endl;
    return *this;
  }
  static int counter;
};
int Example::counter = 0;
Şöyle yaparız.
class_<Example>("Example", init<>())
def metodu
Açıklaması şöyle. C++ kodunda & kullanılsa bile nesnelerin copy constructor metodunun çağrılmasını sağlar.
copy_non_const_reference is a model of ResultConverterGenerator which can be used to wrap C++ functions returning a reference-to-non-const type such that the referenced value is copied into a new Python object.
Şöyle yaparız.
usingclass_ c;
c.def("count", &Example::count,
 return_value_policy<copy_non_const_reference>());
Bu sınıfı Python'da kullanmak için şöyle yaparız.
obj=Example()
obj.count().count()

9 Ağustos 2016 Salı

boost geometry line_string Sınıfı

Giriş
Şu satırları dahil ederiz.
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/linestring.hpp>
Tanımlama
Şöyle yaparız.
typedef boost::geometry::model::d2::point_xy<double> point_type;
typedef boost::geometry::model::linestring<point_type> linestring_type;
Constructor
Şöyle yaparız.
linestring_type line {{0.0, 0.0}, {100.0, 0.0}, {400.0, 400.0}};
push_back metodu
Şöyle yaparız.
linestring.push_back(point_type{11,9});
Diğer
Elimizde dolu bir line_string olsun.
linestring_type output;
...
Şö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;
}



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;