Content deleted Content added
→Program: The DDA algorithm requires rounding the floating point x,y to the nearest integer. The sample code should not depend on the behavior of some specific graphics library's putpixel() (for example if it takes int parameters, float->int uses truncation and will produce the wrong answer) |
|||
(90 intermediate revisions by 60 users not shown) | |||
Line 1:
{{short description|Hardware or software used for interpolation of variables over an interval}}
{{About|a graphics algorithm|the digital implementation of a
In [[computer graphics]], a '''
In its simplest implementation for linear cases such as [[Line (geometry)|line]]s, the DDA algorithm interpolates values in interval by computing for each x<sub>i</sub> the equations x<sub>i</sub> = x<sub>i−1</sub> + 1, y<sub>i</sub> = y<sub>i−1</sub> + m, where m is the [[slope]] of the line. This slope can be expressed in DDA as follows:
== Performance ==▼
The DDA method can be implemented using [[floating-point]] or [[integer]] arithmetic. The native floating-point implementation requires one addition and one rounding operation per interpolated value (e.g. coordinate x, y, depth, color component etc.) and output result. This process is only efficient when an [[Floating-point unit|FPU]] with fast add and rounding operation is available.▼
▲== Performance ==
▲The DDA method can be implemented using [[floating-point]] or [[integer]] arithmetic. The native floating-point implementation requires one addition and one rounding operation per interpolated value (e.g. coordinate x, y, depth, color component etc.) and output result. This process is only efficient when an [[Floating-point unit|FPU]] with fast add and rounding operation
The [[Fixed-point arithmetic|fixed-point]] integer operation requires two additions per output cycle, and in case of fractional part overflow, one additional increment and subtraction. The probability of fractional part overflows is proportional to the ratio m of the interpolated start/end values.
DDAs are well suited for hardware implementation and can be pipelined for maximized throughput.
▲: <math>m = \frac{y_{end} -y_{start}}{x_{end}-x_{start}}</math>
▲in fact any two consecutive point(x,y) lying on this line segment should satisfy the equation.
== Algorithm ==
Considering a line with
: <math>y_{k+1} = y_k + m</math>
: <math>x_{k+1} = x_k + 1</math>
Subscript k takes integer values starting from 0, for the 1st point and increases by 1 until endpoint is reached.
y value is rounded off to nearest integer to correspond to a screen pixel.
Line 26 ⟶ 29:
For lines with slope greater than 1, we reverse the role of x and y i.e. we sample at dy=1 and calculate consecutive x values as
: <math>x_{k+1} = x_k + \frac{1}{m}</math>
: <math>y_{k+1} = y_k + 1</math>
Similar calculations are carried out to determine pixel positions along a line with negative slope. Thus, if the absolute value of the slope is less than 1, we set dx=1 if <math> x_{\rm start}<x_{\rm end}</math> i.e. the starting extreme point is at the left.
== Program ==
DDA algorithm program in [[C++]]:
<syntaxhighlight lang="cpp" line="1">
#include <graphics.h>
#include <iostream.h>
#include <math.h>
#include <dos.h>
#include <conio.h>
void main()
{
float x,
float y,
float x1, y1,
float 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 = 0;
while (i <= step) {
putpixel(round(x), round(y), 5);
x = x + dx;
y = y + dy;
i = i + 1;
delay(100);
}
getch();
closegraph();
}
</syntaxhighlight>
== See also ==
* [[Bresenham's line algorithm]] is an algorithm for line rendering.
* [[Incremental error algorithm]]
* [[Xiaolin Wu's line algorithm]] is an algorithm for line anti-aliasing
== References ==
http://www.museth.org/Ken/Publications_files/Museth_SIG14.pdf
{{no footnotes|date=June 2011}}
<references/>
* Alan Watt: ''3D Computer Graphics'', 3rd edition 2000, p. 184 (Rasterizing edges). {{ISBN
[[Category:Computer graphics algorithms]]
[[Category:Digital geometry]]
[[Category:Articles with example C++ code]]
|