Main Content

Utilice Polilínea para crear una herramienta de medición de ángulo

Este ejemplo muestra los pasos necesarios para crear una herramienta de medición de tres puntos mediante un ROI de Polyline

Mostrar imagen y ROI de polilínea

Muestre una imagen y una polilínea en ángulo recto. Queremos pedir al usuario que manipule la polilínea para medir los ángulos de interés.

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));

Actualizar etiqueta en devolución de llamada

A medida que el usuario remodela la polilínea, queremos volver a calcular el ángulo y actualizar la etiqueta que se muestra.

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

Evitar que los usuarios agreguen o eliminen vértices

La polilínea permite a los usuarios agregar y eliminar vértices; sin embargo, una herramienta de medición de ángulo supone que sólo hay tres vértices en cualquier momento. Queremos agregar agentes de escucha para interceptar cuando un usuario está intentando agregar o quitar un vértice. En la devolución de llamada de los eventos 'AddingVertex' y DeletingVertex', el vértice de interés aún no se ha agregado o eliminado. Almacenaremos en caché la posición de polilínea actual en la propiedad UserData y la restauraremos en la devolución de llamada para los eventos 'VertexAdded' y 'VertexDeleted'. Esto evitará que el usuario agregue o quite vértices de forma interactiva para la polilínea.

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

Consulte también

| |

Temas relacionados