Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 基于坐标的螺旋定位算法_Geometry_Algorithm - Fatal编程技术网

Geometry 基于坐标的螺旋定位算法

Geometry 基于坐标的螺旋定位算法,geometry,algorithm,Geometry,Algorithm,这个问题与这些问题相反: 目前我有一个代码,它获取正方形螺旋中第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

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

目前我有一个代码,它获取正方形螺旋中第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};
}
private int[]getPos(int n){
int x=0,z=0;
如果(--n>=0){
INTV=(int)数学地板(数学sqrt(n+.25)-0.5);
int-baseindex=v*(v+1);
int触发器=((v&1)>1);
x+=偏移;z+=偏移;
int cornerIndex=spiralBaseIndex+(v+1);
如果(n<1){
x-=触发器*(n-基本索引+1);
}否则{
x-=触发器*(v+1);
z-=触发器*(n-转角索引+1);
}
}
返回新的int[]{x,z};
}

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

好的。假设你的螺旋实际上是一个正方形螺旋,这就足够简单了

首先,我们可以通过使用以下命令来判断位置将位于哪个螺旋“级别”(或哪个环):

//parameter "position" assumed
int level = 0;
int layerSize = 1;
while(position > layerSize * layerSize) {
  layerSize += 2;
  level++;
}
我们知道是这样的,因为每个螺旋将正方形放在前一个螺旋的任一侧(即+2),因此位置所在的标高将位于可能的最大正方形螺旋的区域内


此时,您可以使用getPos获取(layerSize*layerSize+1)的位置。之后,只需沿着螺旋形行走,直到到达您的位置编号。

从技术上讲,您可以调用getPos(0)、getPos(1),…,直到找到您的坐标。我觉得这还不够好。