令
(x1, y1, z1)
和 (x2, y2, z2)
为欧几里得 3 空间中以原点为中心的轴对齐边长为 2 的立方体表面上的两个点。
如何有效计算立方体表面上的点之间的距离(或平方距离)?
在内部,我将点表示为(offset1, offset2, faceNumber)
,但
(x,y,z)
格式(如上所述)很容易获得。我更喜欢 C 或 Python 代码,但我真的很乐意接受伪代码或任何东西。
编辑:
一些事实:
如果一个立方体有这样的边,你可以折叠起来,使 4 接触到边 1。
5
1 2 3 4
6
你将拥有一个最终看起来像这样的二维平面
3
4/5 5 5/2
3 4 1 2 3
4/6 6 2/6
3
所以,我修改了这个。现在,每个角面板代表两个面板之间可以发生的连接。当您最初布置此阵列时,面板 2、4、5 和 6 上的每个点将映射到三个点。如果您需要将其映射到多个点,则解决方案是到任何给定点(代表点 2)的最短线。
将 3D 立方体中的点映射到 2D 图上的初始 1 - 6 个痛点确实非常简单。剩下的唯一困难是弄清楚如何将点从 2 平面映射到“2/6”平面等等。这只是根据每种情况进行思考的问题。例如:2 -> 2/6 与 5 -> 5/2 不同。我的直觉是,在将立方体的宽度向适当的方向移动之前,它要么旋转 90 度,要么旋转 -90 度。
例如,为了正确处理您列出的情况,我们将在平面 1 的左下角和平面 2 的右下角有一个值。在以下内容之后:“
points in plane 2/6 = rot90(points in plane 2) - width of the cube.
我们将在平面 2/6 的左下角有一个点。这将适当地成为最短路径,并且适当地该路径穿过平面 6 的面。
https://gist.github.com/timepp/2c54816852635021408c5a5c5ad0c8a6
具有以下功能:
console.log(shortestPathOnCubeSurface(2, [0, 2, 2], [0.1, 0.2, 2], [0.2, 0.1, 0]))
result:
[
[ 0, 0.18181818181818177, 2 ],
[ 0, 0, 1.0000000000000004 ],
[ 0.18181818181818188, 0, 0 ]
]
这是受到这个答案的启发:
https://math.stackexchange.com/questions/3023721/finding-the-shortest-path- Between-two-points-on-the-surface-of-a-cube/3041607#3041607