确定一组点是否位于常规网格上

时间:2010-07-21 06:39:10

标签: math geometry computational-geometry

问题:假设您在2D平面中有一组点。我想知道这组点是否位于规则网格上(如果它们是2D点阵的子集)。我想知道如何做到这一点。

现在,让我说我只关心这些点是否形成轴对齐的矩形网格(底层网格是矩形,与x和y轴对齐),并且它是一个完整的矩形(格子的子集具有没有孔的矩形边界。任何解决方案都必须非常高效(优于O(N ^ 2)),因为N可能是数十万或数百万。

上下文:我写了一个2D矢量场图生成器,它适用于任意采样的矢量场。在采样是在规则网格上的情况下,有更简单/更有效的插值方案来生成绘图,我想知道何时可以使用这种特殊情况。特殊情况足够好,值得做。该程序用C语言编写。

5 个答案:

答案 0 :(得分:3)

不太确定这是否是您所追求的但是对于平面上的2d点的集合,您总是可以将它们放在矩形网格上(无论如何都低于您的点的精度),问题可能是网格他们适合可能由点过多地填充以为您的算法提供任何好处。

找到一个适合一组点的矩形网格,你基本上需要找到所有x坐标的GCD和所有y坐标的GCD,原点为xmin,ymin这应该是O( n(log n)^ 2)我想。

然而,您如何确定此网格是否过于稀疏

答案 1 :(得分:3)

这可能是愚蠢但如果你的点位于规则网格上,那么坐标的傅立叶变换中的峰值都不是网格分辨率的精确倍数?您可以对X和Y坐标进行单独的傅里叶变换。如果在网格上没有空洞那么FT我将认为是delta函数。 FFT是O(nlog(n))。

P.S。我会留下这个评论,但我的代表太低了..

答案 2 :(得分:1)

如果所有点都来自网格上的交叉点,则您的点集hough transform可能会对您有所帮助。如果您发现两个相互垂直的线条最常出现(意味着您在θ的四个值处找到所有相隔90度的峰值),并且您在伽马空间中找到重复的峰值,那么您将拥有一个网格。否则不会。

答案 3 :(得分:1)

假设网格由方向Or(0到90度)和分辨率Res定义。您可以计算一个成本函数,用于评估网格(Or, Res)是否适合您的点。例如,您可以计算每个点到其最近点网格的平均距离。

然后您的问题是找到最小化成本函数的(Or,Res)对。为了缩小搜索空间并改进搜索空间,可以使用一些启发式测试“好”的候选网格。

这种方法与jilles提出的Hough变换中使用的方法相同。 (Or,Res)空间与Hough的伽玛空间相当。

答案 4 :(得分:0)

这是一个在O(ND log N)中工作的解决方案,其中N是点数,D是维数(在您的情况下为2)。

  1. 为N个数字分配空间用于N个数字:X,Y,Z等(时间:O(ND))
  2. 遍历您的点列表并将x坐标添加到列表X,将y坐标添加到列表Y等(时间:O(ND))
  3. 对每个新列表进行排序。 (时间:O(ND log N))
  4. 计算每个列表中唯一值的数量,并确保连续唯一值之间的差异在整个列表中相同。 (时间:O(ND))
  5. 如果
    • 每个维度中的唯一值均等间隔,
    • 如果每个坐标的唯一值的数量的乘积等于原始点的数量(长度(uniq(X))*长度(uniq(Y))* ... == N,
  6. 然后这些点在一个规则的矩形网格中。