mlab 中的简单箭头 mayavi/tvtk 奇怪的行为(看起来像一个错误)

问题描述 投票:0回答:3

我正在尝试在 mlab 中做一个简单的箭头来指向图表上的不同区域。 考虑这个例子:

fig = mlab.figure( bgcolor=(0, 0, 0))
b=visual.Box(x=0, y=10, z=10)
visual.set_viewer(fig)
b=visual.Box(x=0, y=10, z=10)
b2=visual.Box(x=10,y=10,z=10, color=(0,0,1))
a=visual.Arrow(x=10,y=10,z=10, color=(1,0,0))

所以在我看来,箭头应该从蓝色盒子中出现,但它有自己神秘的生活,而且位置完全偏离。非常奇怪的是,框被定位并绑定到网格(因此,如果我将 b 设置为 x=10,y=10,z=10,则两个框将并置),但箭头不是。 This is what I see 这是错误还是功能?

更新:

我正在尝试修复上述问题,发现箭头的行为非常奇怪。这就是我所做的(在

ipython
中进行互动):

from mayavi import mlab
from tvtk.tools import visual
fig=mlab.figure( bgcolor=(0, 0, 0))
visual.set_viewer(fig)

首先将盒子放在画布上的某个位置作为参考:

b=visual.Box(x=10,y=4,z=1)

然后我想要一个箭头伸出盒子:

a=visual.Arrow(x=10,y=4,z=1)

没有成功(与问题的第一部分相同):

Arrow_error

现在,让我们无缘无故地改变圆锥体的长度

a.length_cone

退货

0.35

我们改变一下吧

a.length_cone=0.5

现在箭头按应有的样子伸出了盒子 Arrow_error

将圆锥体的长度更改回 0.35,看看这是否会将箭头更改回错误位置

a.length_cone=0.35

不,箭头停留在框内应有的位置。这看起来像一个错误。

python vtk enthought mayavi
3个回答
3
投票

玩弄箭头,我编写了以下函数来生成从

x1,y1,z1
x2,y2,z2

的箭头
def Arrow_From_A_to_B(x1, y1, z1, x2, y2, z2):
    ar1=visual.arrow(x=x1, y=y1, z=z1)
    ar1.length_cone=0.4

    arrow_length=np.sqrt((x2-x1)**2+(y2-y1)**2+(z2-z1)**2)
    ar1.actor.scale=[arrow_length, arrow_length, arrow_length]
    ar1.pos = ar1.pos/arrow_length
    ar1.axis = [x2-x1, y2-y1, z2-z1]
    return ar1

1
投票

似乎

ArrowSource
不允许箭头延伸到短距离之外。 看起来根本没什么用。 mlab 函数如
quiver3d
返回基于
PolyDataSource
的字形。

这将绘制两个框和它们之间的箭头。 我不确定是否有一种简单的方法可以使用 quiver3d 来做到这一点,它肯定是基于 PolyDataSource 但可能不具有相同的结构。

b1=visual.Box()
b2=visual.Box(x=10)
v=mlab.pipeline.vectors(mlab.pipeline.vector_scatter(0,0,0,10,0,0)) #xyzuvw
v.glyph.glyph.clamping=False

此外,您遇到的

ArrowSource
行为看起来不像是一个错误,它更像是一个尚未真正开发的小功能。


0
投票

我有一个类似的场景,据我所知,使用 quiver3d 是迄今为止最好的选择,因为它为我提供了很多关于箭头样式的选项。我用:

x, y, z = 0, 0, 0
u, v, w = 1, 0, 0
v = mlab.quiver3d(x, y, z, u, v, w, mode='arrow')
v.glyph.glyph.clamping = False

夹紧确保箭头实际上具有您指定的长度。如果您不使用它,无论箭头应该有多短,它的最小长度都将是一个单位。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.