Computer-graphics-line-generation-algorithm
ライン生成アルゴリズム
線は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} $としてラベル付けされます。
上記の図から、$ 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