python 科学计算三维可视化笔记(第六周 界面实战)


内容来自中国大学MOOC,北京理工大学,python数据分析与展示课程,侵删。
如有错误,烦请指出。


科学计算三维可视化笔记 第六周 界面实战

一、实例1:建立简单的 Mayavi 窗口

1. 步骤

(1) 建立从 HasTraits 继承的类

  • 建立 MlabSceneModel 场景实例 scene
  • 建立 Mayavi 视图 view
  • 初始化函数,生成数据

(2) 显示窗口

2. 代码
'''实例1:建立简单的Mayavi窗口'''
from numpy import sqrt, sin, mgrid
from traits.api import HasTraits, Instance
from traitsui.api import View, Item
from tvtk.pyface.scene_editor import SceneEditor
from mayavi.tools.mlab_scene_model import MlabSceneModel
from mayavi.core.ui.mayavi_scene import MayaviScene

# 建立HasTraits的继承类
class ActorViewer(HasTraits):
    # 建立场景scene
    scene = Instance(MlabSceneModel, ())
    # 建立视图view
    view = View(Item(name='scene',
                    editor=SceneEditor(scene_class=MayaviScene),
                    show_label=False,
                    resizable=True,
                    height=500,
                    width=500),
                resizable=True)
    
    # 初始化函数
    def __init__(self, **traits):
        HasTraits.__init__(self, **traits)
        self.generate_data()

    # 生成数据
    def generate_data(self):
        # 建立数据
        X, Y = mgrid[-2:2:100j, -2:2:100j]
        R = 10 * sqrt(X**2+Y**2)
        Z = sin(R)/R
        # 可视化数据
        self.scene.mlab.surf(X, Y, Z, colormap='cool')

# 显示窗口
a = ActorViewer()
a.configure_traits()
3. 结果

1 - 1 - 实例    1 - 2 - 实例

二、实例2:基于交互控制的 Mayavi 窗口

1. 步骤

(1) 建立从 HasTraits 继承的类

  • 定义窗口中的变量 n_meridional 和 n_longitudinal
  • 建立场景 scene
  • 建立管线 plot
  • 建立监听函数 update_plot:生成数据并可视化数据
  • 建立视图 view

(2) 显示窗口

2. 代码
'''实例2:基于交互控制的 Mayavi 窗口'''
from traits.api import HasTraits, Range, Instance, on_trait_change
from traitsui.api import View, Item, Group
from mayavi.core.api import PipelineBase
from mayavi.core.ui.api import MayaviScene, SceneEditor, MlabSceneModel

from numpy import arange, pi, cos, sin

dphi = pi/300.
phi = arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')
# 建立数据
def curve(n_mer, n_long):
    mu = phi*n_mer
    x = cos(mu) * (1+cos(n_long*mu/n_mer)*0.5)
    y = sin(mu) * (1+cos(n_long*mu/n_mer)*0.5)
    z = 0.5 * sin(n_long*mu/n_mer)
    t = sin(mu)
    return x, y, z, t

# 建立HasTraits的继承类
class MyModel(HasTraits):
    # 定义窗口中的变量n_meridional和n_longitudinal
    n_meridional    = Range(0, 30, 6)   # 滑动条控件
    n_longitudinal  = Range(0, 30, 11)  # 华东条控件
    # 建立场景scene
    scene = Instance(MlabSceneModel, ())
    # 建立管线plot
    plot = Instance(PipelineBase)
    
    # 建立监听函数update_plot
    @on_trait_change('n_meridional,n_longitudinal,scene.activated')
    def update_plot(self):
        # 调用curve()生成数据
        x, y, z, t = curve(self.n_meridional, self.n_longitudinal)
        #如果plot未绘制则生成plot3d
        if self.plot is None:
            self.plot = self.scene.mlab.plot3d(x, y, z, t,
                        tube_radius=0.025, colormap='Spectral')
        #如果数据有变化,将数据更新即重新赋值
        else:
            self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)

    # 建立视图view
    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                     height=250, width=300, show_label=False),
                Group('_', 'n_meridional', 'n_longitudinal'),
                resizable=True)

# 显示窗口
model = MyModel()
model.configure_traits()
3. 结果

2 - 1 - 结果2  2 - 2 - 结果2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值