如何根据索引在以点为中心的方形螺旋中找到位置偏移

时间:2016-12-13 14:37:30

标签: java python algorithm offset spiral

*免责声明:我发布这个只是为了节省未来的搜索时间,对于任何人*
*谁需要这个(出于某种原因)*
你好! 好吧,我需要一个算法来找到一个点的偏移(相对于原点)
方形螺旋。我在互联网上看了很多但似乎无法找到 一个有效的解决方

我希望代码能够以下列模式生成偏移量:
Spiral Pattern

所以,例如,如果我输入尝试获取索引8的偏移量,我会收到(-1,-1)。

1 个答案:

答案 0 :(得分:0)

爪哇:

Vector2D spiral(int i) {
    int index = i + 1;
    int s = ceil(sqrt(index)) + ((ceil(sqrt(index)) % 2 + 1) % 2);
    int ringIndex = 0;
    int p = 1;
    if (s > 1) {
        ringIndex = i - (s - 2) * (s - 2);
        p = s * s - (s - 2) * (s - 2);
    }

    int ri = (ringIndex + (int) (s / 2)) % p;

    int x = 0;
    if (s > 1)
        x = ri < (p / 4) ? ri :
                (ri <= (p / 4 * 2 - 1) ? (p / 4) :
                        (ri <= (p / 4 * 3) ? ((p / 4 * 3) - ri) :
                                0));

    int y = 0;
    if (s > 1)
        y = ri < (p / 4) ? 0 :
                (ri <= (p / 4 * 2 - 1) ? (ri - (p / 4)) :
                        (ri <= (p / 4 * 3) ? (p / 4) :
                                (p - ri)));

    x -= (int) (s / 2);
    y -= (int) (s / 2);

    return new Vector2D(x, y);
}

Python:

def spiral(i):
  index = i+1
  s = math.ceil(math.sqrt(index)) + ((math.ceil(math.sqrt(index)) % 2 + 1) % 2)
  s = int(s)
  ringIndex = 0
  if s > 1:
    ringIndex = i - (s-2)*(s-2)
  p = 1
  if s > 1:
    p = s*s - (s-2)*(s-2)

  ri = (ringIndex + int(s / 2)) % p

  x = 0
  if s > 1:
    x = ri if ri < (p / 4) else \
        ((p / 4) if ri <= (p / 4 * 2 - 1) else
         (((p / 4 * 3) - ri) if ri <= (p / 4 * 3) else
          0))

  y = 0
  if s > 1:
    y = 0 if ri < (p / 4) else \
        (ri - (p / 4) if ri <= (p / 4 * 2 - 1) else
         ((p / 4) if ri <= (p / 4 * 3) else
          (p - ri)))

  x -= int(s / 2)
  y -= int(s / 2)
  return x, y