【问题标题】:how to find self intersection in a polygon using boost/?如何使用 boost/ 在多边形中找到自交点?
【发布时间】:2016-05-09 09:26:38
【问题描述】:

我需要在多边形中找到自交点。 我知道boost有这种能力。 但我不知道如何使用 turn_info 来获取有关十字路口的信息。比如哪些段相交等等。 谁能帮忙? 谢谢

【问题讨论】:

    标签: boost polygon computational-geometry boost-geometry set-intersection


    【解决方案1】:

    您不能,因为 Boost Geometry 定义的概念不允许自相交。

    但是,您可以间接使用验证功能(我认为是 1.59 以来的新功能)来获取有关自交集的一些信息:

    std::string reason;
    poly p;
    bg::read_wkt("POLYGON((0 0, 0 4, 2 4, 2 2, 6 2, 6 6, 2 6, 2 4, 0 4, 0 8, 8 8, 8 0, 0 0))", expected);
    bool ok = bg::is_valid(p, reason);
    std::cout << "Expected: " << bg::dsv(p) << (ok?" valid":" invalid: '" + reason + "'") << "\n";
    

    打印:

    预期:(((0, 0), (0, 4), (2, 4), (2, 2), (6, 2), (6, 6), (2, 6), ( 2, 4), (0, 4), (0, 8), (8, 8), (8, 0), (0, 0))) invalid: '几何有无效的自相交。在 (0, 4) 处发现了一个自交点;方法:t;操作:x/u;分段 ID {source, multi, ring, segment}:{0, -1, -1, 0}/{0, -1, -1, 7}'

    【讨论】:

    • 我突然意识到我假设了boost-geometry。我对boost-polygon 不太熟悉,所以如果这是上下文,我的回答可能不准确。
    • 嘿,感谢您的响应。我确信您可以在多边形中找到自交点。因为我已经看到了一个代码。我只是不记得怎么了。我认为有一个使用 turn_info。但我在那边迷路了。如果您知道如何使用 get turn_info 可能会有所帮助。
    • 我实际上在 Boost Geometry 邮件列表中发现了一个帖子……讽刺的是,Adam Wulkiewicz 说“我在其他电子邮件中看到你已经弄清楚了。”。我真的认为你是时候在这里放一些链接了,甚至是自我回答——这真的是一个有用的问答。事实上,在你已经弄清楚事情之后,你有意识地冒着人们旋转轮子为你浪费时间的风险。
    • 恕我直言,让别人在你身后跑来跑去为别人指出这些提示是不好的,你自己可以轻松处理。
    【解决方案2】:

    这是获取自交点的代码。

    namespace bg = boost::geometry;
      using namespace std;
      typedef bg::model::d2::point_xy<double> point_2d;
      typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;
    
      Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25, 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 }, { 10, 0 }, { 10, 10 } }};
    
    
      typedef bg::point_type<Polygon>::type point_type;
      typedef boost::geometry::detail::overlay::turn_info<point_type, boost::geometry::segment_ratio<double> > TurnInfoType;
    
      bg::detail::no_rescale_policy robust_policy;
      bg::detail::self_get_turn_points::no_interrupt_policy interrupt_policy;
      std::vector<TurnInfoType> turns;
    
     boost::geometry::self_turns<boost::geometry::detail::overlay::assign_null_policy>(poly.outer(), robust_policy, turns, interrupt_policy);
    

    要获取信息,只需使用以下内容:

    turns[i].operations[0].seg_id.segment_index
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多