立即注册  找回密码
 立即注册
CeraNetworksBGVM服务器主机交流会员请立即修改密码Sharktech防护
查看: 65|回复: 7

mayavi绘图求教

[复制链接]

mayavi绘图求教

[复制链接]

11

主题

216

回帖

909

积分

高级会员

积分
909
hue

11

主题

216

回帖

909

积分

高级会员

积分
909
2023-11-7 15:08:22 | 显示全部楼层 |阅读模式
本帖最后由 hue 于 2023-11-7 15:08 编辑

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

有没有懂的mjj教一下我啊

感谢感谢

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







代码如下:
[ol]
  • 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.]])
  • faces = np.array([[[4, 6, 7, 5]],
  •                   [[6, 7, 3, 2]],
  •                   [[6, 2, 0, 4]],
  •                   [[5, 4, 0, 1]],
  •                   [[7, 5, 1, 3]],
  •                   [[3, 1, 0, 2]]])
  • # 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
  • x_face = []
  • y_face = []
  • z_face = []
  • for face in faces:
  •     face = face[0]
  •     x_face.append(vertices[face, 0])
  •     y_face.append(vertices[face, 1])
  •     z_face.append(vertices[face, 2])
  • mlab.mesh(x_face, y_face, z_face, color=(0, 0, 1), opacity=1)
  • mlab.show()
  • [/ol]复制代码
  • 回复

    使用道具 举报

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    hue 楼主

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    2023-11-7 15:09:16 | 显示全部楼层
    实在不知道上哪问了

    回复

    使用道具 举报

    38

    主题

    639

    回帖

    1792

    积分

    金牌会员

    积分
    1792
    waiwaiwq

    38

    主题

    639

    回帖

    1792

    积分

    金牌会员

    积分
    1792
    2023-11-7 15:09:46 | 显示全部楼层
    虽然我不懂,但是我帮你顶一顶贴
    回复

    使用道具 举报

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    hue 楼主

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    2023-11-7 15:11:27 | 显示全部楼层

    waiwaiwq 发表于 2023-11-7 15:09

    虽然我不懂,但是我帮你顶一顶贴

    谢谢

    回复

    使用道具 举报

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    hue 楼主

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    2023-11-7 15:09:00 | 显示全部楼层
    顶一下

    回复

    使用道具 举报

    35

    主题

    191

    回帖

    791

    积分

    高级会员

    积分
    791
    zqqzqq

    35

    主题

    191

    回帖

    791

    积分

    高级会员

    积分
    791
    2023-11-7 15:31:34 | 显示全部楼层
    问ai
    回复

    使用道具 举报

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    hue 楼主

    11

    主题

    216

    回帖

    909

    积分

    高级会员

    积分
    909
    2023-11-7 15:39:47 | 显示全部楼层

    zqqzqq 发表于 2023-11-7 15:39

    问ai

    问贴吧老哥,找到思路了,已经解决了

    回复

    使用道具 举报

    165

    主题

    733

    回帖

    3005

    积分

    论坛元老

    积分
    3005
    方块李

    165

    主题

    733

    回帖

    3005

    积分

    论坛元老

    积分
    3005
    2023-11-7 15:58:51 | 显示全部楼层
    在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。

    这样修改后应该可以得到正确的长方体显示。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|小黑屋|HS2V主机综合交流论坛

    GMT+8, 2024-11-22 13:50 , Processed in 0.076837 second(s), 3 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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