全球主机交流论坛

标题: mayavi绘图求教 [打印本页]

作者: hue    时间: 2023-11-7 15:08
标题: mayavi绘图求教
本帖最后由 hue 于 2023-11-7 15:08 编辑

我尝试使用 Mayavi 绘制一个长方体并提供其顶点和面的坐标。但是,当我用来mlab.mesh绘制面时,我遇到了面绘制错误的问题。使用 Matlab 时没有出现问题。

有没有懂的mjj教一下我啊 感谢感谢

绘图结果如图所示,绿色是matlab,蓝色是mayavi:




代码如下:
  1. from mayavi import mlab
  2. import numpy as np

  3. vertices = np.array([[0., 0., 0.],
  4.                      [0., 4.7124, 0.],
  5.                      [4.7124, 0., 0.],
  6.                      [4.7124, 4.7124, 0.],
  7.                      [0., 0., 2.],
  8.                      [0., 4.7124, 2.],
  9.                      [4.7124, 0., 2.],
  10.                      [4.7124, 4.7124, 2.]])
  11. faces = np.array([[[4, 6, 7, 5]],
  12.                   [[6, 7, 3, 2]],
  13.                   [[6, 2, 0, 4]],
  14.                   [[5, 4, 0, 1]],
  15.                   [[7, 5, 1, 3]],
  16.                   [[3, 1, 0, 2]]])
  17. # point
  18. x_points = vertices[:, 0]
  19. y_points = vertices[:, 1]
  20. z_points = vertices[:, 2]
  21. mlab.points3d(x_points, y_points, z_points, color=(1, 0, 0), scale_factor=0.1)

  22. # face
  23. x_face = []
  24. y_face = []
  25. z_face = []
  26. for face in faces:
  27.     face = face[0]
  28.     x_face.append(vertices[face, 0])
  29.     y_face.append(vertices[face, 1])
  30.     z_face.append(vertices[face, 2])
  31. mlab.mesh(x_face, y_face, z_face, color=(0, 0, 1), opacity=1)

  32. mlab.show()
复制代码

作者: hue    时间: 2023-11-7 15:09
实在不知道上哪问了
作者: waiwaiwq    时间: 2023-11-7 15:09
虽然我不懂,但是我帮你顶一顶贴
作者: hue    时间: 2023-11-7 15:11
waiwaiwq 发表于 2023-11-7 15:09
虽然我不懂,但是我帮你顶一顶贴

谢谢
作者: hue    时间: 2023-11-7 15:31
顶一下
作者: zqqzqq    时间: 2023-11-7 15:39
问ai
作者: hue    时间: 2023-11-7 15:58
zqqzqq 发表于 2023-11-7 15:39
问ai

问贴吧老哥,找到思路了,已经解决了
作者: 方块李    时间: 2023-11-7 16:02
在Mayavi中,绘制mesh时需要提供三组对应的x、y、z坐标,这些坐标定义了mesh的每个顶点。而在你的代码中,faces数组定义了长方体的每个面的顶点索引,但是在将这些顶点坐标传递给mlab.mesh函数时,应当是顶点坐标的列表,而不是嵌套列表。你需要把每个面的顶点坐标扁平化为一维数组传递给mlab.mesh。

修改后的代码如下,将每个面的顶点坐标平展开来:

python
Copy code
from mayavi import mlab
import numpy as np

vertices = np.array([[0., 0., 0.],
                     [0., 4.7124, 0.],
                     [4.7124, 0., 0.],
                     [4.7124, 4.7124, 0.],
                     [0., 0., 2.],
                     [0., 4.7124, 2.],
                     [4.7124, 0., 2.],
                     [4.7124, 4.7124, 2.]])

# Each face of the box is defined by connecting four vertices
faces = np.array([[4, 6, 7, 5],
                  [6, 2, 3, 7],
                  [6, 4, 0, 2],
                  [5, 1, 0, 4],
                  [7, 3, 1, 5],
                  [3, 2, 0, 1]])

# point
x_points = vertices[:, 0]
y_points = vertices[:, 1]
z_points = vertices[:, 2]
mlab.points3d(x_points, y_points, z_points, color=(1, 0, 0), scale_factor=0.1)

# face
for face in faces:
    x_face = vertices[face, 0]
    y_face = vertices[face, 1]
    z_face = vertices[face, 2]
    mlab.mesh(x_face, y_face, z_face, color=(0, 0, 1))

mlab.show()
在这个代码中,我去掉了对面顶点坐标的额外封装,现在faces是一个直接包含顶点索引的数组,每一行对应一个面的四个顶点。然后,对于每一个面,我从vertices中检索到对应的x、y、z坐标,这些坐标是未封装的,可以直接传递给mlab.mesh。

这样修改后应该可以得到正确的长方体显示。
作者: hue    时间: 2023-11-7 16:25
方块李 发表于 2023-11-7 16:02
在Mayavi中,绘制mesh时需要提供三组对应的x、y、z坐标,这些坐标定义了mesh的每个顶点。而在你的代码中,f ...

chatgpt问了三天了都没解决
作者: H48    时间: 2023-11-7 16:29
问gpt  问不出来是你引导的不够




欢迎光临 全球主机交流论坛 (https://lilynana.eu.org/) Powered by Discuz! X3.4