Chapter 4
Bresenham’s Midpoint Line Algoritm

0 < slop = dy dx < 1

   o---------o---------o---------o---------o---------o-------- o-------- o
   |         |         |         |         |         |         |         |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - -
   |         |         |         |         |         |         |         |
   o---------o---------o---------o---------o---------o-------- o---------o
   |         |         |         |         |         |        --------   |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|---------|- - - - -|- - -
   |         |         |         |         |  --------         |         |
    --------- --------- --------- ---------------------------- ---------
   o         o         o      ---o-----    o         o         o         o
   |         |        ---------  |         |         |         |         |
- -|- - - - -|---------|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - -
   |  ---------        |         |         |         |         |         |
   o---------o---------o---------o---------o---------o-------- o-------- o
   |         |         |         |         |         |         |         |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - -
   |         |         |         |         |         |         |         |
   o---------o---------o---------o---------o---------o-------- o-------- o

 
 real variable: D
 dx := x2 - x1
 dy := y2 - y1
 D := -0.5
 x := x1
 Y := y1
 FOR i := x1 TO x2 DO
   PaintPixel(x,Y)
   x := x + 1
   D := D + dy / dx
   IF  D>0  THEN
     Y := Y + 1
     D := D - 1
   END
 END

remove division and floating point arithmetics

 
 dx := x2 - x1
 dy := y2 - y1
 D := -dx               * (2 * dx)
 x := x1
 Y := y1
 FOR i := x1 TO x2 DO
   PaintPixel(x,Y)
   x := x + 1
   D := D + 2 * dy      * (2 * dx)
   IF  D>0  THEN
     Y := Y + 1
     D := D - 2 * dx    * (2 * dx)
   END
 END

Change of form in conditional

 
 dx := x2 - x1
 dy := y2 - y1
 D := -dx               * (2 * dx)
 x := x1
 Y := y1
 FOR i := x1 TO x2 DO
   PaintPixel(x,Y)
   x := x + 1
   D := D + 2 * dy      * (2 * dx)
   IF  D<=0  THEN
   ELSE
     Y := Y + 1
     D := D - 2 * dx    * (2 * dx)
   END
 END

Move ‘D := D + 2 * dy’ into conditional and componsate outside the loop for the delay in incrementing D.

 
 dx := x2 - x1
 dy := y2 - y1
 D := 2 * dy - dx
 x := x1
 Y := y1
 FOR i := x1 TO x2 DO
   PaintPixel(x,Y)
   x := x + 1
   IF  D<=0 THEN
     D := D + 2 * dy
   ELSE
     Y := Y + 1
     D := D - 2 * dx + 2 * dy
   END
 END

Unroll to save one iteration

 
 dx := x2 - x1
 dy := y2 - y1
 D := 2 * dy - dx
 x := x1
 Y := y1
 PaintPixel(x,Y)
 FOR i := x1+1 TO x2 DO
   x := x + 1
   IF  D<=0 THEN
     D := D + 2 * dy
   ELSE
     Y := Y + 1
     D := D - 2 * dx + 2 * dy
   END
   PaintPixel(x,Y)
 END

Constant folding

 
 dx := x2 - x1
 dy := y2 - y1
 d1 := 2 * dy
 d2 := 2 * (dy - dx)
 D :=  d1 - dx
 x := x1
 Y := y1
 PaintPixel(x,Y)
 FOR i := x1+1 TO x2 DO
   x := x + 1
   IF  D<=0 THEN
     D := D + d1
   ELSE
     Y := Y + 1
     D := D + d2
   END
   PaintPixel(x,Y)
 END

index variable

 
 dx := x2 - x1
 dy := y2 - y1
 d1 := 2 * dy
 d2 := 2 * (dy - dx)
 D :=  d1 - dx
 x := x1
 Y := y1
 PaintPixel(x,Y)
 WHILE x < x2 DO
   x := x + 1
   IF  D<=0 THEN
     D := D + d1
   ELSE
     Y := Y + 1
     D := D + d2
   END
   PaintPixel(x,Y)
 END

4.1 Generalization to other octans

                  |
                  |
     --   ||||||||||||||||   --
      ----|       |      ||---
      ------      |     ------
     --    ---3   | 2 ---    --
    --       ---  | ---       --
-----------4-----------1-----------
    -          ------          -
    --     5 ---  | ---8      --
     --   ----6   | 7  ---   --
      -----       |      -----
      ---|||      |     |||---
     --    ||||||||||||||    --
                  |

1 none
2 switch roles of x & y
3
4
5 draw from p2 to p1
6
7
8