2011年05月03日 星期二 19:27
最近需要绘制几幅3D图形。
采用曲面与模型的形式。
由于两者并不使用同样的Z轴,
所以想要使用两个坐标系。
来分别控制两者的位置关系。
没有做过。正在尝试中。
请有过相关经验的兄弟们,帮我看看,打开下思路。
2011年05月03日 星期二 20:40
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 © 2024
京ICP备05028076号