使用增强几何体检查两条线是否有交点

Using boost geometry to check if two lines have an intersection

本文关键字:是否 两条线 检查 增强 几何体      更新时间:2023-10-16

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

如果你专门谈论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 个点,具体取决于位置。

当然,您的点类型应该"符合"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);
不使用

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

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

以下算法可帮助您计算线段是否与直线相交。它的工作原理如下:拥有 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)是旧的(x1;y1)和(x2;y2)。

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

您可以尝试使用交集算法。如果线相交,则输出将为非空。