我想在没有循环的情况下找到两次(X 和 Y)旋转后立方体的坐标。
立方体坐标存储为顶点:
cube_vertices = np.array([[0, 0, 0],
[1, 0, 0],
[1, 1, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1]])
我主要处理边缘:
cube_edges = np.array([[cube_vertices[0], cube_vertices[1]],
[cube_vertices[0], cube_vertices[3]],
[cube_vertices[1], cube_vertices[2]],
[cube_vertices[3], cube_vertices[2]],
[cube_vertices[1], cube_vertices[5]],
[cube_vertices[2], cube_vertices[7]],
[cube_vertices[3], cube_vertices[6]],
[cube_vertices[0], cube_vertices[4]],
[cube_vertices[4], cube_vertices[5]],
[cube_vertices[4], cube_vertices[6]],
[cube_vertices[6], cube_vertices[7]],
[cube_vertices[5], cube_vertices[7]]])
我存储它是为了找到这些边与平面的交点。旋转器的给出是对
cube_edges
的每个坐标重复 12 次旋转,因此我可以沿着大小为 12 的第 0 轴(边数)和大小为 2 的第 1 轴(边的两端)相乘。坐标:
phi, theta = 0.1, 0.1
Rx = np.tile(np.array([[1, 0, 0],
[0, np.cos(theta), -np.sin(theta)],
[0, np.sin(theta), np.cos(theta)]]), (12, 2, 1, 1))
Ry = np.tile(np.array([[np.cos(phi), 0, np.sin(phi)],
[0, 1, 0],
[-np.sin(phi), 0, np.cos(phi)]]), (12, 2, 1, 1))
Rxy = Rx * Ry
cube_edges
的形状是(12, 2, 3)
,Rxy
的形状是(12, 2, 3, 3)
。对于大小为 (3) 的每点坐标的所有 3x3 单旋转,乘法应沿前两个维度 (12, 2) 进行。我不知道如何利用 np.tensordot 或类似的东西来达到此目的:
rotated_edges = np.tensordot(Rxy, cube_edges)
rotated_edges
的最终形状应与cube_edges
(12, 2, 3)
相同。
谢谢!
以下似乎做了您正在尝试的事情(使用相同的数组
cube_edges
):
phi, theta = 0.1, 0.1
Rx = np.array([[1, 0, 0],
[0, np.cos(theta), -np.sin(theta)],
[0, np.sin(theta), np.cos(theta)]])
Ry = np.array([[np.cos(phi), 0, np.sin(phi)],
[0, 1, 0],
[-np.sin(phi), 0, np.cos(phi)]])
Rxy = Rx @ Ry
rotated_edges = np.dot(cube_edges,Rxy.T)