全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 504|回复: 9
打印 上一主题 下一主题

mayavi绘图求教

[复制链接]
跳转到指定楼层
1#
发表于 2023-11-7 15:08:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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()
复制代码
2#
 楼主| 发表于 2023-11-7 15:09:16 | 只看该作者
实在不知道上哪问了
3#
发表于 2023-11-7 15:09:46 | 只看该作者
虽然我不懂,但是我帮你顶一顶贴
4#
 楼主| 发表于 2023-11-7 15:11:27 | 只看该作者
waiwaiwq 发表于 2023-11-7 15:09
虽然我不懂,但是我帮你顶一顶贴

谢谢
7#
 楼主| 发表于 2023-11-7 15:58:51 | 只看该作者

问贴吧老哥,找到思路了,已经解决了
8#
发表于 2023-11-7 16:02: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。

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

chatgpt问了三天了都没解决
10#
发表于 2023-11-7 16:29:31 | 只看该作者
问gpt  问不出来是你引导的不够
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-10-17 12:17 , Processed in 0.209117 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表