确定从点开始的无限直线(单向)是否与 2D 中的线段相交
Determine whether an infinite straight line (one direction) from a point intersects with a line segment in 2D
我正在尝试找到一种针对查找(无限)线和线段之间是否存在交集而优化的算法。
在SO和其他网站上,我看到了许多线段 - 线段相交和线 - 线相交算法,但是为一条无限线(从一个方向上的点)和线段找到一个"更简单?"的版本是非常困难的。
我目前有类似的东西(线段 - 线段交点):
bool lineSegmentsIntersect(float pX, float pY, float p2X, float p2Y, float qX, float qY, float q2X, float q2Y)
{
// p and p2 define the first line segment
Point2D p(pX, pY);
Point2D p2(p2X, p2Y);
// q and q2 define the second line segment
Point2D q(qX, qY);
Point2D q2(q2X, q2Y);
Point2D r = p2 - p;
Point2D s = q2 - q;
float uNumerator = (q-p)*r;
float denominator = r*s;
if (uNumerator == 0 && denominator == 0) {
// co-linear, so do they overlap?
return ((q.x - p.x < 0) != (q.x - p2.x < 0) != (q2.x - p.x < 0) != (q2.x - p2.x < 0)) ||
((q.y - p.y < 0) != (q.y - p2.y < 0) != (q2.y - p.y < 0) != (q2.y - p2.y < 0));
}
if (denominator == 0) {
// lines are parallel
return false;
}
float u = uNumerator / denominator;
float t = ((q-p)*s) / denominator;
return (t >= 0) && (t <= 1) && (u >= 0) && (u <= 1);
}
其中 * 运算符定义为:
float Point2D::operator*(const Point2D &rhs)
{
return x*rhs.y - y*rhs.x;
}
虽然我正在寻找更简单/更快的东西。我正在尝试检查一个点是否在闭合形状内(形状由一些点和它们之间的(线性插值)直线定义。
从我向预定义方向发射光线的那一刻开始。
最好是 [1, 0] 或 [0, 1](这可以用作给定的常数),如果这会使数学更容易,我认为它可能。
然后我检查光线是否与每个线段相交,如果这是一个奇数,则它在形状内。
我正在考虑的一些事情:
如果我们决定总是直接向上射出一条射线,那么如果线段的两个点都低于我们已经知道它不相交的点。
参见Hormann和Agathos,"任意多边形的多边形问题中的点",计算几何20(2001)131-144。 用于绕组算法的高效实现。
相关文章:
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- 在 C++ 中搜索 2D 数组以查看一行/列是否与另一行/列相同
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- 如何检查 2D 数组在 c++ 中是否按升序排列?
- C++,2D std::vector,我是否需要显式保留和推送空矢量
- 是否有任何打印2D阵列C 的快捷方式
- 用“ strcpy”在2D数组中删除(字符)的一行(字符)时是否存在任何错误
- C 检查2D矢量是否遇到了障碍
- 如何检查2D数组中是否存在所有请求的值
- 查找数字是否单独存在于 2D 网格中
- OPENCV是否有一个软件包将3D点转换为2D自上而下的视图
- 如何检查2D阵列中的字符是否出现多次?C
- 矢量阵列是否形成2D向量
- C++向量的 2D 数组是否适合跟踪 2D 数组的动态域值?
- 是否可以使用 1D 索引访问 C++ 2D int 数组
- 我是否必须求助于循环,以比较C 中的两个2D阵列
- 英特尔IPP卷积已弃用--是否有其他IPP 2D卷积方法
- 我是否正确地为 2D 数组添加了行与列
- Eigen3 或其他矩阵库 2D 矩阵是否可以通过共享内存从不同的进程更新