読者です 読者をやめる 読者になる 読者になる

新しい関数の作成2

説明

 新しい関数の作成の工夫をもう少し紹介する。以前は,返り値を指定していない関数を作成したが,返り値を作成することでより便利に関数を利用できる。例えば,注視点を描く関数は以下である。

int cenX, cenY;
color textColor = color(0, 0, 0);

void setup()
{
  size(displayWidth,displayHeight); //windowの大きさ
  pixelDensity(2); //retinaに対応
  cenX = width/2; //windowの中心のX座標
  cenY = height/2; //windowの中心のY座標
}

void draw()
{
 drawFixation();
}

void drawFixation() //注視点
{
  stroke(textColor); //線の色を指定
  strokeWeight(1); //線の太さを指定
  line(cenX,cenY+20,cenX,cenY-20); //線を引く(注視点の縦線)
  line(cenX+20,cenY,cenX-20,cenY); //線を引く(注視点の縦線)
  noStroke(); //枠線なし
}

 この関数を実行すると,画面の中心に,色が黒の線の太さが1の40ピクセルの縦線と横線が引かれる(≒注視点が描画される)。大抵の実験では,注視点は常に同じ色で描画されるが,場合によっては色を実験内で変えたい場合がある。例えば,注意実験ではキャッチ試行と呼ばれる,刺激が提示されない試行が設定される場合がある。通常の試行は「黒い注視点→刺激」の順に出すが,キャッチ試行は「赤い注視点」だけが提示され,その場合は,すばやくスペースボタンを押すよう求めるという具合である。このような色を変化させた注視点を関数として描く場合には2つの方法がある。

1つ目

 単純に白い注視点の関数と,赤い注視点の関数を作成する方法である。以下の例では,それぞれ,drawBlackFxiationとdrwaRedFixationで違う色の注視点を描画している。わかりやすいと言えばわかりやすいが,コードが長くなる。

int cenX, cenY;
color blackFixationColor = color(0, 0, 0);
color redFixationColor = color(255, 0, 0);

void setup()
{
  size(displayWidth,displayHeight); //windowの大きさ
  pixelDensity(2); //retinaに対応
  cenX = width/2; //windowの中心のX座標
  cenY = height/2; //windowの中心のY座標
}

void draw()
{
 drawRedFixation(); //赤い注視点を描画
}

void drawBlackFixation() //黒い注視点
{
  stroke(blackFixationColor); //線の色を指定
  strokeWeight(1); //線の太さを指定
  line(cenX,cenY+20,cenX,cenY-20); //線を引く(注視点の縦線)
  line(cenX+20,cenY,cenX-20,cenY); //線を引く(注視点の縦線)
  noStroke(); //枠線なし
}

void drawRedFixation() //赤い注視点
{
  stroke(redFixationColor); //線の色を指定
  strokeWeight(1); //線の太さを指定
  line(cenX,cenY+20,cenX,cenY-20); //線を引く(注視点の縦線)
  line(cenX+20,cenY,cenX-20,cenY); //線を引く(注視点の縦線)
  noStroke(); //枠線なし
}

2つ目

 注視点を描く関数を実行する際に色だけを実行ごとに指定するような関数を作成する。drawFixation(int r, int g, int b)がポイントとなっている。このr, g, bを実行時に任意の数値を入れることで線の色を操作する。例えば,赤い注視点であれば,実行時にdrawFixation(255, 0, 0)とすればよいし,黒であれば,drawFixation(0, 0, 0)とすればよい。

int cenX, cenY;

void setup()
{
  size(displayWidth,displayHeight); //windowの大きさ
  pixelDensity(2); //retinaに対応
  cenX = width/2; //windowの中心のX座標
  cenY = height/2; //windowの中心のY座標
}

void draw()
{
 drawFixation(255,0,0); //赤い注視点を描画
}

void drawFixation(int r, int g, int b) //注視点の関数
{
  stroke(r,g,b); //線の色を指定
  strokeWeight(1); //線の太さを指定
  line(cenX,cenY+20,cenX,cenY-20); //線を引く(注視点の縦線)
  line(cenX+20,cenY,cenX-20,cenY); //線を引く(注視点の縦線)
  noStroke(); //枠線なし
}

 同様に,色だけでなく,太さや描画位置なども実行時に指定するような関数として定義することもできる。ただし,あまり複雑にすると混乱するかもしれない。

void setup()
{
  size(displayWidth,displayHeight); //windowの大きさ
  pixelDensity(2); //retinaに対応
}

void draw()
{
 //drawFixation(R, G, B, 線の太さ, 線の長さ,X座標, Y座標)
 drawFixation(255, 0, 0, 3, 30, 100, 100); //赤い注視点を描画
}

void drawFixation(int r, int g, int b,
int fixationWeight, int fixationWidth, int x, int y) //注視点の関数
{
  stroke(r,g,b); //線の色を指定
  strokeWeight(fixationWeight); //線の太さを指定
  line(x,y+fixationWidth,x,y-fixationWidth); //線を引く(注視点の縦線)
  line(x+fixationWidth,y,x-fixationWidth,y); //線を引く(注視点の縦線)
  noStroke(); //枠線なし
}
}