【发布时间】:2018-12-09 10:39:46
【问题描述】:
假设我有一个n 3D 点列表,存储在形状为(3, n) 的 Numpy 数组中。我想在该列表中找到所有 4 个点的集合,以使 4 个点共面。我该怎么做?
例如,给定一个 points 数组,其中包含在 3D 空间中旋转任意角度的立方体的 8 个顶点(无特定顺序):
points = np.array([[ 0.8660254 , 0.8660254 , 0. , 0.3660254 , -0.5 , 0.3660254 , 0. , -0.5 ],
[ 0.35355339, -0.35355339, 0.70710678, -0.25881905, 0.09473435, -0.96592583, 0. , -0.61237244],
[ 1.06066017, 0.35355339, 0.70710678, 1.67303261, 1.31947922, 0.96592583, 0. , 0.61237244]])
如何找到位于立方体每个面的角的 6 组 4 个顶点?具体来说,我正在寻找一个完全矢量化的基于 Numpy/Scipy 的解决方案。
编辑:正如 ShlomiF 指出的那样,实际上有 12 个共面的立方体顶点集,包括位于立方体面对角线平面上的顶点。
这是我用来生成points的代码:
import numpy as np
import scipy.linalg as spl
def rot(axis, theta):
return spl.expm(np.cross(np.eye(len(axis)), axis/spl.norm(axis)*theta))
rot3 = rot((1,0,0), np.pi/4) @ rot((0,1,0), np.pi/3) @ rot((0,0,1), np.pi/2)
points = np.array([[1, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 1],
[1, 1, 0, 1, 0, 1, 0, 0]])
points = rot3 @ points
【问题讨论】:
-
如果你想重建立方体,这是一个XY问题。你最好考虑一下凸包。
-
我不会将此称为 XY 问题,因为我对矢量化解决方案本身感兴趣。它出现的上下文是我试图在给定无序列顶点列表的情况下沿着立方体的边缘找到一组不重叠的路径。我确信有更好的方法来解决这个更大的问题,我可能最终会问一个单独的问题。但现在我只想知道共面性。
-
哎呀,这是一个 WXY 问题 ;-) 请注意,矢量化蛮力解决方案不一定有效。
-
投反对票者:愿意发表评论吗?
标签: python arrays numpy scipy computational-geometry