Нажатие на поверхность определяется треугольной сеткой майяви
У меня возникли проблемы при попытке написать код для выбора поверхности, определяемой треугольной сеткой (точки и треугольники, соединяющие их) в Mayavi.
Я уже попробовал следующее:
from mayavi import mlab
from numpy import array
################################################################################
# define data
D = 150
B = 100
H = 100
L = 50
# defining coordinates of points
x = array([0, 0, D, D])
y = array([B, B/2, B/2, B])
z = array([0, 0, 0, 0])
# defining the 2 triangles to construct surface
triangles = array([(0, 1, 2),
(0, 2, 3)])
################################################################################
# Plot the data
fig = mlab.figure(1)
mlab.clf()
# Plot a plane with a triangular mesh constructed with above-defined data
plane = mlab.triangular_mesh(x, y, z, triangles,
transparent=False,
resolution=10,
color=(0.5,0.3,0.5))
# Plot the cursor which will be updated at each click on the plane
cursor3d = mlab.points3d(0., 0., 0.,
mode='axes',
color=(0, 0, 0),
scale_factor=1)
mlab.title('Click on the plane')
mlab.view(180, 0)
################################################################################
# Some logic to select 'mesh' and the data index when picking.
def picker_callback(picker_obj):
# retrieve VTK actors of picked objects
picked = picker_obj.actors
if plane.actor.actor._vtk_obj in [o._vtk_obj for o in picked]:
# Get mouse position on-click
position = picker_obj.pick_position
# Move the cursor in scene according to new clicked coordinates
cursor3d.mlab_source.reset(x=position[0],
y=position[1],
z=position[2])
# Connecting picker_callback to the figure
fig.on_mouse_pick(picker_callback)
# show the fig
mlab.show()
Но, видимо, при нажатии на поверхность оказывается, что сборщик распознает только вершины поверхности, определенные (x, y, z). И то, что я хочу, это щелкать, где только можно, на поверхности и иметь возможность выбирать координаты точки.
Я уже пытался настроить толерантность сборщика, но это было бесполезно.
Я также пытался сделать это с помощью функции contour3d из массива 100*100. Это сработало, так как сборщик распознает глифы, созданные contour3d, но данных было слишком много, и их создание заняло слишком много времени по сравнению с функцией triangular_mesh.
Какие-нибудь мысли?