Вот пример того, как вы можете сделать это преобразование ...
Допустим, у вас есть фигура, и эта фигура содержит объект оси с ручкой hAxes
. Использование функции ginput
позволит вам выбрать точки на осях. Чтобы получить эквивалентный набор точек из get(0, 'PointerLocation')
, который дает координаты относительно экрана, необходимо учитывать положение фигуры, положение осей, ширину / высоту осей и пределы осей.
Делать это сложно, потому что вы хотите, чтобы показатели положения были в одних и тех же единицах. Если вы хотите вычислить все в единицах пикселей, это означает, что вам нужно установить свойства 'Units'
объектов равными 'pixels'
, получить позиции, а затем установить свойства 'Units'
обратно на прежние значения. Я обычно делаю свою собственную функцию get_in_units
, чтобы выполнить эту часть:
function value = get_in_units(hObject, propName, unitType)
oldUnits = get(hObject, 'Units'); % Get the current units for hObject
set(hObject, 'Units', unitType); % Set the units to unitType
value = get(hObject, propName); % Get the propName property of hObject
set(hObject, 'Units', oldUnits); % Restore the previous units
end
Используя вышеупомянутую функцию, вы можете создать другую функцию get_coords
, которая получает экранные координаты и преобразует их в координаты осей:
function coords = get_coords(hAxes)
% Get the screen coordinates:
coords = get_in_units(0, 'PointerLocation', 'pixels');
% Get the figure position, axes position, and axes limits:
hFigure = get(hAxes, 'Parent');
figurePos = get_in_units(hFigure, 'Position', 'pixels');
axesPos = get_in_units(hAxes, 'Position', 'pixels');
axesLimits = [get(hAxes, 'XLim').' get(hAxes, 'YLim').'];
% Compute an offset and scaling for coords:
offset = figurePos(1:2)+axesPos(1:2);
axesScale = diff(axesLimits)./axesPos(3:4);
% Apply the offsets and scaling:
coords = (coords-offset).*axesScale+axesLimits(1, :);
end
Полученный coords
должен быть близок к тем, которые вы получили бы при использовании ginput
. Обратите внимание, что если объект оси вложен в какие-либо объекты uipanel на рисунке, вам также придется учитывать положения панели.
Пример:
Чтобы проиллюстрировать поведение приведенного выше кода, вот небольшой пример. После создания вышеуказанных функций создайте третью функцию:
function axes_coord_motion_fcn(src, event, hAxes)
coords = get_coords(hAxes); % Get the axes coordinates
plot(hAxes, coords(1), coords(2), 'r*'); % Plot a red asterisk
end
Затем запустите следующий код:
hFigure = figure; % Create a figure window
hAxes = axes; % Create an axes in that figure
axis([0 1 0 1]); % Fix the axes limits to span from 0 to 1 for x and y
hold on; % Add new plots to the existing axes
set(hFigure, 'WindowButtonMotionFcn', ... % Set the WindowButtonMotionFcn so
{@axes_coord_motion_fcn, hAxes}); % that the given function is called
% for every mouse movement
И когда вы наводите указатель мыши на оси фигур, вы должны увидеть след красных звездочек, нанесенных позади него, например:
![enter image description here](https://i.stack.imgur.com/ufC6S.jpg)