戻る

グラフィックスプログラマになる 09 (2024/07/13)

繰り返す

前回のコードを見てみましょう。


void OnPaint(HDC hdc)
{
  COLORREF color = RGB(0, 0, 0);

  int x = 20;
  int y = 10;

  SetPixel(hdc, x, y, color);
  SetPixel(hdc, x + 1, y, color);
  SetPixel(hdc, x + 2, y, color);
  SetPixel(hdc, x + 3, y, color);

  SetPixel(hdc, x, y + 1, color);
  SetPixel(hdc, x + 1, y + 1, color);
  SetPixel(hdc, x + 2, y + 1, color);
  SetPixel(hdc, x + 3, y + 1, color);

  SetPixel(hdc, x, y + 2, color);
  SetPixel(hdc, x + 1, y + 2, color);
  SetPixel(hdc, x + 2, y + 2, color);
  SetPixel(hdc, x + 3, y + 2, color);

  SetPixel(hdc, x, y + 3, color);
  SetPixel(hdc, x + 1, y + 3, color);
  SetPixel(hdc, x + 2, y + 3, color);
  SetPixel(hdc, x + 3, y + 3, color);
}


SetPixel を 16 回繰り返すことで、幅4ピクセル 高さ4ピクセルの矩形を描画する事ができました。こんな感じで、幅を 100 ピクセル、高さを 50 ピクセルなどに拡張するのは無理がありそうです。SetPixel を 100 * 50 で 5,000 行書く事になるわけで。

当然、そういった「繰り返し」の動作を記述する方法があります。いわゆる「forループ」「for文」と呼ばれるものですね。例えば、x = 20, y = 10 の位置から、横に(右に) 100 ピクセル描画して、横線を描いてみましょう。


void OnPaint(HDC hdc)
{
  COLORREF color = RGB(0, 0, 0);

  int x1 = 20;
  int x2 = x1 + 100;
  int y = 10;

  for (int x=x1; x<x2; x++)
  {
    SetPixel(hdc, x, y, color);
  }
}




横線が描画できました!

しかし、今までに出てきてない単語や構文が色々と出て来てしまいましたね。これは厳しい……でもこれ以上簡単には出来ないので、このソースコードが何を意味しているのか解説していきましょう。


  int x1 = 20;
  int x2 = x1 + 100;
  int y = 10;


ここは、今までに出てきたものなので大丈夫ですね。x1に、20を。x2には、x1に100を足した値 (120) を、yには10をセットしています。問題はこれです。


  for (int x=x1; x<x2; x++)
  {
    SetPixel(hdc, x, y, color);
  }
別の書き方もあります(説明は後ほど)。こう書いた方が分かりやすいかもしれません。


  int x;
  for (x=x1; x<x2; x++)
  {
    SetPixel(hdc, x, y, color);
  }
ちょっとスッキリしました。

「for文」「forループ」は、条件を満たしている間、「{」から「}」の間を何度も実行する(繰り返す)構文です。つまり、


  for (条件)
  {
    命令1;
    命令2;
    命令3;
    ......
    ....
    ..
  }
となります。


条件を満たしている間、


    命令1;
    命令2;
    命令3;
    ......
    ....
    ..
    命令1;
    命令2;
    命令3;
    ......
    ....
    ..
    命令1;
    命令2;
    命令3;
    ......
    ....
    ..
    命令1;
    命令2;
    命令3;
    ......
    ....
    ..
……と、{ から } の間を、何度も繰り返し実行します。

「条件」と書いてしまいましたが、for分では実際には、「変数の初期値」「条件」「変数の増加(減少)分」の3つの指定を行います。なので本当は、



for (変数の初期値; 条件; 変数の増加分) { 命令1; 命令2; 命令3; ...... .... .. }
となっています。先ほど見たコードは、



int x; for (x=x1; x<x2; x++) { SetPixel(hdc, x, y, color); }
でしたね。つまり、

・「x=x1」が変数の初期値
・「x<x2」が条件
・「x++」が変数の増加(減少)分

となります。

(次回へ続く)