コンテンツにスキップ

利用者:Mklab/デジタル微分解析器

コンピュータグラフィックスにおいて、 デジタル微分解析器 (DDA) は、始点と終点の間の間隔変数補間するために使用されるハードウェアまたはソフトウェアである。 DDAは線、三角形、多角形のラスタライズに使用され、 遠近法による正しいテクスチャマッピング二次曲線、および横断ボクセルなどの非線形関数に拡張することができる。

のような線形の場合の最も単純な実装では、DDAアルゴリズムは各x iについて式x i = x i-1 + 1、y i = y i-1 + m (mは線の傾き) を計算することによって区間内の値を補間する。この勾配はDDAで次のように表すことができる。

実際、この線分上にある2つの連続する点(x、y)は、式を満たす必要がある。

性能[編集]

DDA法は、 浮動小数点演算または整数演算を使用して実装できる。生の浮動小数点の実装は、補間された値(x、y座標、深度、色成分など)ごとに1回の加算と1回の丸め演算、および出力結果を必要とする。この処理は、高速の加算および丸め操作を行うFPUが使用可能になる場合にのみ効率的である。

固定小数点整数演算では、出力サイクルごとに2回の加算が必要となる。小数部がオーバーフローした場合は、1回の増分と減算が必要となる。小数部がオーバーフローする確率は、補間された開始値と終了値の比 m に比例する。

DDAはハードウェア実装に非常に適しており、最大限の情報量を得るためにパイプライン化することができる。

アルゴリズム[編集]

線形DDAは、他の単位増分に対してdyまたはdxの小さい方を計算から始まる。次に、1つの線が1つの座標において単位間隔でサンプリングされ、その線経路に最も近い対応する整数値が他の座標について決定される。

正の勾配を持つ線を考慮して、勾配が1以下の場合、単位x間隔(dx = 1)でサンプリングし、次のように連続するy値を計算する。

下付き文字kは、最初の点では0から始まる整数値を取り、終点に達するまで1ずつ増加します。画面のピクセルに対応するように、y値は最も近い整数に四捨五入されます。

勾配が1より大きい線の場合、xとyの役割を逆にします。つまり、dy = 1でサンプリングし、連続するx値を次のように計算します。

負の勾配を有する線に沿って画素位置を決定するために同様の計算が行われる。したがって、勾配の絶対値が1より小さい場合は、次のようにdx = 1を設定します。 構文解析に失敗 (構文エラー): {\displaystyle <mrow class="MJX-TeXAtom-ORD"><mstyle displaystyle="true" scriptlevel="0"><msub><mi> <math> x_{\rm start}<x_{\rm end}} </mi><mrow class="MJX-TeXAtom-ORD"><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi></mrow></mrow></msub><mo> </mo><msub><mi> </mi><mrow class="MJX-TeXAtom-ORD"><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi></mrow></mrow></msub></mstyle></mrow> </math> </img>すなわち、始点は左端です。

プログラム[編集]

Turbo C ++によるDDAアルゴリズムのプログラム

#include <graphics.h>

#include <iostream.h>
#include <math.h>
#include <dos.h>
#include <conio.h>

void main( )
{
  float x, y, x1, y1, x2, y2, dx, dy, step;
  int i, gd = DETECT, gm;
  initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");
  
  cout << "Enter the value of x1 and y1 : ";
  cin >> x1 >> y1;
  cout << "Enter the value of x2 and y2: ";
  cin >> x2 >> y2;
  
  dx = (x2 - x1);
  dy = (y2 - y1);
  if(abs(dx) >= abs(dy))
    step = abs(dx);
  else
    step = abs(dy);
  dx = dx / step;
  dy = dy / step;
  x = x1;
  y = y1;
  i = 1;
  while(i <= step) {
    putpixel(x, y, 5);
    x = x + dx;
    y = y + dy;
    i = i + 1;
    delay(100);
  }
  getch();
  closegraph();
}

関連項目[編集]

  • ブレゼンハムのアルゴリズム - 線レンダリングのためのアルゴリズム
  • 増分誤差アルゴリズム
  • Xiaolin Wuのラインアルゴリズム - 線アンチエイリアシングのためのアルゴリズム

参考文献[編集]

http://www.museth.org/Ken/Publications_files/Museth_SIG14.pdf


Alan Watt: 3D Computer Graphics, 3rd edition 2000, p. 184 (Rasterizing edges). ISBN 0-201-39855-9ISBN 0-201-39855-9 [[Category:コンピュータグラフィックス]]