ブレゼンハムのアルゴリズムを使って線を描く

最終更新 2003 09/30

サンプルのダウンロード → API_DrawLine2.lzh(38k)

サンプルプログラムのスクリーンショット

全ソースコード

線を引くアルゴリズムでよく使われるのはブレゼンハムのアルゴリズムです。
足し算と引き算しか使わないので処理速度が速く、ゲームでもよく使われます。
このアルゴリズムを応用すると、ある点からある点へキャラクターを直線移動
させたり(ライン移動)、円を描画したり、弧を描きながら目標を追跡する
ミサイルの飛行軌道などに使えます。
3Dでもよく使われるみたいですね。
考えたのは名前のとおりブレゼンハムという人です。

ブレゼンハムのアルゴリズムを使って線を引くサンプルを以下に示します。

short startX, startY; //線を引く最初の点
short endX, endY;     //線を引く目標の点
short addX, addY;     //X、Yの値を毎回どれだけ増やすか
short distX, distY;   //startX-endX と startY-endY の距離
short count;          //カウンタ

distX = endX - startX; //目標の点から視点までのX方向の距離を求める
distY = endY - startY; //同じくY方向

//X、Yそれぞれ移動する方向を求める
if( distX < 0 ){ distX *= -1; addX = -1; }
else{ addX = 1; }

if( distY < 0 ){ distY *= -1; addY = -1; }
else{ addY = 1; }

count = 0;
if( distX > distY )
{
    //X距離の方が大きい
    for( i=0; i<=distX; i++ )
    {
        //startX,startYの位置に点を打つ処理をここに書く
        startX += addX;  //ひとつ先の点へ移動
        count += distY;
        if( count >= distX )
        {
            //countの値がdistX以上になったらY方向をひとつ移動させる
            count -= distX;
            startY += addY;
        }
    }
}
else
{
    //Y距離の方が大きい
    for( i=0; i<=distY; i++ )
    {
        //startX,startYの位置に点を打つ処理をここに書く
        startY += addY;  //ひとつ先の点へ移動
        count += distX;
        if( count >= distY )
        {
            //countの値がdistY以上になったらX方向をひとつ移動させる
            count -= distY;
            startX += addX;
        }
    }
}
distX と distY の大きさで処理を振り分けているのは、直線を引く時は 2つのケースを考える必要があるのと、高速化のためです。 いろいろな種類の線を描いてみて、X方向の長さとY方向の長さで比べると 分かるのですが、X(水平)方向の方が長い線と、Y(垂直)方向の方が 長い線の2種類あります。 どっちが長いかで点を打っていく方向が変わるので、distX と distY の 大きさで処理を振り分けます。 変数をうまく使えば処理を振り分けないでも線を引くことはできますが 条件分岐やそのための計算が増えるので処理速度が遅くなります。 あとの細かい所はサンプルを見ながらよく考えてみて下さい。 言葉で説明してもピンとこないと思うので・・・。

| back | home |