阶梯线构造算法

时间:2014-07-19 16:50:26

标签: algorithm computational-geometry

对于2D图形,有两点, A B ,以及矩形集(R 0 < / sub>,..,R k-1 )。

开始条件:

  • A B 不在任何矩形内。
  • 每个矩形的边缘与X-Y轴平行。

我必须开发一种构建爬楼梯(或阶梯函数)线的算法。

该行必须满足这些限制:

  1. 阶梯线的所有部分平行于X-Y轴
  2. 步骤线不与任何矩形相交
  3. 步骤线具有最小长度
  4. 步长线在最小长度
  5. 的所有步骤线中具有最小量的扭结(角)

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

1 个答案:

答案 0 :(得分:0)

考虑以下情况:

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

   A

沿着矩形总是有一条最小的路径。边缘。在最优解决方案中,您可以始终将线段更远地推到传递的中心而不更改路径长度,因为推送的线段之前的线段将在推线段之后被线段的负值更改。 / p>

因此,为了运行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

您甚至可以删除位于矩形内的顶点。使用曼哈顿距离在该网格上运行A *。为了减少扭结,你可能会引入人为惩罚。即当你从一个顶点前进到另一个顶点而不是你来自另一个顶点时,添加一个非常小的惩罚(例如0.01)。这允许您包括扭结最小化而不改变路径长度的惩罚(对于足够小的扭结惩罚)。