Используйте ломаную линию, чтобы создать угловой инструмент измерения

Этот пример показывает, что шаги должны создать инструмент измерения с тремя точками с помощью ROI Ломаной линии

Изображение на дисплее и ROI ломаной линии

Отобразите изображение и ломаную линию под прямым углом. Мы хотим предложить пользователю управлять ломаной линией, чтобы измерить углы интереса.

im = imread('gantrycrane.png');

% Display image in the axes
imshow(im)

% Get size of image
m = size(im,1);
n = size(im,2);

% Get center point of image for initial positioning
midy = ceil(m/2);
midx = ceil(n/2);

% Position first point vertically above the middle
firstx = midx;
firsty = midy - ceil(m/4);
lastx = midx + ceil(n/4);
lasty = midy;

% Add empty context menu to replace default menu
c = uicontextmenu;

% Create a two-segment right-angle polyline centered in the image
h = drawpolyline('Parent',gca,...
    'Position',[firstx,firsty;midx,midy;lastx,lasty],...
    'Label','Modify angle to begin...',...
    'Color',[0.8,0.2,0.2],...
    'UIContextMenu',c);

% Listen to event that fires as the ROI is being moved
addlistener(h,'MovingROI',@(src,evt) updateAngle(src,evt));

% Intercept attempts to add or remove vertices
addlistener(h,'AddingVertex',@(src,evt) storePositionInUserData(src,evt));
addlistener(h,'VertexAdded',@(src,evt) recallPositionInUserData(src,evt));
addlistener(h,'DeletingVertex',@(src,evt) storePositionInUserData(src,evt));
addlistener(h,'VertexDeleted',@(src,evt) recallPositionInUserData(src,evt));

Обновите метку в коллбэке

Когда пользователь изменяет ломаную линию, мы хотим повторно вычислить угол и обновить отображенную метку.

function updateAngle(src,evt)

% Get the current position
p = evt.CurrentPosition;

% Find the angle
v1 = [p(1,1)-p(2,1), p(1,2)-p(2,2)];
v2 = [p(3,1)-p(2,1), p(3,2)-p(2,2)];
theta = acos(dot(v1,v2)/(norm(v1)*norm(v2)));

% Convert it to degrees
angleDegrees = (theta * (180/pi));

% Update the Label to display the angle
src.Label = sprintf('(%1.0f) degrees',angleDegrees);

end

Препятствуйте тому, чтобы пользователи добавили или удалили вершины

Ломаная линия позволяет пользователям добавлять и удалять вершины; однако, угловой инструмент измерения принимает, что существует только три вершины в любое время. Мы хотим добавить прослушиватели, чтобы прервать, когда пользователь пытается добавить или удалить вершину. В коллбэке для событий 'AddingVertex ' and DeletingVertex' вершина интереса еще не была добавлена или удалена. Мы будем, кэшировал текущее положение ломаной линии в свойстве UserData, и восстановите его в коллбэке для событий 'VertexAdded' и 'VertexDeleted'. Это предотвратит пользователя от интерактивного добавления или удаления вершин для ломаной линии.

function storePositionInUserData(src,~)

% Before a vertex is added/removed, store the Position in the UserData
% property
src.UserData = src.Position;

end

function recallPositionInUserData(src,~)

% Restore the previous Position to prevent users from adding/removing
% vertices
src.Position = src.UserData;

end

Смотрите также

| |

Похожие темы