座標系と図形の描画

  • by

MATLABもPsychtoolboxも、イメージの位置を表すときはピクセル座標系と空間座標系を使い、3次元の位置は3次元座標系を使う。原点は左上となり、横方向がx軸で縦方向がy軸になる。

塗りつぶした長方形を描く

コマンドウィンドウで、Psychtoolboxの関数Screenにパラメータを指定して円や長方形を描画する。上図のように800×600pxの画面を作り、指定した位置に指定した大きさの長方形を描いてみる。

エディタータブで「新規作成」→「スクリプト」をクリックして関数を宣言する。「保存」→「新規」をクリックし宣言した関数名と同じファイル名で保存する。

%関数の宣言
function draw_rect()

最初に関数Screenを使いウィンドウの設定を行う。以下のパラメータは「’サブコマンド’,出力先,色,ピクセルサイズ」の順で書いてある。具体的には、「’全画面表示’,モニタへ出力,白,幅が0〜800で高さが0〜600」となる。

%ウィンドウの設定
main_window = Screen('OpenWindow', 0, 255, [0,0,800,600]);

描画する図形の設定を行う。以下のパラメータは、「’描画する形状’,[色],[大きさ]」の順で書いてある。具体的には、「’塗りつぶした長方形’,[R142 G195 B31],[描画の開始位置がx150,y150で終了位置がx650,y450]となる。

%描画の設定
Screen('FillRect', main_window, [142 195 31], [150,150,650,450]);

あとは、描画した図形を表示して、クリックされたら画面を閉じる処理を書く。

Screen('Flip', main_window);
GetClicks;
Screen('CloseAll');

色情報を変数に代入する
RGB値より色名の方が覚えやすい。何回か設定する必要があるときは変数で用意しておくといい。ここまでに完成したしたプログラムは以下のようになる。

function draw_rect() 
 
%色情報を変数に代入。白や黒の場合は中括弧を使わず0や255でも大丈夫
white = [255 255 255];
green = [142 195 31];
 
main_window = Screen('OpenWindow', 0, white, [0,0,800,600]);
Screen('FillRect', main_window, green, [150,150,650,450]);
Screen('Flip', main_window);
GetClicks;
Screen('CloseAll');

Psychtoolboxの円と長方形を描くサブコマンド

FrameRect 長方形の枠
FrameOval円の枠
FillRect 塗りつぶした長方形
FillOval塗りつぶした円
円と長方形を描くサブコマンド

画面の中央に円形を描画する

今度は画面の中心に塗りつぶした円形を描いてみる。関数RectCenterを使用して画面の中心座標を取得し、draw_rectを複製して赤文字のように改変する。作業は、関数名と同じファイル名にして複製したファイルで行う。

function draw_oval()

white = [255 255 255];
green = [142 195 31];

[main_window, rect_window] = Screen('OpenWindow', 0, white, [0,0,800,600]);

[x_center, y_center] = RectCenter(rect_window);
fix_position = [x_center-100 y_center-100 x_center+100 y_center+100];

Screen('FillOval', main_window, green, fix_position);
Screen('Flip', main_window);

GetClicks;
Screen('CloseAll');

画面が800×600pxの場合、x400, y300が中心の座標となる。円の大きさを指定するときは、画面の中心からx軸、y軸とも+方向と−方向へ半径分指定するため、画面の大きさを取得しておかなければならない。

画面作成を代入するmain_windowに続けて、その画面の大きさを取得する変数を作る。rect_windowには、画面左上のx、y座標、右下のx、y座標が、その順番で代入される。

% 画面作成と同時に画面の大きさを取得
[main_window, rect_window] = Screen('OpenWindow', 0, white, [0,0,800,600]);

RectCenterは、矩形の中心に最も近い整数のx,y値を返す関数である。これをx軸の中心とy軸の中心として、それぞれの変数を作って用意する。そして、図形の大きさを画面中央からの距離で指定して、描画する内容を設定する。

%x軸の中心とy軸の中心を取得
[x_center, y_center] = RectCenter(rect_window);

%図形を描画する大きさと位置を指定
fix_position = [x_center-100 y_center-100 x_center+100 y_center+100];

%描画する「図形の形状、表示先、色、位置」を指定
Screen('FillOval', main_window, green, fix_position);

同期テストのスキップ

プログラム実行時、低スペックのパソコンではモニタとの同期が取れず、プログラムが実行されない場合がある。これは、Psychtoolboxのバーティカルリトレース(VBL)への設定がうまくいっていないことから生じる。

----- ! PTB - ERROR: SYNCHRONIZATION FAILURE ! -----

実験に使うプログラムでは、正確なタイミングで視覚刺激が呈示できないと、取得したデータの信憑性が低下する可能性がある。それを承知した上でプログラムを実行するときは、同期テストをスキップする設定をプログラムの最初のほうに書いておく。ただし、プログラムを実行する度に警告画面が表示される。

% 1がスキップで0は同期させる設定
Screen('Preference', 'SkipSyncTests', 1);