8

如何将 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,但任何事情都可以。

4

3 回答 3

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 函数更正为(注意 << 用法),这将起作用:

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

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

于 2013-03-13T20:43:04.527 回答
0

For example:

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

So, polygon.outer() is std::vector (external one, as Barend Gehrels said). See here: boost reference

于 2014-04-14T11:08:55.940 回答
0

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

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

假设您想要“hull”对象(或任何多边形,包括原始“poly”)外环中的所有点,只需对其进行迭代并将它们逐点添加到标准向量中。

如果您想要 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 ) );
}
于 2015-01-30T09:35:17.693 回答