I'm the story I was telling
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

The Bresenham Line-Drawing Algorithm

Go down

The Bresenham Line-Drawing Algorithm Empty The Bresenham Line-Drawing Algorithm

Bài gửi by anbinhtrong Sun Dec 27, 2009 10:59 pm

Thuật toán này khá mới, cải tiến hơn so với thuật toán Bresenham đang dạy trong các trường đại học.
//Chi tiết bài viết
The basic Bresenham algorithm



Consider drawing a line on a raster grid where we restrict the
allowable slopes of the line to the range The Bresenham Line-Drawing Algorithm Slopelt1.
If we further restrict the line-drawing routine so that it always
increments x as it plots, it becomes clear that, having
plotted a point at (x,y), the routine has a severely limited
range of options as to where it may put the next point on the
line:

  • It may plot the point (x+1,y), or:
  • It may plot the point (x+1,y+1).


So, working in the first positive octant of the plane, line
drawing becomes a matter of deciding between two possibilities at each
step.
We can draw a diagram of the situation which the plotting program finds
itself in having plotted (x,y).
The Bresenham Line-Drawing Algorithm Bres1
In plotting (x,y) the line drawing routine will, in general,
be making a compromise between what it would like to draw and what the
resolution of the screen actually allows it to draw. Usually the
plotted point (x,y) will be in error, the actual, mathematical
point on the line will not be addressable on the pixel grid. So we
associate an error, The Bresenham Line-Drawing Algorithm Eps, with
each y ordinate,
the real value of y should be The Bresenham Line-Drawing Algorithm Y_eps.
This
error will range from -0.5 to just under +0.5.
In moving from x to x+1 we increase the value of the
true (mathematical) y-ordinate by an amount equal to the slope of the
line, m. We will choose to plot (x+1,y) if the
difference between this new value and y is less than 0.5.
The Bresenham Line-Drawing Algorithm Yemlty5
Otherwise we will plot (x+1,y+1). It should be clear that by
so doing we minimise the total error between the mathematical line
segment and what actually gets drawn on the display.
The error resulting from this new point can now be written back into
The Bresenham Line-Drawing Algorithm Eps,
this will allow us to repeat the whole process for
the next point along the line, at x+2.
The new value of error can adopt one of two possible values, depending
on what new point is plotted. If (x+1,y) is chosen, the new
value of error is given by:

The Bresenham Line-Drawing Algorithm Epsnew1
Otherwise it is:

The Bresenham Line-Drawing Algorithm Epsnew2
This gives an algorithm for a DDA which avoids rounding operations,
instead using the error variable The Bresenham Line-Drawing Algorithm Eps to
control plotting:

The Bresenham Line-Drawing Algorithm Pseudo1
This still employs floating point values. Consider, however, what
happens if we multiply across both sides of the plotting test by
The Bresenham Line-Drawing Algorithm Dx
and then by 2:

The Bresenham Line-Drawing Algorithm Derive1
All quantities in this inequality are now integral.
Substitute The Bresenham Line-Drawing Algorithm Epsprime
for The Bresenham Line-Drawing Algorithm Epsdx.
The test
becomes:

The Bresenham Line-Drawing Algorithm Test1
This gives an integer-only test for deciding which point to
plot.
The update rules for the error on each step may also be cast into The Bresenham Line-Drawing Algorithm Epsprime
form. Consider the floating-point versions of the
update rules:

The Bresenham Line-Drawing Algorithm Update1
Multiplying through by The Bresenham Line-Drawing Algorithm Dx
yields:

The Bresenham Line-Drawing Algorithm Update2
which is in The Bresenham Line-Drawing Algorithm Epsprime
form.
The Bresenham Line-Drawing Algorithm Update3
Using this new ``error'' value, The Bresenham Line-Drawing Algorithm Epsprime,
with the new test and
update equations gives Bresenham's integer-only line drawing algorithm:
The Bresenham Line-Drawing Algorithm Pseudo2

  • Integer only - hence efficient (fast).
  • Multiplication by 2 can be implemented by left-shift.
  • This version limited to slopes in the first octant, The Bresenham Line-Drawing Algorithm Slopelt1.

