是否可以使用boost::geometry来检查两个线段(每个线段由2D中的两个点给出)是否相交?如果可能,boost::geometry是否允许检查特殊情况,例如仅有一个点(数值上)在另一条线上,或者两条线段相等?
是否可以使用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个点。#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);
x1 y1 1
x2 y2 1
x3 y3 1
其中 (x1;y1) 和 (x2;y2) 代表表示您的直线的点,(x3; y3) 代表您的第三个点(您的线段的一个极端点)。如果行列式为正,则 (x3; y3) 在从 (x1;y1) 到 (x2;y2) 定向的向量右侧,如果它为负,则在其左侧。如果行列式为0,则该点在直线上。
您需要做的是将此算法应用两次,一次用于线段的一个极端点,一次用于另一个极端点,如果行列式的乘积为负,则相交,否则不相交。
您可以进一步计算两个线段是否相交。您所需做的就是两次应用相同的思想,只是第二次使用的 (x1;y1) 和 (x2;y2) 将是您用于 (x3;y3) 的值,而新的 (x3;y3) 将是您的旧 (x1;y1) 和 (x2;y2)。
我是通过“Sarrus 算法”学习这个算法的,因此可能在谷歌搜索中会得到更好的解释。