使用增强几何体检查两条线是否有交点
Using boost geometry to check if two lines have an intersection
是否可以使用 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 算法"下学习了这个算法,所以也许谷歌搜索它可能会给出更好的解释。
您可以尝试使用交集算法。如果线相交,则输出将为非空。
相关文章:
- 如何确定两条直线是否(几乎)垂直/正交
- 向量:两条线,需要解释
- 一条线和两行声明之间的差异
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- 如果用像素来给出两条线(外部和内部)之间的边缘(外部和内部)之间的边缘,则如何计算(x,y)坐标
- 两条未签名短裤的乘法是否真的会导致不确定的行为
- CSV文件中的两条线的交点的计算返回-1.#IND
- 仅使用整数计算两条线的交点
- 两条线之间的Arduino距离
- 这两条线有什么不同吗
- OpenGL:在两个元素之间画一条线
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)
- 使用增强几何体检查两条线是否有交点
- 在 C++11 中,std::atomic 是否可以用于在两个线程之间传输非原子数据
- 查找表示 GPS 路线的两条线(MATLAB、Java、C++ 或 Python)之间的距离
- 查找两条线段是否在C++相交
- 为什么这两条线会产生不同的溢出行为
- 这是检验两条线是否共线的正确方法吗?
- 计算分隔两条线的最小平移量
- 找出两条线是否相交