Coordinates 如何按距离原点的顺序生成三维整数坐标

Coordinates 如何按距离原点的顺序生成三维整数坐标,coordinates,generator,Coordinates,Generator,我想按距离原点的顺序生成一系列坐标。序列显然是无限的,所以仅仅生成它们并按距离排序对我来说不起作用 对于相同距离的点,我不关心顺序 例如,这里有一些点,它们与原点的距离最多为两步 # d² = 0 (0,0,0) # d² = 1 (0,0,-1) (0,-1,0) (-1,0,0) (1,0,0) (0,1,0) (0,0,1) # d² = 2 (0,-1,-1) (-1,0,-1) (1,0,-1) (0,1,-1) (-1,-1,0) (1,-1,0) (-1,1,0) (1,1,0)

我想按距离原点的顺序生成一系列坐标。序列显然是无限的,所以仅仅生成它们并按距离排序对我来说不起作用

对于相同距离的点,我不关心顺序

例如,这里有一些点,它们与原点的距离最多为两步

# d² = 0
(0,0,0)
# d² = 1
(0,0,-1)
(0,-1,0)
(-1,0,0)
(1,0,0)
(0,1,0)
(0,0,1)
# d² = 2
(0,-1,-1)
(-1,0,-1)
(1,0,-1)
(0,1,-1)
(-1,-1,0)
(1,-1,0)
(-1,1,0)
(1,1,0)
(0,-1,1)
(-1,0,1)
(1,0,1)
(0,1,1)
# d² = 3
(-1,-1,-1)
(1,-1,-1)
(-1,1,-1)
(1,1,-1)
(-1,-1,1)
(1,-1,1)
(-1,1,1)
(1,1,1)
# d² = 4
(0,0,-2)
(0,-2,0)
(-2,0,0)
(2,0,0)
(0,2,0)
(0,0,2)
# d² = 5
(0,-1,-2)
(-1,0,-2)
(1,0,-2)
(0,1,-2)
(0,-2,-1)
(-2,0,-1)
(2,0,-1)
(0,2,-1)
(-1,-2,0)
(1,-2,0)
(-2,-1,0)
(2,-1,0)
(-2,1,0)
(2,1,0)
(-1,2,0)
(1,2,0)
(0,-2,1)
(-2,0,1)
(2,0,1)
(0,2,1)
(0,-1,2)
(-1,0,2)
(1,0,2)
(0,1,2)
# d² = 6
(-1,-1,-2)
(1,-1,-2)
(-1,1,-2)
(1,1,-2)
(-1,-2,-1)
(1,-2,-1)
(-2,-1,-1)
(2,-1,-1)
(-2,1,-1)
(2,1,-1)
(-1,2,-1)
(1,2,-1)
(-1,-2,1)
(1,-2,1)
(-2,-1,1)
(2,-1,1)
(-2,1,1)
(2,1,1)
(-1,2,1)
(1,2,1)
(-1,-1,2)
(1,-1,2)
(-1,1,2)
(1,1,2)
# d² = 8
(0,-2,-2)
(-2,0,-2)
(2,0,-2)
(0,2,-2)
(-2,-2,0)
(2,-2,0)
(-2,2,0)
(2,2,0)
(0,-2,2)
(-2,0,2)
(2,0,2)
(0,2,2)
# d² = 9
(-1,-2,-2)
(1,-2,-2)
(-2,-1,-2)
(2,-1,-2)
(-2,1,-2)
(2,1,-2)
(-1,2,-2)
(1,2,-2)
(-2,-2,-1)
(2,-2,-1)
(-2,2,-1)
(2,2,-1)
(-2,-2,1)
(2,-2,1)
(-2,2,1)
(2,2,1)
(-1,-2,2)
(1,-2,2)
(-2,-1,2)
(2,-1,2)
(-2,1,2)
(2,1,2)
(-1,2,2)
(1,2,2)
# d² = 12
(-2,-2,-2)
(2,-2,-2)
(-2,2,-2)
(2,2,-2)
(-2,-2,2)
(2,-2,2)
(-2,2,2)
(2,2,2)

从解决方案aaa开始,然后是aab,然后是abc,您可以检索所有其他“排列”,如aba、baa、-a-b等等。所以你可以保持a 几何学上:地球仪上八分之一的三角形。对于x²+y²的圆,可以在x的四分之一处迭代,并从r²-x²中检索y。这里发生在给定的
a

不幸的是,对于我来说,在一个阳光明媚的星期天回答这个问题太难了。 (足够硬)。 示意图中的伪代码:

int distance = -1;
int a;
int b;
int c;
PermutationIterator perm = ...

Point next() {
    if (perm.atEnd()) { // Initially true.
        perm.nextDistance();
        ++distance;
        a = distance;
        b = a;
        c = a;
        // Will return Point(a, a, a);
    }
    return perm.nextPerm();
}