点交叉线路径算法

时间:2013-07-24 13:47:21

标签: algorithm computational-geometry

我有一个问题,我需要验证一个点是否越过了一条线路,
线路径是线的集合(y = ax + b) 有谁知道一些已知的算法吗?

所以我这样解决了: 我在路径的开头和结尾添加了2个点 - 所以现在它是一个多边形 我将90度的2个点添加到固定距离的点上。 我使用了光线算法。

4 个答案:

答案 0 :(得分:1)

有一些简单的算法可以知道一个点是在多边形的内部还是外部:http://en.wikipedia.org/wiki/Point_in_polygon 这可以通过将多边形的一些边缘推到无穷大来适应线路径设置(实际上,您可以将线路径放在一个大的盒子中,并且可以选择由右侧框的部分形成的多边形(或者离开,如你所愿)的一面)。

答案 1 :(得分:0)

给定输入点(x_1,y_1),并且您的行的格式为y = ax + b,然后您可以通过将x_1放入线方程中来确定输入点的位置:

if y_1 == a * x_1 + b then (x_1, y_1) is on the line
if y_1 < a * x_1 + b then (x_1, y_1) locates below the line
if y_1 > a * x_1 + b then (x_1, y_1) locates above the line

因此,您可以通过跟踪该点的上述结果来判断某个点是否越过了一条线。

答案 2 :(得分:0)

所以我这样解决了:我在路径的开始和结束处添加了2个点 - 所以现在它是一个多边形,我将90度的2个点添加到固定距离的点。我使用了射线算法。

编辑:它不总是90度,它取决于点开始和点结束之间的角度

答案 3 :(得分:0)

我知道两种方法:

  1. 在多边形算法中使用自适应点
    • 你必须知道哪一方面(交叉/非交叉方面)
    • 所以创建一个向量 dir ,它从行补丁指向交叉侧
    • 它可以是平均正常(或起始点线的正常)
    • dir 方向的测试点投射光线
    • 计算与您的线路补丁的交叉点
    • 如果在两条线的连接点上恰好发生交叉,则只计算一次
    • 最后如果计数非零且奇数则点数已经越过行补丁
    • 这很容易出错,但有点慢
    • 见左图
  2. 如果您的线补丁不是太复杂形状使用缠绕规则(标量向量乘法)
    • 线条补丁线必须从头到尾!!! {/ li>
    • 从贴片中选择接近您的点的线(1-5应该足够)
    • 理想情况下在右图上的同一高度
    • 当然在实际中它可以旋转所以按距离选择线(不需要sqrt它)
    • 计算选定行的点积,如下所示:
    • 线P0,P1,点P->点积=((P1-P0)。(P-P1))
    • 点积的2个向量((x0,y0,z0)。(x1,y1,z1))=(x0 * x1 + y0 * y1 + z0 * z1)< /强>
    • 结果的极性表示缠绕方向CW / CCW
    • 如果所有绕组都是正确的,那么
    • 如果线条补丁形状很复杂,那么如果点太靠近它就会出现问题
    • 在这种情况下,只测试相同“高度”的线或使用方法1.
    • 获取'height'计算点与行方向上的行起点之间的距离
    • 如果它从0到行的大小,那就OK,否则不要使用它
    • 也可以使用正常向量到行方向的点积来完成
  3. Line patch crossing