使用boost几何来检查两条线是否有交点

Tho*_* W. 5 c++ geometry boost numerical-methods boost-geometry

是否可以使用boost :: geometry来检查两个线段(每个由2D中的两个点给出)是否相互交叉?如果可能的话,boost :: geometry是否也允许检查特殊情况,例如在另一条线上只有一个点(数字),或两条线是否相等?

Mic*_*sky 9

如果您正在特别谈论Boost.Geometry API,那么它当然是可能的.

您的代码看起来应该大致如此

#include <boost/geometry/geometries/segment.hpp> 
#include <boost/geometry/algorithms/intersection.hpp>

typedef boost::geometry::model::segment<Point> Segment;
Segment AB( Point(x1,y1), Point(x2,y2) );
Segment CD; //similar code

bool result = boost::geometry::intersects(AB, CD);
Run Code Online (Sandbox Code Playgroud)

如果你需要交叉点:

std::vector<Point> output; 
boost::geometry::intersection(AB, CD, output);
Run Code Online (Sandbox Code Playgroud)

现在输出将有0,1或2个点,具体取决于位置.

当然,您的Point类型应该与Boost.Geometry概念"兼容".以下代码将使QPointF符合:

#include <boost/geometry/geometries/register/point.hpp>
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(QPointF, qreal, cs::cartesian, x, y, setX, setY);
Run Code Online (Sandbox Code Playgroud)

  • Boost.Geometry 中的类和函数使用某些元编程技巧来访问点的坐标。如果您尝试将它们与您的自定义类 Point 一起使用,您可能会遇到很多编译错误。类似于 BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET 的宏向 Boost.Geometry 解释了如何访问或修改您的自定义类 Point。 (2认同)