c++ - 使用boost geometry将boost段分成N个相等的段

标签 c++ geometry boost-geometry

我使用 boost 几何模型创建了一条线段。我想知道是否有一种方法可以在 boost 中将线段划分为 N 个相等的线段。

请不要将此问题视为 this 的重复版本. (编辑) 因为已经过时了,我已经尝试过为这个问题提供的答案。

最佳答案

想到的最简单的事情:

Live On Coliru

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/arithmetic/arithmetic.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/linestring.hpp>

#include <iostream>

template <typename Segment, typename Point = typename boost::geometry::point_type<Segment>::type>
auto split_into(unsigned N, Segment const& s) {
    using namespace boost::geometry;
    assert(N>1);

    auto step = s.second;
    subtract_point(step, s.first);
    divide_value(step, N-1);

    std::vector<Point> segments;
    std::generate_n(back_inserter(segments), N, [accu=s.first, step] () mutable { Point p = accu; return add_point(accu, step), p; });

    return model::linestring<Point> {segments.begin(), segments.end()};
}

using namespace boost::geometry;
using Point = model::d2::point_xy<double>;

int main() {
    model::segment<Point> const line { {1,3}, {11,33} };

    std::cout << wkt(line) << "\n";
    std::cout << wkt(split_into(5, line)) << "\n";
}

打印

LINESTRING(1 3,11 33)
LINESTRING(1 3,3.5 10.5,6 18,8.5 25.5,11 33)

花式范围版本

对于大 N 可能更好地扩展:

Live On Coliru

#include <boost/range/adaptors.hpp>
#include <boost/range/irange.hpp>

template <typename Segment, typename Point = typename boost::geometry::point_type<Segment>::type>
auto split_into(unsigned N, Segment const& s) {
    using namespace boost::geometry;
    using namespace boost::adaptors;
    assert(N>1);

    auto step = s.second;
    subtract_point(step, s.first);
    divide_value(step, N-1);

    auto gen = boost::irange(0u, N) | transformed([=](int i) { auto p = step; multiply_value(p, i); add_point(p, s.first); return p; });
    return model::linestring<Point> { boost::begin(gen), boost::end(gen) };
}

打印

LINESTRING(1 3,11 33)
LINESTRING(1 3,3.5 10.5,6 18,8.5 25.5,11 33)

关于c++ - 使用boost geometry将boost段分成N个相等的段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127895/

相关文章:

c++ - 如果类字段未初始化,为什么在 C++ 中没有编译时错误?

Java - 获取缓冲图像上圆圈内的所有像素

c++ - 在坐标类型上对我的类进行模板化并使用 Boost Geometry 库时出现编译错误

c++ - 让 Howard Hinnant 的 short_alloc(C++11 版本)在 Visual C++ 2015 中编译

c++ - 使用 vector C++

Android OpenCV 检测圆需要太多的 FPS

javascript - 查找距离另一个坐标一定距离的坐标

algorithm - 从椭圆到静态多边形集的距离

c++ - 在循环中重复使用 boost::geometry::intersection

具有非类型参数 : how to overload the assign operator? 的 C++ 模板类