gpt4 book ai didi

c++ - C++中Boost.Geometry中的多边形转换:直线的平移,旋转,反射

转载 作者:行者123 更新时间:2023-12-02 10:13:25 29 4
gpt4 key购买 nike

对于使用boost-geometry实现的多边形,我有三种查询类型:

  • 将多边形转换为给定点
  • 围绕引用点旋转多边形(不一定关于原点)
  • 反射(reflect)线周围的多边形

  • 由于我是Boost Geomtry的新手,因此在理解语法时遇到了问题。我搜索了一些满足我要求的示例,但没有找到一个示例,或者发现了一些我难以理解的示例。
    您能否给出任何示例代码来实现查询而几乎不加解释?

    最佳答案

    我在库中知道的最通用的转换是矩阵转换,这是可以与transform一起使用的策略。
    让我们生成一些随机的矩形,它们以随机的 Angular 旋转,在(-500..500,-500..500)上平移并在1..3之间缩放:

    polygon gen_rectangle() {
    using box = bgm::box<point_xy>;
    polygon raw, result;
    box initial { {0, 0}, { rand(1, 1'000), rand(1, 1'000) } };
    bg::correct(raw);
    bg::assign(raw, initial);

    using namespace bg::strategy::transform;
    auto rot = rand(-M_PI, +M_PI);
    auto scale = rand(1.0, 3.0);
    auto x = rand(-500.0, 500.0),
    y = rand(-500.0, 500.0);

    matrix_transformer<double, 2, 2> xfrm(
    scale* cos(rot), scale*sin(rot), x,
    scale*-sin(rot), scale*cos(rot), y,
    0, 0, 1);

    boost::geometry::transform(raw, result, xfrm);
    return result;
    }
    写一些框架:
    int main(int argc, char** argv) {
    auto const seed = argc>1? std::stoul(argv[1]) : std::random_device{}();
    prng.seed(seed);

    // generate shapes
    for (int frame = 0; frame < 30; ++frame) {
    multi_polygon shapes, merged;
    std::generate_n(back_inserter(shapes), 10, gen_rectangle);
    save_frame(shapes, frame);
    }
    }
    结果是:
    enter image description here
    在线镜像
    我认为该转换不涉及上述内容(尽管您可能可以通过适当的翻译来表达其中的任何一种,然后再进行旋转和另一种翻译?)。
    我会通过逐点变换来攻击这一点,在该变换中,您将点投影在一条线上(例如参见 How to find two points that form closest distance between two rectangles?,但是比较复杂,因为您可以假设无限的线,而不是线段),而在另一条线上延伸相同的距离侧。
    完整的演示代码
    Live On Coliru
    #include <boost/geometry.hpp>
    #include <boost/geometry/strategies/transform/matrix_transformers.hpp>
    #include <boost/geometry/geometries/point_xy.hpp>
    #include <boost/geometry/geometries/polygon.hpp>
    #include <boost/geometry/geometries/multi_polygon.hpp>
    #include <iostream>
    #include <fstream>
    #include <iomanip>
    #include <random>

    namespace bg = boost::geometry;
    namespace bgm = bg::model;

    using point_xy = bgm::d2::point_xy<double>;
    using polygon = bgm::polygon<point_xy>;
    using multi_polygon = bgm::multi_polygon<polygon>;

    static std::mt19937 prng;
    void save_frame(multi_polygon const& p, int frameno);
    polygon gen_rectangle();

    int main(int argc, char** argv) {
    auto const seed = argc>1? std::stoul(argv[1]) : std::random_device{}();
    prng.seed(seed);

    // generate shapes
    for (int frame = 0; frame < 30; ++frame) {
    multi_polygon shapes, merged;
    std::generate_n(back_inserter(shapes), 10, gen_rectangle);
    save_frame(shapes, frame);
    }
    }

    static inline double rand(double b, double e) { return std::uniform_real_distribution<double>(b, e)(prng); }

    // generate rectangle shape with varying sizes, positions and rotations
    polygon gen_rectangle() {
    using box = bgm::box<point_xy>;
    polygon raw, result;
    box initial { {0, 0}, { rand(1, 1'000), rand(1, 1'000) } };
    bg::assign(raw, initial);

    using namespace bg::strategy::transform;
    double rot = rand(-M_PI, +M_PI);
    double scale = rand(1.0, 3.0);
    double x = rand(-500.0, 500.0),
    y = rand(-500.0, 500.0);

    matrix_transformer<double, 2, 2> xfrm(
    scale* cos(rot), scale*sin(rot), x,
    scale*-sin(rot), scale*cos(rot), y,
    0, 0, 1);

    boost::geometry::transform(raw, result, xfrm);
    return result;
    }

    void save_frame(multi_polygon const& p, int frameno) {
    std::ostringstream name;
    name << "frame" << std::setw(4) << std::setfill('0') << frameno << ".svg";
    std::ofstream ofs(name.str());
    bg::svg_mapper<point_xy> mapper(ofs, 400, 400);

    mapper.add(p);
    mapper.map(p, "fill-opacity:0.5;fill:rgb(204,153,0);stroke:rgb(204,153,0);stroke-width:1", 5);
    }

    关于c++ - C++中Boost.Geometry中的多边形转换:直线的平移,旋转,反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62730299/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com