ブレゼンハムのアルゴリズム

ブレゼンハム デモ

直線を描くためのアルゴリズムです。
特徴は”高速”

このアルゴリズム、ネットで検索すると色々な派生や亜流が出回っています。
もう、20年来、そのようなコーディングを眺め続けていましたが、先ごろ、やっとしっくりくるコーディングをネット上で”発見”しました。
それに、いくらか手を加えて、より納得がいく形にブラッシュアップしました。

【パラメータ説明】
※C++言語になります。

DWORD* pBits;
… 32bitカラー(XRGB形式)のビットマップ(サーフェイス)。
int w;
… ビットマップの幅。但し、DWORD(1ピクセル)単位。
(BYTE単位のいわゆる”pitch”ではない事に注意)

int x1,x2;
… 画面右向きに増えていくスクリーンX座標。
x1は開始座標、x2は終了座標。
int y1,y2;
… 画面下向きに増えていくスクリーンY座標。
y1は開始座標、y2は終了座標。

DWORD color;
… 32bitカラー(XRGB形式)のピクセルの色。

【ブレゼンハムのアルゴリズムで直線を描画する関数】

void line(DWORD* pBits, int w,
        int x1, int y1, int x2, int y2, DWORD color) {
    int dx = abs(x2 - x1);
    int dy = abs(y2 - y1);
    if (dx == 0 && dy == 0) {
        return;
    }
    int sx = (x1 < x2) ? 1 : -1;
    int sy = (y1 < y2) ? 1 : -1;
    sy *= w;
    DWORD* p = &pBits[y1 * w + x1];
    int dx2 = dx * 2;
    int dy2 = dy * 2;

    if (dy <= dx) {
        int E = -dx;
        for (int i = 0; i <= dx; i++) {
            *p = color;
            p += sx;
            E += dy2;
            if (0 <= E) {
                p += sy;
                E -= dx2;
            }
        }
    } else {
        int E = -dy;
        for (int i = 0; i <= dy; i++) {
            *p = color;
            p += sy;
            E += dx2;
            if (0 <= E) {
                p += sx;
                E -= dy2;
            }
        }
    }
}