2016-07-20 5 views
0

поэтому у меня есть функция matlab ниже, которая возвращает матрицу координат [x y time_elapsed] от «start» до «target», а «target» достигается, когда она находится на расстоянии acc_length до нее. time_elapsed - помочь мне получить профиль скорости.Как я могу читать и хранить координаты мыши, в то время как остальная часть функции не делает много, в значительной степени срыв?

В настоящее время это работает отлично с выборкой примерно каждые 0,01 секунды, и при запуске движения с начала начинается 2-секундная пауза.

Вопрос: как я могу сделать то же самое - чтобы пользователь мог подождать 2 секунды, когда будет достигнуто положение «старт», но вместо приостановки программы, , как я могу читать координаты мыши (в течение периода 2 с), а ничего полезного не происходит для 2-х?

P.S. Я хочу, чтобы эти координаты вычислили точность пользователя для начала.

function arr = pmove(start, target, acc_length) 
uimenufcn(gcf,'WindowCommandWindow'); 

arr = []; 
checkStart = 1; 
checkEnd = 0; 

while checkStart 
    pt = get(0,'PointerLocation'); 
    pt = [pt(1) - 1920/2, pt(2) - 1080/2]; 
    d = pdist([start; pt]); 

    if ~checkEnd & d <= acc_length; 
     disp('Start moving to target after 2 seconds.') 
     pause(2); 
     pt = get(0, 'PointerLocation'); 
     pt = [pt(1) - 1920/2, pt(2)-1080/2, 0]; 
     arr = cat(1, arr, pt); 
     checkEnd = 1; 

     tic; 
     continue; 
    end 

    if checkEnd 
     d = pdist([target; pt]); 
     t_elapsed = toc; 
     pt = [pt , t_elapsed]; 
     arr = cat(1, arr, pt); 

     if d <= acc_length 
      checkStart = 0; 
     end 
    end 

    if ~isempty(arr) 
     figure(gcf) 
     hold on; 
     plot(arr(:,1), arr(:,2)); 
     %drawnow; 
     axis equal; 
    end 
    pause(0.01); 

end 

конца

ответ

0

Я использую другой с правдой цикл и проверкой time_elapsed, если он длиннее 2.1s (допуск 0,1 с для пользователя), я выхожу из цикла. Во время которого я получаю указатель, который связывает примерно каждые 0,01 секунды и выполняет мои вычисления.

tic; 
while 1 
    pt2 = get(0,'PointerLocation'); 

    % calculation 

    time_elaps = toc; 
    if time_elaps > 2.1  % tolerance of 0.1s 
     break; 
    end 
    pause(0.01); 
end 
+2

, пожалуйста, добавьте описание вашего ответа – Mostafiz

1

Вы можете заменить pause(2) линии:

for i=1:200 
    pt2 = get(0, 'PointerLocation'); 
    % do your calculation 
    pause(0.01); 
end 
+0

В идеале это для цикла будет работать в течение 2 секунд, однако реальность такова, что этот цикл займет больше времени, и я думаю, что должен быть еще один более чистый способ сделать это? –

+0

Если нет, я могу получить искомое значение времени с помощью «toc» и выйти из цикла, если оно превышает 2 с ... но, по-моему, должен быть лучший способ. –

+0

@SuhaibAhmad Вы можете запускать основной цикл while и 'pause (2)' в разделенных потоках, если расчет занимает много времени. Кстати, нет решения, которое вы можете гарантировать, что потребуется ровно 2 секунды, это все о том, сколько терпимости вы можете вынести. – saastn

 Смежные вопросы

  • Нет связанных вопросов^_^