Computer-graphics-line-generation-algorithm

提供:Dev Guides
移動先:案内検索

ライン生成アルゴリズム

線は2点を接続します。 グラフィックの基本要素です。 線を引くには、線を引くことができる2つのポイントが必要です。 次の3つのアルゴリズムでは、ラインの1つのポイントを$ X _ \ {0}、Y _ \ {0} $、ラインの2番目のポイントを$ X _ \ {1}、Y _ \ {1} $と呼びます。

DDAアルゴリズム

Digital Differential Analyzer(DDA)アルゴリズムは、ここで手順を追って説明する単純なライン生成アルゴリズムです。

  • ステップ1 *-2つのエンドポイント$(X _ \ {0}、Y _ \ {0})$および$(X _ \ {1}、Y _ \ {1})$の入力を取得します。
  • ステップ2 *-2つの終点間の差を計算します。
dx = X1 - X0
dy = Y1 - Y0
  • ステップ3 *-ステップ2で計算された差に基づいて、ピクセルを配置するステップの数を識別する必要があります。 dx> dyの場合、x座標でさらにステップが必要です。それ以外の場合はy座標。
if (absolute(dx) > absolute(dy))
   Steps = absolute(dx);
else
   Steps = absolute(dy);
  • ステップ4 *-x座標とy座標の増分を計算します。
Xincrement = dx/(float) steps;
Yincrement = dy/(float) steps;
  • ステップ5 *-x座標とy座標を適切にインクリメントしてピクセルを配置し、線の描画を完了します。
for(int v=0; v < Steps; v++)
{
   x = x + Xincrement;
   y = y + Yincrement;
   putpixel(Round(x), Round(y));
}

ブレゼンハムのライン生成

Bresenhamアルゴリズムは、もう1つのインクリメンタルスキャン変換アルゴリズムです。 このアルゴリズムの大きな利点は、整数計算のみを使用することです。 単位間隔でx軸を移動し、各ステップで2つの異なるy座標から選択します。

たとえば、次の図に示すように、位置(2、3)から(3、3)と(3、4)のいずれかを選択する必要があります。 元のラインにより近いポイントが必要です。

ブレゼンハムのライン生成

サンプル位置$ X _ \ {k} + 1、$で、数学的な線からの垂直分離は、$ d _ \ {upper} $および$ d _ \ {lower} $としてラベル付けされます。

dupper and dlower

上記の図から、$ x _ \ {k} + 1 $の数学線上のy座標は-

Y = m($ X _ \ {k} $ + 1)+ b

したがって、$ d _ \ {upper} $および$ d _ \ {lower} $は次のように与えられます-

d _ \ {lower} = y-y _ \ {k}

= m(X _ \ {k} + 1)+ b-Y _ \ {k}

and

d _ \ {upper} =(y _ \ {k} + 1)-y

$ = Y _ \ {k} + 1-m(X _ \ {k} + 1)-b $

これらを使用して、数学的な線に近いピクセルを簡単に決定できます。 この単純な決定は、2つのピクセル位置の違いに基づいています。

d _ \ {lower}-d _ \ {upper} = 2m(x _ \ {k} + 1)-2y _ \ {k} + 2b-1

_m_を_dy/dx_に置き換えてみましょう。ここで、_dx_と_dy_はエンドポイント間の違いです。

dx(d _ \ {lower}-d _ \ {upper})= dx(2 \ frac \ {\ mathrm \ {d} y} \ {\ mathrm \ {d} x}(x _ \ {k} + 1 )-2y _ \ {k} + 2b-1)

= 2dy.x _ \ {k}-2dx.y _ \ {k} + 2dy + 2dx(2b-1)

= 2dy.x _ \ {k}-2dx.y _ \ {k} + C

したがって、線に沿ったkthステップの決定パラメータ$ P _ \ {k} $は次のように与えられます-

p _ \ {k} = dx(d _ \ {lower}-d _ \ {upper})

= 2dy.x _ \ {k}-2dx.y _ \ {k} + C

決定パラメータ$ P _ \ {k} $の符号は、$ d _ \ {lower}-d _ \ {upper} $の符号と同じです。

$ p _ \ {k} $が負の場合、下のピクセルを選択し、そうでない場合は上のピクセルを選択します。

座標の変化はx軸に沿って単位ステップで発生するため、整数計算ですべてを行うことができます。 ステップk + 1で、決定パラメーターは次のように与えられます-

p _ \ {k +1} = 2dy.x _ \ {k + 1}-2dx.y _ \ {k + 1} + C

これから$ p _ \ {k} $を引きます-

$$ p _ \ {k + 1}-p _ \ {k} = 2dy(x _ \ {k + 1}-x _ \ {k})-2dx(y _ \ {k + 1}-y _ \ {k})$ $

ただし、$ x _ \ {k + 1} $は$(xk)+ 1 $と同じです。 So −

p _ \ {k + 1} = p _ \ {k} + 2dy-2dx(y _ \ {k + 1}-y _ \ {k})

ここで、$ Y _ \ {k + 1} – Y _ \ {k} $は、$ P _ \ {k} $の符号に応じて0または1です。

最初の決定パラメータ$ p _ \ {0} $は$(x _ \ {0}、y _ \ {0})$で評価されます-

p _ \ {0} = 2dy-dx

ここで、上記のすべてのポイントと計算を念頭に置いて、勾配m <1-

  • ステップ1 *-行の2つの終点を入力し、左の終点を$(x _ \ {0}、y _ \ {0})$に保存します。
  • ステップ2 *-点$(x _ \ {0}、y _ \ {0})$をプロットします。
  • ステップ3 *-定数dx、dy、2dy、および(2dy – 2dx)を計算し、決定パラメーターの最初の値を取得します-

p _ \ {0} = 2dy-dx

  • ステップ4 *-k = 0から始まる、ラインに沿った各$ X _ \ {k} $で、次のテストを実行します-

$ p _ \ {k} $ <0の場合、プロットする次のポイントは$(x _ \ {k} +1、y _ \ {k})$です。

p _ \ {k + 1} = p _ \ {k} + 2dy それ以外の場合、

(x _ \ {k}、y _ \ {k} +1)

p _ \ {k + 1} = p _ \ {k} + 2dy-2dx

  • ステップ5 *-ステップ4(dx – 1)回繰り返します。

m> 1の場合、毎回yをインクリメントしながらxをインクリメントする必要があるかどうかを調べます。

解いた後、決定パラメータ$ P _ \ {k} $の方程式は非常に似たものになり、方程式のxとyだけが入れ替わります。

中間点アルゴリズム

中間点アルゴリズムは、PittewayとVan Akenによって変更されたBresenhamによるものです。 次の図に示すように、ポイントPを(x、y)座標に既に配置し、ラインの勾配が0≤k≤1であると仮定します。

次に、次のポイントをEとNのどちらに置くかを決定する必要があります。 これは、ポイントNまたはEに最も近い交点Qを識別することで選択できます。 交点Qが点Nに最も近い場合、Nは次の点と見なされます。それ以外の場合はE

中間点アルゴリズム

それを決定するには、まず中間点M(x + 1、y +½)を計算します。 EとNを結ぶ垂直線と線の交点QがM未満の場合、Eを次の点として使用します。それ以外の場合は、次のポイントとしてNを使用します。

これを確認するには、暗黙的な方程式を考慮する必要があります-

F(x、y)= mx + b-y

任意のXで正のmの場合、

  • yが線上にある場合、F(x、y)= 0
  • yが線の上にある場合、F(x、y)<0
  • yが線より下の場合、F(x、y)> 0

暗黙の方程式