【问题标题】:Intersection Line Poly boost geometry交叉线多边形增强几何
【发布时间】:2015-01-12 16:27:49
【问题描述】:

我想计算一条线之间的交点:

l := direction * x + origin for x e R or x e [0,R+)

和一个默认的 Boost 多边形。在文档中,我只发现了与线段相交的可能性(固定起点和终点)

目前我正在使用 boost 几何和交集: http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection.html

我错过了什么吗?或者你知道一些我可以用来解决我的问题的增强功能。


我尝试了一种解决方法:

  typedef boost::geometry::model::d2::point_xy<double> Point;
  typedef boost::geometry::model::segment<Point> Segment;
  Segment AB( Point{1,1*std::numeric_limits<double>::lowest()},Point{0,1*std::numeric_limits<double>::max()});
  boost::geometry::model::polygon<Point> poly;
  poly.outer().push_back(Point{0,0});
  poly.outer().push_back(Point{10,0});
  poly.outer().push_back(Point{10,10});
  poly.outer().push_back(Point{0,10});
  poly.outer().push_back(Point{0,0});
  std::vector<Segment> result;
  boost::geometry::intersection(AB,poly,result);

我正在使用 boost 1.56 并收到尚未实现的错误。你知道我在哪里可以找到实施了哪些交叉点的​​列表吗?或者知道有什么新想法?

【问题讨论】:

标签: c++ boost geometry boost-geometry


【解决方案1】:

Boost.Geometry 没有无限的线或射线概念。因此,您确实需要为此使用 Segment 或 Linestring。使用 Segment 确实看起来是最好的方法,但它现在可能不被 intersection() 支持。如果您急需,可以创建带有功能请求的票证。现在您可以使用 Linestring 而不是 Segment 来定义一条线。要存储结果,您可以使用 MultiLinestring 或点向量。在第二种情况下,您将获得交点,因此 AFAIU 正是您需要的:

typedef boost::geometry::model::d2::point_xy<double> Point;
typedef boost::geometry::model::linestring<Point> Linestring;
typedef boost::geometry::model::polygon<Point> Polygon;

Linestring ls;
Polygon poly;
std::vector<Point> result;
boost::geometry::intersection(ls,poly,result);

如果上面没有编译,你应该使用更新版本的 Boost。

您可能不应该创建包含双精度最低/最大值的 Linestring。这是因为你会得到大量的数字错误。段的点越接近越好。例如,您可以手动计算线段与 Polgon 的边界框或边界球等的交点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多