Как заставить MATLAB обнаруживать ход клавиатуры (стрелки) и записывать данные?

Я пытаюсь сделать код MATLAB, который обнаруживает клавиши со стрелками влево и вправо на клавиатуре, пока есть фигура, и записывает нажатия клавиш.

double(get(gcf,'currentcharacter'))

Я попробовал вышеуказанную функцию, но я не думаю, что это та, которую я искал.


person Edward M.    schedule 15.04.2017    source источник


Ответы (2)


Вы можете использовать гинпут

[~,~,button]=ginput(1);
switch button
    case 30 %up
    case 31 %down
    case 28 %left
    case 29 %right
end
person Gelliant    schedule 15.04.2017
comment
Спасибо. Это работает, но как сделать «прицел» невидимым? До его использования перекрестия не было, но теперь оно появляется. - person Edward M.; 15.04.2017
comment
Вы можете редактировать ginput.m. В моем Matlab (2016b) это строка 260: set(crossHair, 'Visible', 'on'); если вы измените это на set(crossHair, 'Visible', 'off'); перекрестие исчезло. также, если вы закомментируете строку 210 set(gcf,'Pointer','custom','PointerShapeCData',cdata,'PointerShapeHotSpot',hotspot), указатель останется видимым. - person Gelliant; 15.04.2017
comment
Приведенное ниже решение от Mendi Barr более элегантно. Вы пишете свою собственную функцию для того, что должно происходить при нажатии клавиши. Но адаптировать ginput и переименовать его в myginput.m очень просто. - person Gelliant; 16.04.2017
comment
Спасибо. Еще один вопрос. Тогда, если я изменю ginput.m и отправлю свой файл кому-то другому, будет ли он все еще применяться? - person Edward M.; 16.04.2017
comment
Нет, потому что ginput.m — это функция Matlab. У кого-то еще есть оригинальная функция в матлабе. Желательно сохранить его не как ginput.m а например как myginput.m и ссылаться на него в своей программе: [~,~,button]=myginput(1); Когда вы отправляете его кому-то, вы включаете myginput.m - person Gelliant; 16.04.2017

Что-то, что я написал в прошлом для интерактивного масштабирования и панорамирования в цифрах:

set(gcf,'WindowKeyPressFcn',{@KeyPressd,mean(xlim)});

И в «KeyPressd.m»:

  function [  ] = KeyPressd( src,evnt,S0 )
    switch evnt.Key
        case 'f'
            set(gca,'XLim', xlim + range(xlim)/100 );
        case 'v'
            set(gca,'XLim', xlim - range(xlim)/100 );
        case 'h'
            set(gca,'YLim', ylim + range(ylim)/100 );
        case 'n'
            set(gca,'YLim', ylim - range(ylim)/100 );
        case 'g'
            set(gca,'ZLim', zlim + range(zlim)/100 );
        case 'b'
            set(gca,'ZLim', zlim - range(zlim)/100 );

        case 'd'
            set(gca,'XLim', xlim - 0.02*(xlim-sum(xlim)/2) );
        case 'c'
            set(gca,'XLim', xlim + 0.02*(xlim-sum(xlim)/2) );
        case 'a'
            set(gca,'YLim', ylim - 0.02*(ylim-sum(ylim)/2) );
        case 'z'
            set(gca,'YLim', ylim +  0.02*(ylim-sum(ylim)/2)  );
        case 's'
            set(gca,'ZLim', 0.98*(zlim) );
        case 'x'
            set(gca,'ZLim', 1/0.98*(zlim) );

    end
    set(gca,'ZTickLabel',sprintf('%1.0f\n',get(gca,'ZTick')));
person Mendi Barel    schedule 15.04.2017