gpt4 book ai didi

python - 如何使用 mplot3d 设置网格的原点?

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:47 25 4
gpt4 key购买 nike

按照 scikit-image doc 中的示例我使用行进立方体算法生成球面网格。我想将单位球壳居中于由 x、y、z 网格定义的原点。但是,我不能那样做,因为我不知道如何使用 mpl_toolkits.mplot3d.art3d.Poly3DCollection 放置 x、y、z 信息。这是代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from skimage import measure
import numpy as np

x, y, z = np.ogrid[-4:4:20j, -4:4:20j, -4:4:20j]
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)
verts, faces, normals, values = measure.marching_cubes_lewiner(r,level=1)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)
plt.show()

问题是 marching_cubes_lewiner 函数没有考虑 x,y,z。我如何才能像网格所暗示的那样将生成的球体居中于 0,0,0?

最佳答案

measure.marching_cubes_lewiner采用网格中点的索引来计算拓扑。它似乎没有办法指定实际的网格,也没有任何偏移量。

因此,您可以按所需方式操作生成的 verts。 IE。可以先乘以网格点之间的差异,有效地缩放输出,然后加上网格的偏移量。在这种情况下,转换将是 newverts = 0.42105 * oldverts - 4

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from skimage import measure

x, y, z = np.ogrid[-4:4:20j, -4:4:20j, -4:4:20j]
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)

verts, faces, normals, values = measure.marching_cubes_lewiner(r, level=1)

verts *= np.array([np.diff(ar.flat)[0] for ar in [x,y,z]])
verts += np.array([x.min(),y.min(),z.min()])

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_zlim(-2, 2)
plt.show()

enter image description here

关于python - 如何使用 mplot3d 设置网格的原点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52376329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com