Here is a C++ implementation of the Bresenham algorithm for line
segments in the first octant.
void linev6(Screen &s,
unsigned x1, unsigned y1,
unsigned x2, unsigned y2,
unsigned char colour )
{
int dx = x2 - x1,
dy = y2 - y1,
y = y1,
eps = 0;

for ( int x = x1; x <= x2; x++ ) {
s.Plot(x,y,colour);
eps += dy;
if ( (eps << 1) >= dx ) {
y++; eps -= dx;
}
}
}


This is an all-integer function, employs left shift for multiplication
and eliminates redundant operations by tricky use of the
eps variable.
This implementation of Bresenham's algorithm is incomplete, it does not
check the validity of its arguments. A real implementation should do
this.

In fact, a real implementation of Bresenham's algorithm should do more
than simply reject lines with slopes lying outside the first octant,
it should handle lines of arbitrary slope.
Handling multiple slopes



If we try out the C++ implementation of the Bresenham algorithm, we
find it has some peculiar properties.
As expected, it fails to plot lines with negative slopes (try it and
see what happens). It also fails to plot lines of positive slope
greater than 1 (this is an interesting case, try it also and see if you
can explain what is happening).
More unusually, we find that the order in which the endpoints are
supplied
to this routine is significant, it will only work as long as x1
is smaller than x2.
In fact, if we have two line segments with the same endpoints, and the
same slope, this routine may draw one of them successfully but fails to
draw the other one.
The Bresenham Line-Drawing Algorithm Lsdlfp
Of course, this is not surprising really, when we consider that the
function works by incrementing x. It does
emphasise, however, that the routine is plotting vectors,
direction is significant. Considering all the vectors from
(x1,y1) to (x2,y2) we find that there are eight
regions, (the ``octants'') and the basic Bresenham algorithm works in
only one of them.
The Bresenham Line-Drawing Algorithm Octants
A full implementation of the Bresenham algorithm must, of course, be
able
to handle all combinations of slope and endpoint order.
Some of the regions in the plane, those for which x2 is
smaller than x1 can be handled by exchanging the endpoints of
the
line segment.
It is also clear that we will need a piece of code to handle large
slopes by stepping over y instead of x values.
However, careful consideration of the diagram will reveal that there is
one case which cannot be reduced to a version of the algorithm we have
already looked at. If we want to draw a line having a small
negative slope, we will have to consider a modification of the
basic Bresenham algorithm to do this. (The same point applies to lines
of
large negative slope as well, but the code for small negative
slopes may be adapted to this case by stepping over y instead
of x).

Bresenham for negative slopes



The Bresenham Line-Drawing Algorithm Bres2
Consider a line with negative slope between 0 and 1 (i.e., small
negative slope. Given that a line-drawing algorithm has plotted a point
at (x,y), its choice about where to plot the next point is
between (x+1,y-1) and (x+1,y).
As usual there will be an error, The Bresenham Line-Drawing Algorithm Eps,
associated with
y. Choice of the next point to plot will be based on an
attempt to minimise error, so plot (x+1,y) if:
The Bresenham Line-Drawing Algorithm Yyemlt5
Otherwise plot (x+1,y-1). Notice that the error generated by
the above is negative. A little manipulation gives a decision
inequality:

The Bresenham Line-Drawing Algorithm Emgt5
It is worth comparing this with the decision inequality for the case of
positive slope.
The error update rules are also subtly different for this case of
negative slope.
If plotting (x+1,y) the new value of error is given
by:
The Bresenham Line-Drawing Algorithm Epsnew3
Otherwise, plotting (x+1,y-1) gives new error:
The Bresenham Line-Drawing Algorithm Epsnew4
A pseudocode algorithm for this routine may be written as:

The Bresenham Line-Drawing Algorithm Pseudo3
This is cast in terms of floating-point values.. It is, however, a
trivial matter to convert the algorithm into an integer-only form.


Colin Flanagan / flanaganc@ul.ie
anbinhtrong
anbinhtrong
Admin
Admin

Tổng số bài gửi : 216
Join date : 05/11/2009
Age : 35
Đến từ : BT

https://ngoctho.forum-viet.net

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết