17
Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

  • View
    220

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Drawing Lines

The Bresenham Algorithm for drawing lines and filling polygons

Page 2: 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

Page 3: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Scan conversion

The actual line is comprised of points drawn from a continuum,but it must be “approximated” using pixels from a discrete grid.

Page 4: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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

Page 5: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

0 < slope < 1

y increases by 1 y does not change

X-axis

Y-axis

Page 6: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Integer endpoints

ΔX

ΔY

slope = ΔY/ΔX

(X0,Y0)

(X1,Y1)

ΔY = Y1 – Y0ΔX = X1 – X0

0 < ΔY < ΔX

Page 7: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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

Page 8: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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

Page 9: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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)

Page 10: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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;

Page 11: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

‘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

Page 12: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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

Page 13: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Triangle Illustration

Page 14: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Non-Convex Polygons

Page 15: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Bucket-Sort

012345678

101112

8 87 9

6 1011

1213

1415

16

57

911

1315

Y

XLO XHI

1317 17

Page 16: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

Handling Corners

Page 17: Drawing Lines The Bresenham Algorithm for drawing lines and filling polygons

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