我想计算一条线之间的交点:
l := direction * x + origin for x e R or x e [0,R+)
和默认的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并获得尚未实现的错误。你知道我在哪里可以找到实施哪个交叉点的清单吗?或者知道有一些新想法?
答案 0 :(得分:1)
Boost.Geometry没有intinite Line或Ray概念。所以你确实需要使用Segment或Linestring。使用Segment确实看起来是最好的方式,但现在可能不支持intersection()。如果您需要,可以创建带有功能请求的故障单。现在,您可以使用Linestring而不是Segment来定义一条线。要存储结果,您可以使用MultiLinestring或Points矢量。在第二种情况下,您将获得正确的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的边界框或边界球等的交点。