简体   繁体   English

使用提升几何将提升段分成 N 个相等的段

[英]divide boost segment into N equal segments using boost geometry

I created a line segment using boost geometry model.我使用增强几何模型创建了一个线段。 I am wondering if there is a way in boost to divide the segment into N equal line segments.我想知道是否有一种方法可以将段分成 N 个相等的线段。

Please do not consider this question as duplicated version of this .请不要考虑这个问题,因为重复的版本这个 ( EDIT ) because is over-dated and I have already tried the answer provided for this question. (编辑) 因为已经过时了,我已经尝试过为这个问题提供的答案。

The simplest thing that comes to mind:想到的最简单的事情:

Live On Coliru 住在 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";
}

Prints印刷

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

Fancy Range Version花式系列版本

One that might scale better for large N:对于大 N 可能更好地扩展的一种:

Live On Coliru 住在 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) };
}

Prints印刷

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

If you need to divide AB segment to N equal pieces, then coordinates of starting point for i-th segment (and the end of previous segment) might be calculated using parametric equation of line.如果您需要将AB段分成N等份,则可以使用参数线方程计算第i段(和前一段的结束)的起点坐标。
Pseudocode:伪代码:

for i = 0.. N-1
   t = i / N
   Start[i].X = A.X * (1 - t) + B.X * t
   Start[i].Y = A.Y * (1 - t) + B.Y * t

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM