【发布时间】:2020-10-22 13:10:50
【问题描述】:
基于已知的 {x,y,z,...} 坐标,我正在寻找位置的索引。提供了一个二维 (2d) 解决方案here。 我现在正在尝试将其扩展到其他两个维度:1d 和 3d(并可能推广到更高维度)。
对于 1d,我最终得到了以下算法(Matlab 代码),其中步行在轴的右侧和左侧之间交替:
n = 20; %number of values
X = -n/2:n/2; %X values (1d)
%we want 'p' the index of the location:
for i=1:numel(X)
if(X(i) > 0)
p(i) = 2*X(i)-1;
else
p(i) = -2*X(i);
end
end
但是,我很难将索引应该如何在 3d 中进行可视化(即索引如何通过 3d 中的节点)。我主要对 C/C++ 解决方案感兴趣,但任何其他语言都可以。
编辑 反映 @Spektre cmets 和建议:我的目标是找到一组 3d 坐标 {x,y,z} 的索引。这可以看作是将 3d 坐标映射到一组索引 (1d) 的一种方式。螺旋提供了一种在 2d 中执行此类任务的便捷方式,但不能在 3d 中扩展。
【问题讨论】:
-
嗯,你的主要问题是你使用术语“螺旋”,它是 2D 对象/构造......我不认为它可以扩展到不同的维度(仍然被称为螺旋)。甚至您的 1D 也是有问题的(最好将其称为 1D 切割螺旋)。因此,要移动到 3D 或更多,您需要首先确定这些东西应该做什么:(用单折线/曲线覆盖(超)体积什么形状(弯曲,矩形)?但是这不会像螺旋线圈一样螺旋半径/尺寸增加的超球体/超立方体...
-
另外,您可能想研究 空间填充曲线,例如 2D/3D hilbert curve 可能与您想要实现的目标不同...那么什么图案/形状3D 你想描述更多吗?
-
@Spektre 感谢您提供有趣的链接。在超球面上均匀分布点可能会解决我的问题。但是,我的目标是找到反问题:即找到索引而不是位置 {x,y,z,...}),我需要这个 ot 快。更准确地说,我想将一组坐标 {x,y,z,...} 映射到 1D 中,螺旋索引在 2D 中提供了一种方便(而且非常快速)的解决方案。但是,正如您所说,这不能扩展到 nD,我将在主题中反映这一点。
-
@Spektre 回复非常有趣!我会去 cube_map 听起来很适合我的问题!谢谢你,准备好后我会标记你的答案。
-
我将 cmets 移入 answer 并添加了更多内容...我还稍微清除了 cmets... 另外我认为您应该在谷歌上搜索 butterfly shuffling 和索引/地址的位反转 ...我觉得他们可以在没有任何测角学的情况下轻松转换为您的模式(但它只是感觉所以我可能错了)
标签: algorithm