Продолжение моего предыдущего ответа ...
- Добавить слушателя к каждой новой точке.
- Вам не нужно иметь несколько
handles.el
, вы можетепросто игнорируйте el
, потому что вы все равно его не используете. - Вы можете сохранить массив дескрипторов созданных точек (если вам это нужно).
- Вы можете сохранить индекс точкив
mypoint.UserData
(если вам это нужно). - В обратном вызове слушателя вы можете получить любую точку из массива, а также проверить индекс точек, вызвавших событие.
Вот соответствующие части кода (пожалуйста, прочитайте комментарии):
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
axes(handles.axes1);
mypoint = drawpoint;
%Add event listenr to every point
%if ~isfield(handles, 'el')
addlistener(mypoint, 'ROIMoved', @mypointmoved_Callback);
%end
%Save an array of handles to created points:
if ~isfield(handles, 'mypoints')
mypoint.Color = [0.7410, 0.2, 0]; %First point has a different color.
handles.mypoints = mypoint; %Add first point.
%Distance from the first added point.
handles.distx = 0;
handles.disty = 0;
set(handles.edit1, 'String', '0'); %Display the distance from the first added point.
else
handles.mypoints(end+1) = mypoint; %Add a new point to the end of the array
end
points_counter = length(handles.mypoints); %Number of points - use as "Point serial number".
mypoint.UserData = points_counter; %Store the index of the point in UserData property
% Update handles structure
guidata(hObject, handles);
function mypointmoved_Callback(src, eventData)
handles = guidata(src.Parent); %Get the handles using the parent of the point (the axes).
if src.UserData == 1
%Example for using the index of the point stored in UserData property.
set(handles.edit1, 'String', '0');
return;
end
px = src.Position(1);
py = src.Position(2);
%Get the first point that added by the user
p0 = handles.mypoints(1);
%Get the x,y position of the first point that added by the user
p0x = p0.Position(1);
p0y = p0.Position(2);
%Compute the distance from p0:
distx = abs(px - p0x);
disty = abs(py - p0y);
handles.distx = distx;
handles.disty = disty;
dist = norm([distx, disty]); %Euclidean distance
%Display the euclidean distance from p0.
set(handles.edit1, 'String', num2str(dist));
drawnow
В этом примере показано евклидово расстояние от точки, которая была перемещена пользователем до первой добавленной точки (пользователем). ).