【问题标题】:Algorithm to get spiral position by coordinate通过坐标获得螺旋位置的算法
【发布时间】:2013-10-23 19:29:34
【问题描述】:

这个问题与这些问题相反:

目前我有这段代码,它可以在正方形螺旋中获取第 n 个元素的坐标:

private int[] getPos(int n) {
    int x = 0, z = 0;
    if (--n >= 0) {
        int v = (int) Math.floor(Math.sqrt(n + .25) - 0.5);
        int spiralBaseIndex = v * (v + 1);
        int flipFlop = ((v & 1) << 1) - 1;
        int offset = flipFlop * ((v + 1) >> 1);
        x += offset; z += offset;
        int cornerIndex = spiralBaseIndex + (v + 1);
        if (n < cornerIndex) {
            x -= flipFlop * (n - spiralBaseIndex + 1);
        } else {
            x -= flipFlop * (v + 1);
            z -= flipFlop * (n - cornerIndex + 1);
        }
    }

    return new int[]{x,z};
}

现在我需要一个映射另一种方式的函数,有什么想法吗?

【问题讨论】:

  • 从技术上讲,您可以调用 getPos(0)、getPos(1)、...,直到找到您的坐标。我有一种感觉不够好。

标签: geometry algorithm


【解决方案1】:

好的。假设你的螺旋实际上是一个方形螺旋,这很简单。

首先,我们可以使用这个来判断位置将在哪个螺旋“水平”(或哪个环)上:

//parameter "position" assumed
int level = 0;
int layerSize = 1;
while(position > layerSize * layerSize) {
  layerSize += 2;
  level++;
}

我们知道是这种情况,因为每个螺旋都会在前一个螺旋的任一侧放置正方形(即 +2),因此该位置所在的级别将在最大可能的正方形螺旋的区域内。

此时你可以使用getPos获取(layerSize * layerSize + 1)的位置,之后就可以沿着螺旋形走,直到达到你的位置数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多