Algorithm 阶梯线构造算法

Algorithm 阶梯线构造算法,algorithm,computational-geometry,Algorithm,Computational Geometry,对于2D图形,有两个点,a和B,以及一组矩形(R0,…,Rk-1) 启动条件: A和B不在任何矩形内 每个矩形的边平行于X-Y轴 我必须开发一种算法来构造一条爬楼梯(或阶梯函数)线 线路必须满足以下约束条件: 台阶线的所有部分平行于X-Y轴 阶梯线不与任何矩形相交 阶梯线的长度最小 在所有最小长度的踏步线中,踏步线具有最小数量的弯折(角) 我读过一些关于计算几何的书,但没有找到解决这个问题的算法。考虑以下场景: +----+ B | | | | +----

对于2D图形,有两个点,aB,以及一组矩形(R0,…,Rk-1)

启动条件:

  • AB不在任何矩形内
  • 每个矩形的边平行于X-Y轴
我必须开发一种算法来构造一条爬楼梯(或阶梯函数)线

线路必须满足以下约束条件:

  • 台阶线的所有部分平行于X-Y轴
  • 阶梯线不与任何矩形相交
  • 阶梯线的长度最小
  • 在所有最小长度的踏步线中,踏步线具有最小数量的弯折(角)

  • 我读过一些关于计算几何的书,但没有找到解决这个问题的算法。

    考虑以下场景:

    +----+         B
    |    |
    |    |    
    +----+    +-------+
              |       |
      +---+   |       |
      |   |   |       |
      +---+   +-------+
    
       A
    

    始终存在沿矩形边的最小路径。在最佳解决方案中,您始终可以在不更改路径长度的情况下将线段推到更远处的通道中心,因为推送线段之前的线段将被推送线段之后的线段的负值所改变

    因此,为了运行A*,您可以生成一个网格,其中顶点位于矩形角所在的行或列的交点处,加上A和B:

    o-oo-oo---o----o--o
    |    ||   |    |  |
    |    ||   |    |  |
    o-oo-oo---o----o--o
    | || ||   |       |
    o-oo-oo---o    o  o
    | |   |   |       |
    o-oo-oo---o----o--o
    | || ||   |    |  |        
    o-oo-oo---o----o--o
    

    您甚至可以删除位于矩形内的顶点。以曼哈顿距离在该网格上运行*。为了减少扭结,可以引入人工惩罚。也就是说,当你从一个顶点出发到另一个顶点的方向与你来自的方向不同时,增加一个很小的惩罚(例如0.01)。这允许您在不改变路径长度惩罚的情况下包括扭结最小化(对于足够小的扭结惩罚)。

    如果您可以减少链接数量,但只能通过增加长度来实现,该怎么办?这是一个在4连通(曼哈顿距离)描述2D空间中的简单搜索。在一般意义上,如果距离/纽结的权重相等,则使用曼哈顿距离的4连通空间中的A*作为启发式/代价,应给出正确的解决方案。如果纽结的权重大于最小路径长度,你需要对成本函数进行偏移,以考虑方向的变化,并使其更昂贵。我们谈论的是多少个矩形?A*似乎是个好主意。您可以在直线网格上执行它。所有矩形角的x坐标将是网格的垂直分割,y坐标将是水平分割。您只需有效地检查一个顶点是否被矩形阻挡。这可以通过适当的散列集来实现。@Alexander_KH我已经尝试改进你问题的格式和措辞,如果我有任何错误,请告诉我。“总是有一条最小路径沿着矩形的边缘。”这有什么证据?如何证明存在一条由网格顶点组成的最优路径?也许这句话有点误导。我的意思是:如果你在两个矩形之间有一条通道,你把路径放在哪里并不重要。要么在一个边上,要么在中间的某个地方。由于只允许轴对齐的移动,因此更改位置不会更改总长度(假设上一段和下一段的方向相反;否则,最小路径显然沿着一条边)。不是充分的证据,只是想法。非常感谢您的耐心:)