Python和科学计算认证群组  - 讨论区

标题:关于Myavi的多坐标系

2011年05月03日 星期二 19:27

最近需要绘制几幅3D图形。

采用曲面与模型的形式。

由于两者并不使用同样的Z轴,

所以想要使用两个坐标系。

来分别控制两者的位置关系。

没有做过。正在尝试中。

请有过相关经验的兄弟们,帮我看看,打开下思路。

2011年05月03日 星期二 20:40

http://hyry.dip.jp/code.py?id=110

一个圆柱体,和一条曲线生成的曲面

2011年05月03日 星期二 20:45

呵呵,你的例子好漂亮。

曲面和圆柱体的坐标系不同的么?

我的想法是一个两个坐标轴的X,Y轴重合。

一个z轴向上,一个z轴向下~

上面绘制曲面,下面绘制球体或者立方体

我刚刚尝试添加了两个坐标系

是可以显示的,只是不能控制两者的相对位置。

不知道王兄有什么好的做法·?

2011年05月03日 星期二 21:10

我刚入门,就是改改,学学自己要用的东西。

我的太丑,学习了这个例子,然后再用来计算,再仿真的。

一个z轴向上,一个z轴向下

那你把要在下面显示的,Z = -Z不行吗

 

 

2011年05月03日 星期二 21:27

由于两者的在Z轴上的值,不是一个同一个量,并且这两个量也不成比例。

所以还不能使用-Z=Z来处理

其实整个想法是将副不同的图拼接起来,一个在上面,一个在下面,

而两者有公用的X,Y轴。

不知道有没有其他的思路 ~~

2011年05月04日 星期三 08:42

最好把代码贴出来看看。

可以画两个图形在一个坐标系,然后修改每个实体的Actor属性中的Scale,Location等属性来试试

 

2011年05月04日 星期三 12:32

# -*- coding: utf-8 -*-
import numpy as np
from enthought.mayavi import mlab

#输入文件名
print 'Please input the data file name,txt by default'
name=raw_input()

#分别获取三列数据
x,y,z = np.loadtxt(name+".txt").T
x.shape = y.shape = z.shape = np.sqrt(len(z)), -1

#绘制三维曲面
surf=mlab.surf(x, y, z, extent=(-1,1,-1,1,-0.5,0.5),representation="wireframe", line_width=1.0)

#绘制第一个坐标轴
mlab.axes(surf,ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()))

#指定异常体的位置及大小
xp=np.array([-0.5,0,0.5]).reshape(3,-1)
yp=np.array([-0.5,0,0.5]).reshape(3,-1)

#埋深
zp=np.array([-0.5,-0.5,-0.5]).reshape(3,-1)

#半径
s=np.array([1,1,1]).reshape(3,-1)
#绘制球体
point=mlab.points3d(xp,yp,zp,s,colormap="copper", scale_factor=.25)

#绘制球体的坐标系
mlab.axes(point,ranges=(xp.min(), xp.max(), yp.min(), yp.max(), zp.min(), zp.max()))

#显示
mlab.show()

 

现在的问题是不知道如何指定两个坐标系在当前空间的位置

 

2011年05月04日 星期三 16:20

 

# -*- coding: utf-8 -*-

from enthought.traits.api import HasTraits, Float, Array, Str,File, Button, Instance

from enthought.traits.ui.api import View, HSplit, Item, VGroup, EnumEditor, RangeEditor

from enthought.tvtk.pyface.scene_editor import SceneEditor 

from enthought.mayavi.tools.mlab_scene_model import MlabSceneModel

from enthought.mayavi.core.ui.mayavi_scene import MayaviScene

from enthought.mayavi import mlab

from enthought.tvtk.api import tvtk 

import numpy as np 

from enthought.tvtk.tools import ivtk 

from enthought.pyface.api import GUI

 

class FieldViewer(HasTraits):

    x0, y0, z0 =Float(0), Float(0), Float(0)

    x1, y1, z1 =Float(0), Float(0), Float(0)

    plot_points = Array

    plotbutton = Button(u"绘图")

    bn_zoom = Button(u"放大")

    bn_move = Button(u"移动")

    scene = Instance(MlabSceneModel, ()) 

    view = View(

            HSplit(

            VGroup(

                Item('x0', label=u"X轴移动"),

                Item('y0', label=u"Y轴移动"),

                Item('z0', label=u"Z轴移动"),

                Item('x1', label=u"X轴放大"),

                Item('y1', label=u"Y轴放大"),

                Item('z1', label=u"Z轴放大"),

                Item('plotbutton', show_label=False),

                Item('bn_zoom', show_label=False),

                Item('bn_move', show_label=False),

                ),

                VGroup(

                Item('scene', 

                    editor=SceneEditor(scene_class=MayaviScene), 

                    resizable=True,show_label=False,

                    height=600,

                    width=600)

                    )

    ))

    def _plotbutton_fired(self):

        self.plot()   

    def plot(self):

        mlab.clf(figure=self.scene.mayavi_scene)

        xp=np.array([-0.5,0,0.5]).reshape(3,-1)

        yp=np.array([-0.5,0,0.5]).reshape(3,-1)

        zp=np.array([-0.5,-0.5,-0.5]).reshape(3,-1)

        s=np.array([1,1,1]).reshape(3,-1)

        self.scene.mlab.points3d(xp,yp,zp,s,colormap="copper", scale_factor=.25)

 

        x, y = np.ogrid[-2:2:20j, -2:2:20j]

        z = x * np.exp( - x**2 - y**2) 

        self.scene.mlab.surf(z, extent=[-1,1,-1,1,-1,1], representation="wireframe", color=(0,0,0), line_width=1.0)

        self.scene.mlab.surf(z, extent=[-1,1,-1,1,-1,1], representation="surface")

        self.scene.mlab.axes(ranges=(x.min(), x.max(), y.min(), y.max(), z.min(), z.max()), nb_labels=5 )

        mscene = self.scene.mlab.gcf()

        tscene = mscene.scene

        self.rw = tscene.render_window

    def _bn_move_fired(self):

        self.rw.renderers[0].view_props[0].position = np.array([ self.x0,   self.y0,   self.z0])

        self.scene.scene.do_render = True

    def _bn_zoom_fired(self):

        self.rw.renderers[0].view_props[0].scale = np.array([ self.x1, self.y1, self.z1])

        self.scene.scene.do_render = True

 

app = FieldViewer()

app.configure_traits()  

 

试了下

更改Actor属性中的Scale,Location等等属性,应该可以调整你想要图形的位置、大小、旋转等等属性

2011年05月09日 星期一 13:00

关于这个小程序的最终结果是:

寻求两个坐标系的办法,失败。

采用归一化的办法,分别将上层曲面和下层模型

分别控制在一个可以接受的范围内,

(x-xMin)/(xMax-xMin)*系数,

将x参数控制在(0,系数)范围内。

虽然勉强可以使用,不过如果大家知道如何绘制两个坐标系的话,

请留言告诉我,谢谢大家。

2011年05月11日 星期三 12:30

可以用extent参数试试。仿照下面的例子:

http://github.enthought.com/mayavi/mayavi/auto/example_wigner.html#example-wigner

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号