将boost :: geometry多边形转换为STL对象

时间:2013-03-13 19:07:47

标签: c++ boost boost-geometry

如何将boost :: geometry多边形转换为STL对象?

我确信这一定很简单,因为我无法在文档中找到任何示例。然而,我花了大约4个工作日试图做这件小事。我是C ++的新手(长时间的R程序员),但这些小数据转换事件让我疯狂。

是的,有一个问题的标题与我的很相似:Getting the coordinates of points from a Boost Geometry polygon

但代码是如此复杂(并且海报不断更改它),我无法做出正面或反面,我也无法想象其他C ++新手能够做到。

这是一个简单的例子,应该转换为其他一些boost :: geometry数据类型,所以希望任何人都可以关注它。

 #include <iostream>

 #include <boost/geometry.hpp>
 #include <boost/geometry/geometries/polygon.hpp>
 #include <boost/geometry/geometries/adapted/boost_tuple.hpp>

 BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)

 //One thing I tried is a function to use with `for_each_point()` so I set that up first.

  template <typename Point>
  void get_coordinates(Point const& p)
  {
  using boost::geometry::get;
  std::cout << get<0>(p) get<1>(p) << std::endl;
  }

  int main()
  {
  typedef boost::tuple<double, double> point;
  typedef boost::geometry::model::polygon<point> polygon;

  polygon poly;
  boost::geometry::read_wkt("polygon((2.0 1.3, 2.4 1.7, 2.8 1.8, 3.4 1.2, 3.7 1.6, 3.4 2.0, 4.1 3.0, 5.3 2.6, 5.4 1.2, 4.9 0.8, 2.9 0.7, 2.0 1.3))", poly);

   polygon hull;
   boost::geometry::convex_hull(poly, hull);

 // Now I know I can `dsv()` and print to the screen like this:

  using boost::geometry::dsv;
  std::cout
    << "hull: " << dsv(hull) << std::endl;

  // And/Or I can use my function with for_each_point()



  boost::geometry::for_each_point(hull, get_coordinates<point>);

return 0;
}

如何将这些坐标放入STL容器?我更喜欢两个std :: vector一个用于x,一个用于y,但任何事情都可以。

3 个答案:

答案 0 :(得分:5)

多边形已经是STL容器格式,默认情况下,boost :: geometry :: polygon的外环和内环存储了一个std :: vector。

您可能想要的(考虑您的意见)是:

  polygon hull;
  boost::geometry::convex_hull(poly, hull);
  boost::geometry::for_each_point(boost::geometry::exterior_ring(hull), get_coordinates<point>);

如果您将get_coordinates函数更正为(注意&lt;&lt; usage):

,这将有效
  template <typename Point>
  void get_coordinates(Point const& p)
  {
      using boost::geometry::get;
      std::cout << get<0>(p) << ", " << get<1>(p) << std::endl;
  }

并将评论指标更改为//; - )

答案 1 :(得分:0)

例如:

boost::geometry::model::polygon<Point> polygon;
polygon.outer().push_back( point );

因此,polygon.outer()是std :: vector(外部的,如Barend Gehrels所说)。 见这里:boost reference

答案 2 :(得分:0)

您可以使用带有boost模型的迭代器迭代所有点并将它们添加到您喜欢的任何类型的容器中。

多边形模型稍微复杂一些,因为它们有一个外部环,可能有多个内环。

假设你想要&#34;船体外环中的所有点&#34;对象(或任何多边形,包括原始&#34; poly&#34;),只需迭代它并将它们逐点添加到标准向量中。

如果你想要x的向量和y的向量,请使用相同的方法。

::std::vector< point > hullPoints;
::std::vector< double > hullXPoints;
::std::vector< double > hullYPoints;

// the auto keyword makes declaring iterators easy
for ( auto hullIterator = hull.outer().begin;
      hullIterator != hull.outer().end();
      ++hullIterator )
{
     // for a vector of point types, just add the points one by one
     hullPoints.push_back( *hullIterator );

     // for vectors of x and y, extract the x/y from the point
     hullXPoints.push_back( get<0>( *hullIterator ) );
     hullYPoints.push_back( get<1>( *hullIterator ) );
}