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

时间:2013-11-08 19:41:01

标签: c++ boost geometry numerical-methods boost-geometry

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

4 个答案:

答案 0 :(得分: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);

如果您需要交叉点:

std::vector<Point> output; 
boost::geometry::intersection(AB, CD, output);

现在输出将有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);

答案 1 :(得分:1)

你问两条线是否相交。两条线总是相交,除非它们是平行的。

以下算法可帮助您计算线段是否与线相交。它的工作原理如下:使用3个点的坐标计算

的行列式
x1 y1 1
x2 y2 1
x3 y3 1

其中(x1; y1)和(x2; y2)是表示你的线的点,而(x3; y3)代表你的第3点(你的线段的极端之一)。如果行列式为正,则(x3; y3)从面向(x1; y1)到(x2; y2)的向量向右,如果是负,则向右。如果行列式为0则该点就在该行上。

你需要做的是对该段的一个极端应用此算法一次,对另一个极端应用一次,如果决定因素的乘积为负,则它相交,如果不是,则它不相交。

如果两个线段相交,您可以进一步计算。所有你需要做的就是两次应用相同的想法,只是第二次你的(x1; y1)和(x2; y2)将是你用于(x3; y3)和你的新(x3; y3)你的值old(x1; y1)和(x2; y2)。

我在“Sarrus算法”下学习了这个算法,所以也许谷歌搜索可能会给出更好的解释。

答案 2 :(得分:0)

您可以尝试使用the intersection algorithm。如果线相交,那么 输出将是非空的。

答案 3 :(得分:0)

不使用BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET

的初学者示例
namespace bg = boost::geometry;

typedef bg::model::point<double, 2, bg::cs::cartesian> point_t;
typedef bg::model::segment<point_t> segment_t;

segment_t seg1(point_t(0.0, 0.0), point_t(5.0, 5.0));
segment_t seg2(point_t(10.0, 5.0), point_t(5.0, 0.0));

bool result = boost::geometry::intersects(seg1, seg2);