我有一个单位长度的立方体。立方体的每个面分为10 x 10个段。考虑一个大小等于移动通过立方体表面的段的对象。
我需要计算一种方法,在给定对象方向的情况下找到多维数据集中的下一个段。
答案 0 :(得分:4)
我想简单地使用展平表示法。面部导航很简单。面部之间的导航可以使用“关系”地图轻松编码:
顺便说一句,你可以使用任何合适的网:
答案 1 :(得分:3)
根据您要执行的操作,您可以将位置和方向矢量表示/转换为单位球体上的球面坐标(即半径= 1),然后投影到立方体上。然而,投影可能会导致感知速度不稳定,但在您的情况下它可能会或可能不会令人反感。
例如,将球面位置坐标转换回carthesian,然后找出相关的立方体边和面坐标,如下所示:http://www.nvidia.com/object/cube_map_ogl_tutorial.html(请参阅将纹理坐标映射到立方体贴图面部分),然后可以捕捉到10x10段。
答案 2 :(得分:1)
您正在寻找的是Space filling curve。在它们的离散形式中,它们在(N-1)维中近似N维,因此如果你采用N = 2
我们有一种方法来映射一个平面(或形成一个立方体网的6个平面)在1D(在一行中),可以建模为在线上取点的函数,并返回平面中的(x,y)
位置。
你可以使用Hilbert Curve或Peano Curve,因为它们都接近单位正方形但是前者的近似值在 2 的幂上升后者的权力为 3 ,因此两者都不会接近10个区段中的单位平方(您可以用Hilbert曲线近似8或16,或者用Peano曲线逼近9)。
显然,立方体的网不是一个完美的单位正方形,但这并不重要,因为你可以将每个面都视为一个单位正方形,然后一旦你到达一个近似的末尾,移动到下一个面多维数据集。
作为实现细节,您可以通过以下方式执行此操作:
D
(x,y)
标记为0
)的5
偏移量存储在数组中:offsets
(即offsets[0]
是第一面)。循环显示间隔i <- [0..6*D)
。
f = floor(i/D)
。d = i % D
。获取多维数据集中下一个点的(x,y)
位置计算为
(x,y) = offset[f] + space_filling_curve(d)
其中space_filling_curve()
是您选择的任何一条曲线的离散近似值,无论您选择哪种程度的近似值(只要它与您的D
计算相符)。
我没有添加实现space_filling_curve()
本身,因为我之前引用的关于Hilbert Curves的文章有一个很好的,直截了当的用C语言写的。
答案 3 :(得分:0)
立方体两侧的“内部”所有步骤都是微不足道的,物体可以采取8个方向,物体可能有一些惯性或其他算法说明它的前进位置。
使立方体边缘“跳跃”相对无痛的一种方法是将立方体的所有边建模为12x12正方形大(只是在立方体边缘外放置“额外的一行”正方形)并且有一些逻辑移动当对象位于一个正方形的外边缘时,该对象到右立方体边缘(这样,您可以保持移动对象逻辑与边缘检测脱钩)。 “跳到右边的正方形”应该是非常对称的,并且最好用一些方形纸发现。
问题中存在“奇点”,当您的对象想要在角落中移动NW时,它将在两个其他方格之间或反弹。或者选择一个相邻的正方形(随机或按照某种规则)。
有趣的问题!