如何使用boost /?找到多边形中的自相交

时间:2016-05-09 09:26:39

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

我需要在多边形中找到自交叉点。 我知道助力有这种能力。 但我无法弄清楚如何使用turn_info获取有关交叉点的信息。喜欢哪些段相交等 有人可以帮忙吗? 感谢

2 个答案:

答案 0 :(得分: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)))无效:&#39;几何具有无效的自相交。在(0,4)处发现了自交点;方法:t;操作:x / u;段ID {source,multi,ring,segment}:{0,-1,-1,0} / {0,-1,-1,7}&#39;

答案 1 :(得分:1)

所以这是获得自我交叉的代码。

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