このアルゴリズムはラインのスキャン変換に使用されます。ブレゼンハムによって開発されました。これは、整数の加算、減算、乗算の演算のみを必要とするため、効率的な方法です。これらの操作は非常に迅速に実行できるため、ラインを迅速に生成できます。
この方法では、次に選択されるピクセルは、真のラインからの距離が最も小さいピクセルです。
この方法は次のように機能します。
バイナリからbcdへ
ピクセル P を仮定します。1'(バツ1'、そして1')、その後、夜まで全力で作業しながら、P に向かって水平方向に一度に 1 ピクセル位置ずつ後続のピクセルを選択します。2'(バツ2'、そして2')。
ピクセルが入力されたら、いつでも選択できます
次のピクセルは
- その右側 (ラインの下限) のいずれか
- 1 つはその右上と上 (線の上限)
この線は、P 間のパスからの距離が最も短いピクセルによって最もよく近似されます。1'、P2'。
下のピクセル S と上のピクセル T の間で次のものを選択します。
Sを選んだ場合
×がありますi+1=x私+1 と yi+1=y私
Tを選択した場合
×がありますi+1=x私+1 と yi+1=y私+1
x = x におけるラインの実際の y 座標i+1は
y=MXi+1+b
S から実際の線までの y 方向の距離
s = y-y私
T から実際のラインまでの y 方向の距離
t = (y私+1)-y
次に、これら 2 つの距離値の差を考えてみましょう。
s - t
いつ (s-t)<0 ⟹ s < t< p>
最も近いピクセルは S です
(s-t) ≧0 ⟹ sの場合 最も近いピクセルは T です この違いは、 m を次のように置き換えます そして決定変数の導入 ここで c= 2△y+△x (2b-1) 決定変数 d を書くことができます。i+1次のスリッポンに向けて x_(i+1)=x なので私+1、私たちは持っています 特殊なケース 選択されたピクセルが最上位ピクセル T にある場合 (つまり、d私≧0)⟹とi+1=y私+1 選択されたピクセルが一番下のピクセル T にある場合 (つまり、d私<0)⟹ yi+1=y私 最後に、dを計算します。1 MX以来1+b-y私=0 および m = 、 我々は持っています 1. 整数演算だけなので簡単です。 2. 重複ポイントの生成を回避します。 3. 乗算や除算を使わないため、ハードウェアで実現可能です。 4. DDA アルゴリズムのような浮動小数点演算を含まないため、DDA (デジタル ディファレンシャル アナライザ) と比較して高速です。 1. このアルゴリズムは基本的な線の描画のみを目的としています。初期化はブレゼンハムの線アルゴリズムの一部ではありません。したがって、滑らかな線を描くには、別のアルゴリズムを検討する必要があります。 ステップ1: アルゴリズムの開始 ステップ2: 変数xを宣言する1、バツ2、そして1、そして2、d、i1、私2、dx、dy ステップ3: xの値を入力してください1、そして1、バツ2、そして2 ステップ4: dx = x を計算します。2-バツ1 ステップ5: (x, y) を開始点として考慮し、x終わりx の可能な最大値として。 ステップ6: (x,y) 座標に点を生成します。 ステップ7: 行全体が生成されているかどうかを確認します。 ステップ8: 次のピクセルの座標を計算します ステップ9: インクリメント x = x + 1 ステップ10: 最新の(x,y)座標の点を描画します ステップ11: ステップ7に進みます ステップ12: アルゴリズムの終わり 例: 線の開始位置と終了位置は (1, 1) と (8, 5) です。中間点を見つけます。 解決: バツ1=1 出力:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
d私=△x(s-t)
d私=△×(2 (バツ私+1)+2b-2y私-1)
=2△xy私-2△y-1△x.2b-2y私△×-△×
d私=2△y.x私-2△x.y私+cJavaのobjとは何ですか
di+1=2△y.xi+1-2△x.yi+1+c
di+1-d私=2△y.(xi+1-バツ私)-2△x(yi+1-そして私)
di+1+d私=2△y.(x私+1-x私)-2△x(yi+1-そして私)
di+1=d私+2△y-2△x
di+1=d私+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xアドバンテージ:
不利益:
ブレゼンハムの直線アルゴリズム:
Linuxのコマンドタッチ
ここでx1、そして1開始点の座標です
そして×2、そして2は終点の座標です
dy = y を計算する2-そして1
iを計算する1=2*あなた
iを計算する2=2*(dy-dx)
d=iを計算する1-dx
DXなら<0
すると x = x2
y = y2
バツ終わり=x1
dx > 0の場合
すると x = x1
y = y1
バツ終わり=x20>
x > = x の場合終わり
停止。
もしd<0
すると、d = d + i1
d≧0の場合
すると、d = d + i2
インクリメントy = y + 10>
そして1=1
バツ2=8
そして2=5
dx=x2-バツ1=8-1=7
あなた=y2-そして1=5-1=4
私1=2* Δy=2*4=8
私2=2*(Δy-Δx)=2*(4-7)=-6
d = 私1-Δx=8-7=1Javaのソート文字列
バツ そして d=d+I1または私2 1 1 d+I2=1+(-6)=-5 2 2 d+I1=-5+8=3 3 2 d+I2=3+(-6)=-3 4 3 d+I1=-3+8=5 5 3 d+I2=5+(-6)=-1 6 4 d+I1=-1+8=7 7 4 d+I2=7+(-6)=1 8 5 Bresenham の線描画アルゴリズムを実装するプログラム:
#include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
DDA アルゴリズムとブレゼンハムのライン アルゴリズムを区別します。
DDA アルゴリズム ブレゼンハムの直線アルゴリズム 1. DDA アルゴリズムは浮動小数点、つまり実数演算を使用します。 1. ブレゼンハムのライン アルゴリズムは固定小数点、つまり整数演算を使用します。 2. DDA アルゴリズムは乗算と除算を演算に使用します 2.ブレゼンハムの直線アルゴリズムは減算と加算のみを使用します。 3. DDA アルゴリズムは実数演算 (浮動小数点演算) を使用するため、線描画ではブレゼンハムの線アルゴリズムよりも遅くなります。 3. Bresenham のアルゴリズムは、計算に加算と減算のみが含まれ、整数演算のみを使用するため、インラインの DDA アルゴリズムよりも高速です。 4. DDA アルゴリズムは、ブレゼンハムのライン アルゴリズムほど正確でも効率的でもありません。 4. Bresenham のライン アルゴリズムは、DDA アルゴリズムよりも正確かつ効率的です。 5.DDA アルゴリズムは円と曲線を描くことができますが、ブレゼンハムの直線アルゴリズムほど正確ではありません 5. Bresenham の Line アルゴリズムは、DDA アルゴリズムよりも正確に円と曲線を描くことができます。