Matlab: конвертировать глобальные координаты в координаты фигуры - PullRequest
4 голосов
/ 05 мая 2010

Если я получу координаты через

coords = get(0,'PointerLocation');

Как я могу конвертировать их в очки, полученные через ginput?

т.е. я бы хотел получить те же значения из

coords = get(0,'PointerLocation');
coords=someConversion(coords);

Как бы я получил, позвонив по номеру

coords=ginput(1);

И щелчок внутри фигуры в том же месте, где была мышь в предыдущем бите кода.

Ответы [ 2 ]

8 голосов
/ 05 мая 2010

Вот пример того, как вы можете сделать это преобразование ...

Допустим, у вас есть фигура, и эта фигура содержит объект оси с ручкой 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

1 голос
/ 05 мая 2010

Вы можете получить положение фигуры, используя getpixelposition(gcf), а затем вычесть первые 2 элемента (x, y нижнего левого угла) из PointerLocation, чтобы получить относительное местоположение фигуры.

Для более сложных преобразований (например, относительно некоторых внутренних панелей или осей) вам может потребоваться рекурсивное извлечение относительных положений подкомпонентов. Посмотрите на pixelposition.m или moveptr.m для некоторых примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...