在给定点周围生成距离网格

时间:2014-05-30 17:46:40

标签: algorithm computational-geometry

我在欧几里德空间中处理( a )点P集合(让我们假设平面保持简单),( b )包含P中所有点的边界矩形[a,b] x [c,d],以及( c )一个正整数的向量(m,n),每个正整数编码细分尺寸。基本问题是

  

如何有效地建立距离P?

的m x n距离网格

特别是,我想在矩形[a,b] x [c,d]的明显mxn网格分解中从P生成距离函数的立方近似:将X方向切割成将m个和Y方向分成n个,并且对于由分区产生的每个小矩形R,计算如下定义的正整数距离 d(R)到P.

考虑一个加权图G,其顶点集V对应于我们网格中的小矩形,邻居之间的权重边缘为$ 1 $(甚至是对角线邻居)。调用一个顶点" red"如果相应的矩形包含P的点。我想要计算的是V上的函数d取正整数值,它将G中的最短距离与每个顶点相关联到一个红色顶点。因此,如果一个小矩形实际上包含一个来自P的点,则其关联的顶点将被分配" 0"。如果它不包含P的点但是与矩形相邻(甚至是对角线),那么它得到" 1"等等...

考虑每个小矩形的每个点的距离并跟踪最小值的天真方法会产生| P | mn的成本,这对于大网格而言似乎过高。所以这是我考虑的第二种方法:将每个d(R)设置为一个大的MAX到网格中的每个R,它不包含来自P的点。然后,为每个R设置d(R)= 0它确实包含一个P点,并将所有具有严格较大d值的邻居抛入一个队列。然后,迭代这个直到队列为空:

  1. 从队列中弹出一个网格矩形R,
  2. 如果d(R)> 1 + d(R')其中R'是处理入队R的邻居,然后设置d(R)= 1 + d(R')并将R'的所有邻居排队。 d值超过1 + d(R)。
  3. 我很欣赏任何关于如何更有效地解决这个问题的想法,而不是第二种方法"。

2 个答案:

答案 0 :(得分:2)

您正在谈论二进制图像中的拓扑距离。矩形可以看作像素,包含P的点定义距离0.距离1用于紧邻的像素(通过边缘或角,8连接),距离紧邻后者的距离为2,因此上。

使用队列计算距离图是个好主意。通过推送level0像素的所有8个邻居来初始化队列。然后弹出它们,分配level1,然后推送未分配的8个邻居......(就像你描述的那样)。

这是线性过程(每个像素处理的次数是恒定的),因此它是最佳的,因为需要计算每个像素的水平。你不能做得更好。

我猜你也可以通过双程扫描线过程填充距离图。

1)从左到右进行处理,依次考虑每个像素的4个顶部和左边8个邻居。 (取邻居中的最小级别并加1)。

2)然后从左下角到左上角进行处理,考虑4个底部和右边8个邻居。

答案 1 :(得分:1)

您当前的算法适用于低维度。通常对于k维度,根据您允许对角线的当前方案,每个网格单元将有3 ^ k-1个邻居,因为对于任何给定的网格位置,要生成相邻位置,您可以选择任何方式来分配位移每个坐标独立地为-1,0或1,但不允许由k 0组成的位移矢量。

让我们调用单元格的总数p(例如,对于k = 2,p = mn)。每个网格单元必须至少被拉出队列一次,即使我们应用技巧来寻找避免将所有邻居推入队列的方法,在我看来,所有3 ^ k-1的此时它的邻居仍然必须检查,所以我认为没有办法避免O(3 ^ k * p)的运行时间。

然而,这也给出了用于保持队列的O(3 ^ k * p)算法的上限空间。这可能不紧,但我仍然可以得到k维度的O(1.5 ^ k * p)空间使用的界限,具有以下结构,我将首先描述2D情况:考虑从任意数量的2x2块构建的问题实例,其中每个块中的单元(0,0)不包含点,并且周围的3个单元各自包含一个或多个点。 (更高维度的模拟在每个维度中都有一个宽度为2的重复块,每个块中的单元格(0,0,...,0)不包含任何点,另一个2 ^ k-1具有一个或者更多。)每个块内的(0,0,...,0)的单元格具有距离值为0的3 ^ k-1个邻居的完整队列,因此它将被推入队列3 ^ k-1次在第一个副本从队列中拉出之前。我们唯一的缓解因素是输入中每2 ^ k个单元中只有1个具有此属性,因此总共(3 ^ k-1)/ 2 ^ k = O(1.5 ^ k)单元将被推到平均每个单元的队列,或整体O(1.5 ^ k * p)。 (当然,其他结构可能会产生更高的上界......)

然而,仅仅通过维护m * n标志数组就可以摆脱这个1.5 ^ k因子,该数组指示特定单元格是否已被推入队列。这是有效的,因为从队列中读取单元格时总距离永远不会减少(这是广度优先搜索,当搜索图中的所有边都具有单位权重时,这是最佳优先搜索),所以第一次当一个单元被分配到它的最小值时,它被拉出队列。这意味着不需要首先推送该单元的剩余副本,你可以通过检查它来避免这样做。在执行此操作之前,该单元格的相应标志,然后进行设置。你需要为标志提供额外的O(p)空间,但是这并不比你已经用来保存输入的空间大得多,并且每个标志实际上可以是一个位,并且这会降低(上限)整体空间复杂度降至O(p)。