Нажатие на поверхность определяется треугольной сеткой майяви

У меня возникли проблемы при попытке написать код для выбора поверхности, определяемой треугольной сеткой (точки и треугольники, соединяющие их) в 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.

Какие-нибудь мысли?

0 ответов

Другие вопросы по тегам