假设我有一个向量,该向量具有四个维度,其中每个变量都位于一个特殊的区间内。这样我们得到:
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空间中,像这样:
注意:红线的频率可能更高
答案 0 :(得分:1)
有许多方法可以在保持紧密度的同时创建空间填充曲线。请参阅Wikipedia文章中的一些示例(其中一些具有生成它们的相关算法):https://en.wikipedia.org/wiki/Space-filling_curve
无论如何,让我们使用2D的锯齿形图案并将其扩展到3D和4D。要将其扩展为3D,我们只需在锯齿形中添加另一个锯齿。看看下面的(粗糙)图:
从本质上讲,我们重复在2D模式下使用的模式,但是现在有多个图层代表了三维。我们需要添加的额外Zig是在每一层的底部到顶部和顶部到底部之间的切换。这很容易抽象:
在2D模式下,我们有x和y轴。
在3D中,我们有x,y和z轴。
应该清楚如何将其推广到更高的维度。现在,我将介绍一些(Python 3)代码,该代码实现4D的之字形模式。让我们将4D空间中的位置表示为(x, y, z, w)
,将每个维度中的范围表示为(x0, x1)
,(y0, y1)
,(z0, z1)
,(w0, w1)
。这些是我们的投入。然后,我们还定义xdir
,ydir
和zdir
以跟踪锯齿形的方向。
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]