如何使用boost/在多边形中查找自相交?

如何使用boost/在多边形中查找自相交?,boost,polygon,computational-geometry,boost-geometry,set-intersection,Boost,Polygon,Computational Geometry,Boost Geometry,Set Intersection,我需要找到多边形中的自交点。 我知道boost有这种能力。 但是我不知道如何使用转弯信息来获取交叉口的信息。比如什么部分相交等等。 有人能帮忙吗? 谢谢您不能,因为Boost Geometry定义的概念不允许自相交 namespace bg = boost::geometry; using namespace std; typedef bg::model::d2::point_xy<double> point_2d; typedef bg::model::polygon&

我需要找到多边形中的自交点。 我知道boost有这种能力。 但是我不知道如何使用转弯信息来获取交叉口的信息。比如什么部分相交等等。 有人能帮忙吗?
谢谢

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

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);
但是,您可以间接地使用验证功能(我认为是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";
std::字符串原因;
聚磷;
bg::read_wkt(“多边形((0,04,24,22,62,66,26,24,04,08,80,00)),预期);
bool ok=bg::是否有效(p,原因);

std::cout你不能,因为Boost几何定义的概念不允许自相交

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);
但是,您可以间接地使用验证功能(我认为是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";
std::字符串原因;
聚磷;
bg::read_wkt(“多边形((0,04,24,22,62,66,26,24,04,08,80,00)),预期);
bool ok=bg::是否有效(p,原因);

std::cout所以这是获取自交点的代码

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);

这是获取自交点的代码

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);

我突然意识到我是这么想的。我不太熟悉,所以如果这是上下文,我的答案可能不准确。嘿,谢谢你的回答。我确信你可以在多边形中找到自交点。正如我所看到的代码那样。我只是不记得怎么做了。我认为有人使用了turn_信息。但我在那边迷路了。如果你知道如何使用get turn_信息,也许会有所帮助。我在Boost Geometry邮件列表上发现了一篇帖子,其中。。。具有讽刺意味的是,Adam Wulkiewicz说:“我在其他电子邮件中看到,你已经找到了答案。”。我真的认为是时候在这里放一些链接了,甚至是自我回答——这真的是一个有用的问答。事实上,你有意识地冒着让别人旋转轮子的风险,在你把事情弄明白之后,为你浪费时间。我觉得让别人在你身后跑来跑去,为别人指出这些提示是不好的,因为你可以轻松地自己处理这些提示。我突然意识到我是这么想的。我不太熟悉,所以如果这是上下文,我的答案可能不准确。嘿,谢谢你的回答。我确信你可以在多边形中找到自交点。正如我所看到的代码那样。我只是不记得怎么做了。我认为有人使用了turn_信息。但我在那边迷路了。如果你知道如何使用get turn_信息,也许会有所帮助。我在Boost Geometry邮件列表上发现了一篇帖子,其中。。。具有讽刺意味的是,Adam Wulkiewicz说:“我在其他电子邮件中看到,你已经找到了答案。”。我真的认为是时候在这里放一些链接了,甚至是自我回答——这真的是一个有用的问答。事实上,你有意识地冒着人们在你把事情弄明白后为你浪费时间的风险。我觉得让别人在你身后跑来跑去,为别人指出这些提示是不好的,因为你可以自己轻松地处理这些提示。