将2D点映射到固定网格

时间:2017-01-02 21:45:26

标签: algorithm grid 2d

在假想的2D表面上有任意数量的点。我在同一个表面上也有一个网格,沿着X和Y访问以规则的间隔有点。我的任务是将每个点映射到最近的网格点。

代码很直接,直到网格点不足为止。我正在开发的代码找到最近的网格点,如果当前点的距离更短,则显示已经映射的点。

然后我添加了第二步,将每个映射点与另一个映射点进行比较,如果将映射与另一个点交换产生两个点的总映射距离的较小总和,则交换它们。

这最后一步似乎很重要,因为它减少了交叉地图线的数量。 (这将用于将板上的点映射到另一个板上的网格,其中引脚连接两者,并且不交叉的线似乎更有可能使引脚不接触。)

enter image description here

问题:

  1. 任何人都可以评论我的想法,如果上面的图像真正优化了(也就是说,映射点 - 整体 - 总距离最小),那么没有一条线交叉? / p>

  2. 并且有任何人看到任何现有的算法来帮助解决这个问题。我已经搜索过,但却什么也没找到。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的主要问题,最小化线段的总长度,您使用的算法找不到最佳映射,并且在您的图像中很清楚。例如当两个线段相互交叉时,简单的数学表明如果重新排列它们的端点使得它们不交叉,则它提供了更好的总和。你可以使用这种简单的方法(重新排列交叉项)来更好地逼近最优项,你应该应用交换更多的迭代。

在下面的图片中你可以看到为什么穿越长度比非穿越(第一个问题)以及为什么通过交换一旦仍然存在交叉边缘(第二个问题和wrt评论),我只画了一个样本,实际上是一个可能需要多次交换迭代才能获得非交叉结果。

这是一种启发式算法,当然不是最优的,但我希望它非常好,高效且易于实现。

enter image description here

答案 1 :(得分:1)

问题可以作为Assignment Problem的变体来处理,其中“代理”是网格方块,而点是“任务”,(反之亦然),它们之间的距离是“成本“代理 - 任务组合。您可以使用Hungarian algorithm解决。

要处理网格方块多于点的事实,请找到要考虑的可能网格方块的边界框,并添加与所有网格方块关联的成本为0的虚拟点。

匈牙利算法是O(n 3 ),也许你的方法已经足够好了。

另见:

How to find the optimal mapping between two sets?

How to optimize assignment of tasks to agents with these constraints?