这个问题与这些问题相反:
目前我有这个代码,它以正方形螺旋形式获取第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};
}
现在我需要一个映射其他方式的功能,任何想法?
答案 0 :(得分:0)
好。假设你的螺旋实际上是一个方形螺旋,这很简单。
首先,我们可以通过以下方式判断该位置将处于哪个螺旋“水平”(或哪个环):
//parameter "position" assumed
int level = 0;
int layerSize = 1;
while(position > layerSize * layerSize) {
layerSize += 2;
level++;
}
我们知道情况就是这样,因为每个螺旋都会在前一个螺旋的两边放置正方形(即+2),因此位置所在的水平将位于最大可能方螺旋的区域内。 / p>
此时你可以使用getPos获取(layerSize * layerSize + 1)的位置,然后只需走螺旋形状直到你的位置编号。