首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用mplot3d设置网格的来源?

如何用mplot3d设置网格的来源?
EN

Stack Overflow用户
提问于 2018-09-17 22:09:57
回答 1查看 764关注 0票数 3

按照影像医生中的例子,我使用行进立方体算法生成一个球面网格。我想把单位球壳放在x,y,z网格定义的原点。但是,我不能这样做,因为我不知道如何将x,y,z信息与mpl_toolkits.mplot3d.art3d.Poly3DCollection放在一起。以下是代码:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-17 23:41:23

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

因此,您可以以所需的方式操作结果verts。也就是说,首先可以乘以网格点之间的差值,有效地缩放输出,然后再添加网格的偏移量。在这种情况下,转换将是newverts = 0.42105 * oldverts - 4

代码语言:javascript
复制
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()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52376329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档