以适当的方式穿越多维空间

时间:2020-06-06 18:47:39

标签: multidimensional-array vector

假设我有一个向量,该向量具有四个维度,其中每个变量都位于一个特殊的区间内。这样我们得到:

const productSchema = mongoose.Schema({
    name : {type:String,trim : true},
    preview : String,
    photos : [String],
    description : String,
    isAccessory : Boolean,
    brand : String,
    price : Number

})

我只对区间的点约束感兴趣。

{ "id": "1", "name": "Men Navy Blue Solid Sweatshirt", "preview": "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/08a7b230-ee8f-46c0-a945-4e835a3c01c01541402833619-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-1.jpg", "photos": [ "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/08a7b230-ee8f-46c0-a945-4e835a3c01c01541402833619-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-1.jpg", "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/efc3d5b9-1bb3-4427-af53-7acae7af98951541402833591-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-2.jpg", "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/c7e58861-3431-4189-9903-9880f5eebd181541402833566-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-3.jpg", "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/66490b64-32de-44b4-a6e4-fe36f1c040051541402833548-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-4.jpg", "https://assets.myntassets.com/h_1440,q_100,w_1080/v1/assets/images/7579188/2018/11/5/957be784-7c5d-4e90-ab9f-0928015b22891541402833645-United-Colors-of-Benetton-Men-Sweatshirts-1271541402833444-5.jpg" ], "description": "Navy solid sweatshirt with patchwork, has a round neck, long sleeves, straight hem", "isAccessory": false, "brand": "United Colors of Benetton", "price": 2599 },

此外,在我的旅程中,点i + 1应该相对接近点i。因此,我不想在太空中跳来跳去。

是否有适当的方法来浏览这些有趣的观点?

例如在x1,x2 =(-2,2)的2D空间中,像这样:

enter image description here

注意:红线的频率可能更高

2 个答案:

答案 0 :(得分:1)

有许多方法可以在保持紧密度的同时创建空间填充曲线。请参阅Wikipedia文章中的一些示例(其中一些具有生成它们的相关算法):https://en.wikipedia.org/wiki/Space-filling_curve

无论如何,让我们使用2D的锯齿形图案并将其扩展到3D和4D。要将其扩展为3D,我们只需在锯齿形中添加另一个锯齿。看看下面的(粗糙)图:

Layered zig-zag

从本质上讲,我们重复在2D模式下使用的模式,但是现在有多个图层代表了三维。我们需要添加的额外Zig是在每一层的底部到顶部和顶部到底部之间的切换。这很容易抽象:

在2D模式下,我们有x和y轴。

  1. 我们在x域之间移动,在正负之间切换 最频繁的指示。
  2. 我们一次跨过y域。

在3D中,我们有x,y和z轴。

  1. 我们最常在x域中进行正向和负向切换。
  2. 我们在y域中移动的频率最高,是第二次在正负方向之间切换。
  3. 我们一次跨过z域。

应该清楚如何将其推广到更高的维度。现在,我将介绍一些(Python 3)代码,该代码实现4D的之字形模式。让我们将4D空间中的位置表示为(x, y, z, w),将每个维度中的范围表示为(x0, x1)(y0, y1)(z0, z1)(w0, w1)。这些是我们的投入。然后,我们还定义xdirydirzdir以跟踪锯齿形的方向。

x, y, z, w = x0, y0, z0, w0
xdir, ydir, zdir = +1, +1, +1

for iw in range(w1 - w0):
  for iz in range(z1 - z0):
    for iy in range(y1 - y0):
      for ix in range(x1 - x0):
        print(x, y, z, w)
        x = x + xdir
      xdir = -xdir
      print(x, y, z, w)
      y = y + ydir
    ydir = -ydir
    print(x, y, z, w)
    z = z + zdir
  zdir = -zdir
  print(x, y, z, w)
  w = w + 1

此算法可确保没有打印出来的两个点之间的距离都大于1。

使用递归,您可以将其清理为一个非常不错的通用方法。我希望这有帮助;让我知道您是否有任何疑问。

答案 1 :(得分:0)

通过@Matthew Miller的工作,我对任何给定的多维空间都实现了这种概括:

    '''assuming that we take three points out of our intervals [0,2] for a,b,c 
    which every one of them is corresponding to one dimension i.e. a 3D-space'''

    a = [0,1,2]
    b = [0,1,2]
    c = [0,1,2]

    vec_in = []
    vec_in.append(a)
    vec_in.append(b)
    vec_in.append(c)

    result = []
    hold = []

    dir = [False] * len(vec_in)

    def create_points(vec , index, temp, desc):
        if (desc):
            loop_x = len(vec[index])-1
            loop_y = -1
            loop_z = -1
        else:
            loop_x = 0
            loop_y = len(vec[index])
            loop_z = 1

        for i in range(loop_x,loop_y,loop_z):
                temp.append(vec[index][i])
                if (index < (len(vec) - 1)):
                    create_points(vec, index + 1, temp, dir[index])
                else:
                    u = []
                    for k in temp:
                        u.append(k)
                    result.append(u)
                    temp.pop()
                if (dir[index] == False):
                    dir[index] = True
                else:
                    dir[index] = False
        if len(temp) != 0:
            temp.pop()

    #render            
    create_points(vec_in, 0, hold, dir[0])

    for x in (result):
        print(x)

结果是一段连续不断地覆盖所有可能位置的旅程:

[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 1, 2]
[0, 1, 1]
[0, 1, 0]
[0, 2, 0]
[0, 2, 1]
[0, 2, 2]
[1, 2, 2]
[1, 2, 1]
[1, 2, 0]
[1, 1, 0]
[1, 1, 1]
[1, 1, 2]
[1, 0, 2]
[1, 0, 1]
[1, 0, 0]
[2, 0, 0]
[2, 0, 1]
[2, 0, 2]
[2, 1, 2]
[2, 1, 1]
[2, 1, 0]
[2, 2, 0]
[2, 2, 1]
[2, 2, 2]