MATLABでSVVを測る(制御編)

前回,SVVを測るMatlabプログラムについて,数学的な観点から傾きのある直線を引く方法まで述べました。

https://note.com/koh_hack_reha/n/n19f636db800b

そこで,今回はキーボード操作によって被験者が直線の傾きを制御できるようにします。

今回は,“KeyPressFcn”という機能を用います。文字の通り,キーボードが押された際に発動するファンクションです。

MATLABのファンクションについては,前の記事をご参照ください。


今回用いる以下のプログラムを“SVV.m”と名称づけ保存します。

function SVV()

 i = 60;
 figure('menubar','none','Color',[0 0 0],'KeyPressFcn',@lineCallback) %図の背景を黒に
 hold on
 X=plot([-1*cosd(i) 1*cosd(i)],[-1*sind(i) 1*sind(i)],'w','LineWidth',3);
 set(gca,'Color',[0 0 0],'XColor',[0 0 0],'YColor',[0 0 0]);
 set(gca, 'Xlim', [-1.5 1.5],'Ylim', [-1.5 1.5]);
 axis square %X軸とY軸のスケールを合わせる

%ここに後述のlineCallbackファンクションのコードを挿入する

end

前回の最後に記載したプログラムに対して,3行目に「'KeyPressFcn',@lineCallback」というコードを書き加えました(難しい話は避けたいので,何故そうするのかという話は割愛させていただきます)。

%ここに後述のlineCallbackファンクションのコードを挿入すると記載された箇所に以下のコードを書き加えてください。このコードに書かれている“lineCallback”は,キーボードが押された時に角度を1°だけマイナス方向にずらした直線に変更する,指示が記載されています(plotではなくsetを用いることで更新した直線データに書き換えることができます)。

function lineCallback(src,data)
i=i-1
set(X,'XData',[-1*cosd(i) 1*cosd(i)],'YData',[-1*sind(i) 1*sind(i)]);
end

このプログラムだとキーボードのどこを押してもマイナス方向に1だけ傾きます。操作性を考えて,右矢印を押した時にはマイナス方向に,左矢印を押した時にはプラス方向に傾くように書き加えましょう。

function lineCallback(src,data)
if strcmp(data.Key,'rightarrow')
i=i-1
set(X,'XData',[-1*cosd(i) 1*cosd(i)],'YData',[-1*sind(i) 1*sind(i)]);
elseif strcmp(data.Key,'leftarrow')
i=i+1
set(X,'XData',[-1*cosd(i) 1*cosd(i)],'YData',[-1*sind(i) 1*sind(i)]);
end

押したキーが右矢印か左矢印かで,操作を変えられるようにIF文を用いて場合分けをしました。

最後に,プログラム起動時に表示される時に,ある程度のランダム性をもった傾きで表示するように書き加えると,以下のようなプログラムが完成します。

function SVV()
 i=75+randi(30)
 figure('menubar','none','Color',[0 0 0],'KeyPressFcn',@lineCallback) %図の背景を黒に
 hold on
 X=plot([-1*cosd(i) 1*cosd(i)],[-1*sind(i) 1*sind(i)],'w','LineWidth',3);
  set(gca,'Color',[0 0 0],'XColor',[0 0 0],'YColor',[0 0 0]);
  set(gca, 'Xlim', [-1.5 1.5],'Ylim', [-1.5 1.5]);
  axis square %X軸とY軸のスケールを合わせる

%ここに後述のlineCallbackファンクションのコードを挿入する
 function lineCallback(src,data)
  if strcmp(data.Key,'rightarrow')
   i=i-1
   set(X,'XData',[-1*cosd(i) 1*cosd(i)],'YData',[-1*sind(i) 1*sind(i)]);
  elseif strcmp(data.Key,'leftarrow')
   i=i+1
   set(X,'XData',[-1*cosd(i) 1*cosd(i)],'YData',[-1*sind(i) 1*sind(i)]);
  end
 end

end

これで,簡易的ですがSVVを計測することができます。

この記事が気に入ったらサポートをしてみませんか?