# Работа с мышкой в MATLAB

## 12. Продолжение примера 6

Займёмся самым главным: программированием свойств и методов для работы с мышкой. Нам нужно будет отслеживать, нажата кнопка мышки или нет. Опишем для этого переменную mip и сделаем её глобальной (добавим её также в файл PlotSpline.m). При нажатии на кнопку мышки эта переменная будет приобретать значение 1, а при отпускании − 0. Сделаем также глобальными переменными коэффициенты масштаба (они нам будут нужны для пересчёта экранных координат курсора в реальные координаты узловых точек) и дескриптор фигуры.

В фигуре определим методы WindowButtonDownFcn, WindowButtonUpFcn и WindowButtonMotionFcn. Первые два метода имеют короткие команды: мы просто присваиваем переменной mip значения 1 или 0 соответственно. Поэтому запишем их как строку. А вот обработка события, связанного с движением мышки, достаточно длинная, и мы выделим её в отдельную функцию ChangePointer. Вот её текст:

    function ChangePointer % работа с мышкой
    global mip scw sch x y xx hFig hAxes;
    p = get(hFig,'CurrentPoint'); % координаты мышки
    xscr = x*scw+20; % экранные абсциссы узловых точек
    yscr = y*sch+20; % экранные ординаты узловых точек
    pinp = find((p(1)>xscr-3)&(p(1)<xscr+3)&...
      (p(2)>yscr-3)&(p(2)<yscr+3)); % какие узлы захвачены?
    if isempty(pinp), % нет захваченных узлов
      set(hFig,'Pointer','arrow'); % указатель - стрелка
    else % есть захваченный узел
      set(hFig,'Pointer','crosshair'); % указатель - крестик
    end
    if (~isempty(pinp))&mip, % нажата кнопка и точка захвачена
      x(pinp) = (p(1)-20)/scw; % новая абсцисса узла
      y(pinp) = (p(2)-20)/sch; % новая ордината узла
      PlotSpline; % перерисовали сплайн и узловые точки
    end
    return % возврат в вызывающую программу

Файл ChangePointer.m нужно поместить в какой-либо каталог, доступный системе MATLAB. А наш основной файл DragSpline.m выглядит сейчас так:

clear all % очистили рабочую область global mip scw sch x y xx hFig hAxes; scrsz = get(0,'ScreenSize'); % размеры экрана монитора wscr = 640; % ширина окна hscr = 440; % высота окна waxe = wscr-40; % ширина осей haxe = hscr-40; % высота осей wgr = 6; % диапазон по x hgr = 4; % диапазон по y scw = waxe/wgr; % масштаб по x sch = haxe/hgr; % масштаб по y pl = (scrsz(3)-wscr)/2; % левый край фигуры pu = (scrsz(4)-hscr)/2; % верхний край фигуры hFig = figure('Position',[pl pu wscr hscr],... 'Resize','off','MenuBar','none',... 'NumberTitle','off',... 'WindowButtonMotionFcn','ChangePointer;',... 'WindowButtonDownFcn','mip=1;',... 'WindowButtonUpFcn','mip=0;',... 'Name','Spline Interpolation'); hAxes = axes('Units','pixels',... 'Position',[20 20 waxe haxe],... 'XLim',[0 wgr],'YLim',[0 hgr]); x = 0:wgr; % абсциссы узловых точек y = rand(1,wgr+1)*hgr; % ординаты узловых точек xx = 0:0.01:wgr; % абсциссы точек графика сплайна PlotSpline; % рисуем график сплайна

Если картинка при перерисовке мигает, нужно изменить ещё одно свойство фигуры: renderer. Оно отвечает за механизм перерисовки. По умолчанию значение этого свойства painters. Попробуйте изменить его на zbuffer или OpenGL.