boost::geometry: How to do for_each_segment?

boost::geometry: How to do for_each_segment?

本文关键字:each for segment do geometry How to boost      更新时间:2023-10-16

我试着弄清楚how boost::geometryfor_each_segment list工作。文档告诉我,for_each_segment需要一个几何和函子。这个函子在我的例子中被称为polylength_helper,只要这个代码片段没有编译,我就在那里增加一个数字以保持事情简单,直到它编译。

// foo.h
typedef boost::geometry::model::point<double, 2, bg::cs::cartesian> GeographicPoint;
typedef boost::geometry::model::linestring<GeographicPoint> GeographicPolyLine;
typedef boost::geometry::model::segment<GeographicPoint> GeographicSegment;
double poly_length(const GeographicPolyLine&);
template<typename Segment>
struct polylength_helper{
    polylength_helper() : length(0){};
    inline void operator()(Segment s){
        length += 1;
    };
    double length;
};
// foo.cpp
double poly_length(GeographicPolyLine &poly){
    polylength_helper<GeographicSegment> helper;
    bg::for_each_segment(poly, helper);
    return helper.length;
}

这个不能编译。我使用clang以获得更易于理解的输出,它表示:

note: candidate function not viable: no known
conversion from 'model::referring_segment<point_type>' to
'boost::geometry::model::segment<boost::geometry::model::point<double, 2,
  boost::geometry::cs::cartesian> >' for 1st argument
inline void operator()(Segment s){
            ^
有谁能帮我吗?特别是我不知道消息中的referring_segment来自哪里。

下面是一个来自文档的例子:

http://www.boost.org/doc/libs/1_48_0/libs/geometry/doc/html/geometry/reference/algorithms/for_each/for_each_segment_2_const_version.html

但是我不知道这和我的版本有什么不同,除了typedef s。

修改行

typedef boost::geometry::model::segment<GeographicPoint> GeographicSegment;

typedef boost::geometry::model::referring_segment<GeographicPoint> GeographicSegment;

这将让你编译。


从关于segment和referring_segment的文档来看,两者之间的唯一区别是referring_segment保存了对点的引用。这是a中每个修改段所需要的,因为修改的点应该反映在linestring中。在a中,for each不修改点,它仍然应该接受一个引用(很可能是const引用),因为它减少了复制的数量。