直線を描くためのアルゴリズムです。
特徴は”高速”。
このアルゴリズム、ネットで検索すると色々な派生や亜流が出回っています。
もう、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; } } } }