アルゴリズム覚書 (直線描画 - LINE)

2013/05/17


◆ 直線描画について

グラフィック画面へ直線を描画する関数についてまとめておきます。 なお、ピクセル描画のルーチン (PSET) は別にあるものとします。

関数の引数は、座標原点と方向座標の各XYおよび色となり 5つのパラメータとなる。

関数内のループはXの差分とYの差分を比較し大きい方をループの要素とします。

増加率の算出に浮動小数点を使用すれば計算は簡単なのですが、速度的にデメリットとなるので浮動小数点演算は行わないようにします。

 

//
// alg-001-01 直線描画関数
//

void Line(byte x0, byte y0, byte x1, byte y1, byte col) {
  int xd = abs(x1 - x0);
  int yd = abs(y1 - y0);
  int xs = (x1 > x0) ? 1: -1;
  int ys = (y1 > y0) ? 1: -1;

  if (xd > yd) {
    int E = -xd;
    for (int i=0; i<xd; i++){
      PSET(x0, y0, col);
      x0 += xs;
      E += 2 * yd;
      if (E >= 0) {
        y0 += ys;
        E -= 2 * xd;
      }
    }
  } else {
    int E = -yd;
    for (int i=0; i<yd; i++){
      PSET(x0, y0, col);
      y0 += ys;
      E += 2 * xd;
      if (E >= 0) {
        x0 += xs;
        E -= 2 * yd;
      }
    }
  }
} 

矩形(四角)は4つの直線で表現します。


◆ 引数が範囲外を示す場合