2011-09-04 34 views
2

我有几个随机分散的盒子(x,y,宽度,高度),其中一些需要从box1中的点(x1,y1)链接到点(x2, y2)通过画一条线。我试图想出一种方法,通过绘制几条直的相互连接的线来绕过任何一个盒子(如果不可能用一条直线走向),避免通过任何其他盒子(box1和box2除外) )。问题是我不知道这样的算法(更不用说有一个技术/通用名称)。希望能够以算法或表达的想法的形式提供任何帮助。连接两个盒子之间的连线避免传递其他人

感谢

+0

你可以作弊。如果先绘制两个原点框和线条,然后绘制随机框(与线条的笔触样式相同),则看起来线条只是勾勒框线而不是相交。 –

+0

这是不是真的很清楚你想要做什么..线条给出,或者你必须选择画线?因为如果他们得到了,如果重叠的话,没有办法避免重叠 – Simone

+0

也许我明白了......线条不是必须的单个线段,但他们可以获得连接多个线段吗? – Simone

回答

1
  1. 把所有(X,Y)的一组V

  2. 添加的起点和终点的箱子的角落 COORDS坐标V

  3. 创建一组边缘E连接每个不与任何盒子边交叉的角落(盒子中的对角线除外)。

    如何检查,如果线穿过一个侧箱可以用this algorithm

  4. 做现在使用您所选择的路径搜索算法,找出图中的路径(V,E)。

    如果您需要一个简单的算法找到最短路径,只需使用BFS即可。

(这将产生沿的一些箱子边走一段路,如果这是不可取的,你可以在步骤1中放点,从实际的角落一段距离三角洲。)


如果边缘可能不是对角线:

  1. 创建线的大电网,这些箱子之间去。

  2. 丢弃穿过盒子边的网格边缘。

  3. 使用您选择的路径查找算法在网格中查找路径。
+0

该算法非常好,但是您能否更详细地解释步骤3。只要不与任何方框相交,我是否可以从所有坐标(包括开始/结束)创建边缘?如果需要,还可以修改这种算法以仅生成垂直和水平线(而不是对角线)? – ccit

+0

是的,如果开始/结束之间的线没有穿过任何方块边,那么您肯定会想要包含该边...该边将实际上是所得到的路径!关于你的第二个问题,我不确定。然而,如果你解决了这个问题,你最终可能会使用路径寻找算法(A *,BFS,Dijkstra,...),所以在这两种情况下你可能都需要设置一些图。 – aioobe

+0

我喜欢第一种算法,因为它是有效的,并且有一些距离增量(为了避免触及边缘),它可能是最合适的解决方案。当然,我最终必须有一个图(和路径寻找算法),但我想要一个具有最小顶点的图。你的回答满足这个要求。我可能会先使用第一个,然后通过将它们放在一个小网格中来调整对角线。谢谢。 – ccit

1

假设线不能是对角线,这是一个简单的方法。它是基于BFS也将找到连接点的最短路线:

只需创建一个图表,包含一个顶点的每个点(x,y)和每个点的边缘:

((x,y),(x+1,y)) ((x,y),(x-1,y))  ((x,y),(x,y+1))  ((x,y),(x,y-1)) 

但每个边缘必须存在,只要它不与盒子重叠。

现在只是从点(X1,Y1)到(x2,y2)做一个简单的BFS

这是真的,也容易获得对角线方式相同,但你需要为每个顶点8层的边缘,这是,除了先前的4:

((x,y),(x-1,y+1)) ((x,y),(x-1,y-1))  ((x,y),(x+1,y-1))  ((x,y),(x+1,y+1)) 

但是,每个边缘必须存在,只有当它不与盒子重叠。

编辑

如果可以不考虑空间划分为一个网格,这里的另一种可能性,它不会给你很最短路径,虽然。

创建一个图形,其中每个方框都是一个顶点,并且对于任何其他可以到达而没有线条重叠第三个方框的方框具有边缘。现在使用包含两点的box1和box2之间的dijkstra找到短路径。

现在考虑每个盒子有一个小的计数,不与任何其他盒子重叠。通过这种方式,您可以链接通过dijistra发现的路径中每个框的进入点和退出点,并通过计数。

+0

当你说“每个点(x,y)的顶点”我知道你把空间分成网格吗? – ccit

+0

是的,我假设 – Simone

+0

事实上,你可以总是将空间分成像素,如果你需要的是一个实用的算法。将空间划分为像素要快得多;它还将允许您使用辅助布尔网格在恒定时间内检查点和框的重叠。 – Simone