Geometry 如何将直线离散为与任意网格对齐的线段

Geometry 如何将直线离散为与任意网格对齐的线段,geometry,line,trace,discretization,Geometry,Line,Trace,Discretization,考虑: 其目的是将任意线段(红线)离散为一组在任意网格上对齐的连接线段(蓝线段)。此处仅显示两种简单的网格形式,即方形网格和旋转方形网格。 红线可以是任何角度和大小。 网格配置(包括类型和单元大小)由用户选择。 Bresenham的离散化可能适用于简单的情况,但即使如此,也存在两个障碍: 它仅限于垂直和水平对齐的轴网 它给出了线段所在的像素(即方形块) 必需的 重要更新: 重要更新: 我们对适用于任何网格复杂性的通用解决方案感兴趣。 人们感兴趣的是一种更普遍的方法。非常感谢提供pesudo代

考虑:

其目的是将任意线段(红线)离散为一组在任意网格上对齐的连接线段(蓝线段)。此处仅显示两种简单的网格形式,即方形网格和旋转方形网格。 红线可以是任何角度和大小。 网格配置(包括类型和单元大小)由用户选择。 Bresenham的离散化可能适用于简单的情况,但即使如此,也存在两个障碍:

  • 它仅限于垂直和水平对齐的轴网
  • 它给出了线段所在的像素(即方形块) 必需的
  • 重要更新: 重要更新: 我们对适用于任何网格复杂性的通用解决方案感兴趣。

    人们感兴趣的是一种更普遍的方法。非常感谢提供pesudo代码或代码。
    这个问题也可以找到。

    对于旋转矩形网格:

    • 对线段端点应用反向旋转变换
    • 使用不带传统半像素偏移的Bresenham(将像素块居中)
      • 该算法给出水平和垂直[或短轴、长轴]增量
    • 对线段应用正向旋转变换
    在“随机”网格的情况下,我建议使用基于单元的方法,如有必要,首先将每个单元拆分为凸(Voronoi区域)。六边形网格已经由voronoi区域组成。保留每个单元格的邻居列表

    • 第一个任务是仅通过每个单元的邻居从起始单元到结束单元。幸运的是,在凸面细分的情况下,可以选择中心离目标较近/最近的单元。(搜索已结束,但无法继续)

    • 下一个任务是在每个单元(CW或CCW)中找到从入口点到出口点的路径。一个比较短

    图:

    a----------b--------------d  
    *          |              |  
         A     c       B      |     C
                              e
                              |           x
                              f-----------g
    
    此处,端点“*”和“x”位于单元格的边界内。
    其中一个形成模式“*abcbdefgx”,并将其减少到“*abdfgx”或甚至减少到“*adfgx”,因为“b-a”点“d-b”(标准化)为零或至少非常接近

    请注意,网格可能非常复杂,即单元格可以具有任何形状。在这种情况下,旋转没有帮助。