Простая стрелка mayavi/tvtk в mlab, странное поведение (похоже на баг)

Я пытаюсь сделать простую стрелку в 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, два ящика будут совмещены), однако стрелка - нет. Это то, что я вижуЭто ошибка или функция?

Обновлять:

Я пытался исправить вышеизложенное и нашел поведение стрелки очень странным. Вот что я делаю (в 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

Нет, стрелка остается в поле, где она должна быть. Это похоже на ошибку.


person Sleepyhead    schedule 20.11.2013    source источник
comment
Какой пакет visual?   -  person aestrivex    schedule 20.11.2013


Ответы (2)


Играя со стрелкой, я написал следующую функцию для создания стрелки от 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
person Sleepyhead    schedule 20.11.2013

Похоже, что 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, не похоже на ошибку, это скорее второстепенная функция, которая на самом деле не разрабатывалась.

person aestrivex    schedule 20.11.2013
comment
Это возможное решение, спасибо. Однако мне не нравится, как выглядит эта стрелка. Есть ли способ изменить его внешний вид (что-то вроде того, что в вопросе) - person Sleepyhead; 21.11.2013
comment
Вы можете изменить v.glyph.glyph_source.glyph_source.glyph_type, но ни один из этих вариантов не приведет к стрелке с коническим наконечником. Но некоторые из них будут производить стрелки другого вида. - person aestrivex; 21.11.2013