View
220
Download
1
Embed Size (px)
Citation preview
Drawing Lines
The Bresenham Algorithm for drawing lines and filling polygons
Plotting a line-segment
• Bresenham published algorithm in 1965
• It was originally to be used with a plotter
• It adapts well to raster “scan conversion”
• It uses only integer arithmetic operations
• It is an “iterative” algorithm: each step is based on results from the previous step
• The sign of an “error term” governs the choice among two alternative actions
Scan conversion
The actual line is comprised of points drawn from a continuum,but it must be “approximated” using pixels from a discrete grid.
The various cases
• Horizontal or vertical lines are easy cases
• Lines that have slope 1 or -1 are easy, too
• Symmetries leave us one remaining case:0 < slope < 1
• As x-coodinate is incremented, there are just two possibilities for the y-coordinate:(1) y-coordinate is increased by one; or(2) y-coordinate remains unchanged
0 < slope < 1
y increases by 1 y does not change
X-axis
Y-axis
Integer endpoints
ΔX
ΔY
slope = ΔY/ΔX
(X0,Y0)
(X1,Y1)
ΔY = Y1 – Y0ΔX = X1 – X0
0 < ΔY < ΔX
Which point is closer?
A
B
xi -1 xi
y = mx + b
error(A) = (yi -1 + 1) – y* error(B) = y* - (yi -1)
ideal lineyi -1
yi -1+1
The Decision Variable
• Choose B if and only if error(B)<error(A)• Or equivalently: error(B) – error(A) < 0• Formula: error(B) – error(A) =
2m(xi – x0) + 2(y0 – yi -1) -1• Remember: m = Δy/Δx (slope of line)• Multiply through by Δx (to avoid fractions)• Let di = Δx( error(B) – error(A) )• Rule is: choose B if and only if di < 0
Computing di+1 from di
di+1 = 2(Δy)(xi+1 – x0) +2(Δx)(y0 – yi) – Δx
di = 2(Δy)(xi – x0) + 2(Δx)(y0 – yi-1) – Δx
The difference can be expressed as:
di+1 = di + 2(Δy)(xi+1 – xi) – 2(Δy)(yi – yi-1)
Recognize that xi+1 – xi = 1 at every step
And also: yi – yi-1 will be either 0 or 1
(depending on the sign of the previous d)
How does algorithm start?
• At the outset we start from point (x0,y0)
• Thus, at step i =1, our formula for di is: d1 = 2(Δy) - Δx
• And, at each step thereafter:
if ( d i < 0 ) { di+1 = di + 2(Δy); yi+1 = yi; }
else { di+1 = di + 2(Δy-Δx); yi+1 = yi + 1; }
xi+1 = xi + 1;
‘bresdemo.cpp’
• The example-program is on class website:
http://nexus.cs.usfca.edu/~cruse/cs686/
• It draws line-segments with various slopes
• The Michener algorithm (for a circle-fill) is also included, for comparative purposes
• Extreme slopes (close to zero or infinity) are not displayed in this demo program
• They can be added by you as an exercise
Filling a triangle or polygon
• The Bresenham’s method can be adapted
• But an efficient data-structure is needed
• All the sides need to be handled together
• We let the y-coordinate steadily increment
• For sides which are “nearly horizontal” the x-coordinates can change by more than 1
Triangle Illustration
Non-Convex Polygons
Bucket-Sort
012345678
101112
8 87 9
6 1011
1213
1415
16
57
911
1315
Y
XLO XHI
1317 17
Handling Corners
In-class exercises
• For the ‘bresdemo.cpp’ program:– Supply a function that tests the capability of
the Breshenham line-drawing algorithm to draw lines having the full range of slopes
• For the ‘fillpoly.cpp’ program:– Modify the program code so that it will work
with polygons having more than three sides