上へ

メンタル・ローテーション(Mental Rotation: 心的回転)と反応時間

 

メンタルローテーションのVisual C++によるデモンストレーション・プログラムを用意した。実行形式のプログラムmental_rotation.exeはファイル名mental_rotation.exeをクリックしてダウンロードしたものをダブルクリックするなどによって実行することができる。.NET Framework 3.5対応である。プログラムのソースコードなどは圧縮ファイルmental_rotation.zipにまとめたので、クリックしてダウンロードしたmenatal_rotation.zipをマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」などを選んで解凍することができる。解凍したファイルはVisual C++2008などで開くことができる。

 プログラムを実行すると図1のフォームが表示される。

図1

 

GO」ボタンのクリック(ボタンにフォーカスが設定されているので、スペースバーを押してもよい)で、「R」あるいはそれを左右反転した文字を0度以上回転した文字が表示される。表示された文字が「R」であればJキーを押し、「R」を左右反転したものを0度以上回転したものであるときはFキーを押す。図2は「R」を左右反転したものを0度回転したものが表示された場合を示す。

図2

 

図3は「R」を180度回転したものが提示された場合である。適切なキーが押されなかった場合は無視され、提示された図形に対して適切なキーが押されるまで提示図形の表示が続き、適切なキーが押されると図形は消えて次の試行に移り、図1のような場面になる。試行数はフォームの左上に「試行数/総試行数」の形式で表示されている。

図3

 

0度以上回転された文字の提示と適切なキーが押されるまでの反応時間の記録が72試行繰り返される。72試行が終了すると、各条件に対する反応時間の中央値が折れ線グラフの形式で表示される(図4)。文字の回転角が180度に近いほど反応時間が長くなっている。

 

図4 縦軸の反応時間の単位はmsec.

 

 プログラムでは、文字の回転をビットマップ上でピクセル単位で行っている。ビットマップ型のオブジェクトは8種類の文字図形に対応して参照クラス型の配列として

 

                                 bms = gcnew array<Bitmap ^>(8);

                                 for (int i = 0; i < 8; i++){

                                         bms[i] = gcnew Bitmap(pw, ph);

                                 }

 

と用意している。参照クラス型については<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房、第11章 参照型>で、参照クラス型の配列はp. 269で説明している。

これらのビットマップbms[i]に、回転した文字図形を

 

                                 for (int ip = 0; ip < 4; ip++){

                                         for (int i = 0; i < pw; i++)

                                                 for (int j = 0; j < ph; j++){

                                                                double X, Y;

                                                                double theta = ip * Math::PI / 2.0;

                                                                RotCoord( i - x0, ph - j - y0, X, Y, theta );

                                                                bms[ip]->SetPixel(i, j, bmT->GetPixel( X + x0T, phT - (Y + y0T)) );

                                                                bms[4 + ip]->SetPixel(i, j, bmTR->GetPixel( X + x0T, phT - (Y + y0T)) );

                                                 }

                                 }

 

と作成している。

 実験参加者の反応はキー押しによっているので、このキー押しをプログラムで処理できるように

                                 this->KeyPreview = true;

と設定している。

キー押しは、キー押しイベントに対するイベントハンドラ

Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e);

によって処理している。このイベントハンドラの用意の仕方は<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>のp. 235を参照されたい。

押されたキーの処理は、次のswitch文によって処理している。

 

                 switch (e->KeyData) {

                         case Keys::J : if (st[itrial] < n_st/2){

                                                                ckRes = true;

                                                                rt[itrial] = t1 - ckT0;

                                                                itrial++;

                                        }      

                                        break;

                         case Keys::F : if (st[itrial] >= n_st/2){

                                                                ckRes = true;

                                                                rt[itrial] = t1 - ckT0;

                                                                itrial++;

                                        }

                                        break;

                         default :     

                                        break;

                 }

 

プログラム中における定数は、Form1.hファイルとは別のソースファイルcommon.cppにおいて

 

        const int n_st = 12;

        const int n_rep = 6;

        const int n_trials = n_st * n_rep;

 

 

などと定義している。この定義は、ヘッダーファイルcommon.h

 

        extern const int n_st, n_rep, n_trials;

 

と宣言して、common.hincludeすることにより利用している。フォームの宣言されているForm1.hファイルにヘッダーファイルをincludeするときは

 

#include "Windows.h"

#include "DispRTs.h"

#include "WHRN.h"

#include "common.h"

 

というように、Visual C++に用意されているシステム・ヘッダーファイル(今の場合は、Windows.h)を先にincludeしてから、自分が用意したヘッダーファイルをincludeする。

ヘッダーファイルWindows.hは、時刻(ミリ秒単位)を得る関数

GetTickCount()

を利用するためのものである。

 

 

参考文献

S. Nolen-Hoeksema, B. L. Fredrickson, G. R. Loftus and W. A. Wagenaar (2009).  Atkinson & Hilgard’s Introduction to Psychology, 15th Edition.  Wadsworth.

 

上へ