2013-07-03 1 views
3

Я вижу неустойчивое поведение с помощью курсора данных в MATLAB R2011b при применении к графикам триангулированных 3d-поверхностей: при нажатии на определенные точки выбираются совершенно разные точки. Пример с цилиндром:Ошибочное поведение курсора данных для триангулированных 3d-поверхностей в MATLAB R2011b

[r, phi, h] = meshgrid(1, 0:pi/10:2*pi, 0:0.05:1); 
x = r.*cos(phi); 
y = r.*sin(phi); 
z = h; 
xyz = [x(:) y(:) z(:)]; 
tri = delaunay(xyz); 
trimesh(tri, xyz(:,1), xyz(:,2), xyz(:,3), ... 
     'LineStyle', 'none', 'Marker', '.', 'MarkerSize', 30) 
view(-37, 28) 

Затем включите режим курсора данных и попытаться выбрать самую верхнюю точку одного из столбцов в передней. При моей установке MATLAB не выбирает точку под курсором, а другую, которая, по-видимому, выбирается случайным образом.

Является ли это ошибкой или я делаю что-то неправильно?

ответ

1

Я нашел решение этой проблемы в a File Exchange contribution by Jochen Rau. Вы можете определить, какие данные можно выбрать с помощью курсора данных через the 'HitTest' property. Так что в примере, который я предоставил, где я хотел, чтобы только маркеры могли быть выбраны, сетку без маркеров и «HitTest», установленную на «off», а затем используйте «scatter3» для построения маркеров.

[r, phi, h] = meshgrid(1, 0:pi/10:2*pi, 0:0.05:1); 
x = r.*cos(phi); 
y = r.*sin(phi); 
z = h; 
xyz = [x(:) y(:) z(:)]; 
tri = delaunay(xyz); 
figure 
hold on 
trimesh(tri, xyz(:,1), xyz(:,2), xyz(:,3), ... 
     'LineStyle', 'none', 'Marker', 'none', 'HitTest', 'off') 
scatter3(xyz(:,1), xyz(:,2), xyz(:,3)) 
view(-37, 28) 

Если вам интересно, в чем смысл построения триангуляции: это поможет визуализировать облака точек, заслоняя точки, находящиеся сзади. Вызов «trimesh» выполняет это, потому что он по-прежнему рисует грани в белом.

+0

Ах очень хорошо, свойство HitTest выглядит как полезное. –

1

Я думаю, это потому, что у вас так много линий в вашей сетке; если вы удалите «linestyle», «none» и зарисуете небольшую часть сетки (используя, например, [r, phi, h] = meshgrid(1, 0:pi/10:2*pi, 0:0.5:1); as your first line, вы можете видеть, что они проходят через ваш цилиндр. Режим курсора данных переместится в ближайшую вершину на строку, на которую вы нажимаете , поэтому, если вы нажимаете на строку, которая скрыта под лицом, она может перейти к вершине на этой строке, а не только к точкам, которые вы сделали видимыми. Я не уверен, есть ли простой способ изменить это поведение.

+0

Спасибо за этот намек, он подтолкнул меня в правильном направлении. Смотри ниже. –

0

Решение для меня состояло в том, чтобы установить свойство «SnapToDataVertex» объекта курсора данных «выключено».

dc = datacursormode; 
set(dc,'SnapToDataVertex','off') 

При установке по умолчанию, «на», нажав на объект патч вызывает datacursor, чтобы перейти к вершине ближайшей линии прямой видимости, даже если лицо окклюзии. Когда выключено, датакурс перемещается в точку, где линия визирования пересекает ближайшую грань, что обычно является тем, что я хочу.

 Смежные вопросы

  • Нет связанных вопросов^_^