boost :: geometry: Как сделать for_each_segment? - PullRequest
2 голосов
/ 09 декабря 2011

Я пытаюсь выяснить, how boost::geometry for_each_segment работает.Документация говорит мне, что 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.

1 Ответ

2 голосов
/ 10 декабря 2011

Измените строку

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

на

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

Это позволит вам выполнить компиляцию.


Из документации по сегмент и referring_segment , единственное различие между ними состоит в том, что referring_segment содержит ссылку на точки.Это то, что нужно для каждого, который изменяет сегмент, так как измененные точки должны быть отражены в linestring.В a для каждого, который не изменяет точки, он все равно должен брать ссылку (скорее всего, ссылку const), так как это уменьшает количество копий.

...