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