【问题标题】:Point Crossing Line-Path Algorithm点交叉线路径算法
【发布时间】:2013-07-24 13:47:20
【问题描述】:

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

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

【问题讨论】:

  • 制作自己的算法!一个点可以有两种状态,或者在线的一侧,或者另一侧(或者在它上面......我猜)。只需检查一个点是否会改变状态。
  • “线的集合”是指线段的集合吗?段是否相连?如果您不是指段,那么一个点“跨越”三条线是什么意思?点在移动吗?
  • joni:我的意思是连接段,一个点可以穿过段的一条线,但实际上它没有穿过段。
  • 在这里获得一些灵感:stackoverflow.com/questions/385305/…
  • @user1763180:你的意思是像一条射线从一边穿过多边形到另一边?只是多边形由一组线段表示?

标签: algorithm computational-geometry


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    给定一个输入点 (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
    

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

    【讨论】:

      【解决方案3】:

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

      编辑:它并不总是 90 度,它取决于点起点和终点之间的角度

      【讨论】:

        【解决方案4】:

        我知道两种方法:

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

        【讨论】:

        • 对不起图片中的小文字,如果您在阅读时遇到问题,我懒得重新绘制它,将图片保存在磁盘上(图片在此站点上只是缩放为小)或放大您的布朗瑟
        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        • 2013-02-15
        相关资源
        最近更新 更多