4

DDA アルゴリズムに関するヘルプが必要です。DDA Algo でオンラインで見つけたチュートリアルに混乱しています。そのチュートリアルへのリンクは次のとおりです。

http://i.thiyagaraaj.com/tutorials/computer-graphics/basic-drawing-techniques/1-dda-line-algorithm

例:

xa,ya=>(2,2)
xb,yb=>(8,10)
dx=6
dy=8

xincrement=6/8=0.75
yincrement=8/8=1

1)     for(k=0;k<8;k++)
xincrement=0.75+0.75=1.50
yincrement=1+1=2
1=>(2,2)

2)     for(k=1;k<8;k++)
xincrement=1.50+0.75=2.25
yincrement=2+1=3
2=>(3,3)

今、私はそれを尋ねたいと思います、それが理論的に書かれているとき、この行はどのようにして xincrement=0.75+0.75=1.50 になったのですか?

「傾きが 1 より大きい場合、単位 y における x の任意の y の役割は、Dy=1 の間隔で、連続する y の値をそれぞれ計算します。Dy=1

m= Dy / Dx
m= 1/ (  x2-x1 )
m = 1 / ( xk+1 – xk  )

xk+1   =  xk   +  ( 1 / m )

"

そのはず xincrement=x1 (which is 2) + 0.75 = 2.75

または、私はそれを間違って理解しています。誰かがそれがどのように行われたか教えてもらえますか?

どうもありがとう)

4

2 に答える 2

3

ピクセルの位置は整数値です。理想直線方程式は実数です。そのため、線描画アルゴリズムは線方程式の実数を整数値に変換します。線を描画するための難しくて遅い方法は、ピクセルの配列の各 x 値で線の方程式を評価することです。デジタル差動アナライザは、さまざまな方法でそのプロセスを最適化します。

第 1 に、DDA は、ラインの開始点である少なくとも 1 つのピクセルが既知であるという事実を利用します。そのピクセルから、DDA はラインの終点に到達するまで、ラインの次のピクセルを計算します。

第 2 に、DDA は、x 軸または y 軸のいずれかに沿って、線の次のピクセルが常に線の終わりに向かって次の整数値になるという事実を利用します。DDA は、傾きを評価することでどの軸かを判断します。0 から 1 の間の正の勾配は、x 値を 1 ずつ増やします。1 より大きい正の勾配は、y 値を 1 ずつ増やします。-1 から 0 の間の負の勾配は、x 値を -1 ずつ増やし、負の勾配は -1 未満です。 y の値を -1 ずつ増やします。

第三に、DDA は、一方の方向の変化が 1 の場合、他方の方向の変化は勾配の関数であるという事実を利用します。現在、一般論で説明することははるかに困難になっています。したがって、0 と 1 の間の正の勾配のみを考えます。この場合、プロットする次のピクセルを見つけるために、x を 1 増やし、y の変化を計算します。y の変化を計算する 1 つの方法は、前の y に勾配を加算し、整数値に丸めることです。y 値を実数として維持しない限り、これは機能しません。勾配が 1 より大きい場合は、y を 1 だけ増やし、x の変化を計算できます。

第 4 に、一部の DDA は、浮動小数点計算を回避することでアルゴリズムをさらに最適化します。たとえば、Bresenham のライン アルゴリズムは、整数演算を使用するように最適化された DDA です。

この例では、(2, 2) から (8, 10) への直線で、傾きは 8/6 で、1 より大きくなっています。最初のピクセルは (2, 2) にあります。次のピクセルは、y 値を 1 ずつ増やし、x の変化 (dx/dy = 6/8 = .75 の逆勾配) を x に加算することによって計算されます。x の値は 2.75 になり、3 に丸められ、(3, 3) がプロットされます。3 番目のピクセルは y を再びインクリメントし、x の変化を x に追加します (2.75 + .75 = 3.5)。丸めにより、3 番目のピクセルが (4, 4) にプロットされます。y は 1 ずつ増加しますが、x は .75 ずつ増加し、4.25 に等しいため、4 番目のピクセルは (5, 4) をプロットします。

この例から、コードの問題がわかりますか?

于 2009-11-11T15:06:28.210 に答える
2

ここには少し混乱があるようです。

まず、0 <= 勾配 <= 1 と仮定します。この場合、X 方向に一度に 1 ピクセルずつ進みます。X ステップごとに、現在の Y 値があります。次に、「理想的な」Y 値が現在の Y 値に近いか、それとも次に大きい Y 値に近いかを判断します。大きな Y 値に近い場合は、現在の Y 値を増やします。少し言い方を変えると、現在の Y 値を使用した場合の誤差が 0.5 ピクセルより大きいかどうかを判断し、そうである場合は Y 値をインクリメントします。

勾配 > 1 の場合、(質問で述べたように) X と Y の役割を交換します。つまり、Y 方向に一度に 1 ピクセルずつ進め、各ステップで現在の X 値をインクリメントする必要があるかどうかを決定します。 .

負の勾配は、増加する代わりに減少することを除いて、ほとんど同じように機能します。

于 2009-11-03T16:16:19.383 に答える