以锯齿形方式访问矩形网格中的所有单元格

时间:2013-11-27 14:00:13

标签: algorithm math language-agnostic geometry

给定一个矩形网格和一个点,我需要一个以锯齿形方式访问所有点的算法。

所以,我正在寻找一个函数 f ,如果像这样运行,会产生下面的图:

loop:
    new_x, new_y = f(x, y, minx, miny, maxx, maxy)
    if new_x == x and new_y == y:
        end loop

有人可以帮我解决这样的算法吗?

3 个答案:

答案 0 :(得分:2)

警告,我从1开始算:

  1. 如果您在右边的奇数行上。
  2. 如果您在左侧的偶数行上。
  3. 如果你在一行的最后一步。
  4. 这对代码来说有点繁琐但我无法看到任何特定的问题。

答案 1 :(得分:0)

假设0 <= X <= L,并且0 <= Y,给定索引N,您可以找到如下坐标:

Y =楼层(N / L)

X =(Y是偶数)? N mod L:L - (N mod L) - 1

- 编辑 -

我注意到这不符合您的循环结构约束,但无论如何它都可能有用。

答案 2 :(得分:0)

也许是这样的?

#include <iostream>
#include <utility>

std::pair<size_t, size_t>
foo (size_t N, size_t k) {
    const auto r = k / N;
    const auto c = (r & 1) == 0 ? k % N  : N - k % N - 1;
    return {r, c};
}

int
main () {
    const size_t N = 10;
    for (size_t i = 0; i < N * N; ++i) {
        auto p = foo (N, i);
        std::cout << "(" << p.first << ", " << p.second << ")\n";
    }
    std::cout << std::endl;
}