Chapter 5
Scan Converting Circles

5.1 Brute Force

Second octan, going rightward

 
 x := 0
 REPEAT
   y := sqrt( R*R - x*x )
   CirclPixels( x , round(y) )
   x := x+1
 UNTIL x>y  

DEFICIENCIES

   o---------o-------- o-------- o-------- o-------- o--------o---------o
   |         |         |         |         |         |        |         |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - --|- - - - -|- - -
   |         |         |         |         |         |        |         |
   o---------o-------- o-------- o-------- o-------- o--------o---------o
   |         |  -------------    |         |         |        |         |        Y
- -|- - - - -|- - - - -|- - --------- - - -|- - - - -|- - - --|- - - - -|- - -
   |         |         |         |  -------|         |        |         |
    ------------------ --------- ------------------- --------- ---------
   o         o         o         o         o    -----o        o         o
   |         |         |         |         |        -----     |         |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- ------|- - - - -|- - -
   |         |         |         |         |         |      ----        |
   o---------o-------- o-------- o-------- o-------- o--------o---------o
   |         |         |         |         |         |        |   --||  |
- -|- - - - -|- - - - -|- - - - -|- - - - -|- - - - -|- - - --|- - - -|-|- - -
   |         |         |         |         |         |        |         |||
   o---------o-------- o-------- o-------- o-------- o--------o---------o |||

5.2 Midpoint Circle Algorithm

90o--> 45o

              x                 x+1

           Y  |o------------------o------------------o
              |                   |                  |
    ----------•|-----------       |                  |
           ---||          ------------------------------D(x+1,Y- 12)
D(x,Y-12)----  |-                 -----------         |
              |                   |   --    -------  |
              |                   |  --           ------
              |                   |  -               | -----
         Y -1 |o------------------o------------------o      -----
              |                   |--                |          ----
              |                   |-                 |
              |                   --                 |
              |                  ------------        |
              |                   |         ----------
              |                   |                  ----D(x+1,Y-32)
              |                   |                  |
               o------------------o------------------o

‘Y := Y - 1’ when D changes sign

 o-------- o-------- o--------|o--------o---------o---------o---------o
 |         |         |        |         |         |         |         |
 |         |         |        |         |         |         |         |
 |         |         |        |         |         |         |         |
 o---------o-------- o--------|o--------o---------o---------o---------o
 |         |  ------------    |         |         |         |         |        Y
 |         |        --    ---------     -         |         |         |
 |         |         |        |   -------         |         |         |
 |--------|---------|--------||--------|---------- --------- ---------
 o        |o       | o      |||o      | o--  -----o         o         o
 |        ||       | |      | |      |  --        -----     |         |
 |        ||      |  |     |  |     |   -         -   ---- --         |
 |       | |      |  |     |  |    |   ||       |||       ----        |
 o-------| o-----||- o----|---|o--||--|-o------|--o---------o---------o
 |       | |     |   |   |    |  || ||  |    ||   |    -    |-----||  |
 |       | |    |    |  ||    | || ||   |   ||    |  --     --     ||||
 |       | |    |    |  |     |||  |    |  ||     |--     - |         |||
 o------|- o----|--- o-|------|o--|-----o-||------o---------o---------o |||
 |      |      |       |     ||  |       ||     --    --
 |      |      |      |      |  |       |      --   --
        |     |      |      | ||      ||     ---   -
 |     |      |     |      | ||      |      --   -
 |     |     ||     |     |  |     ||      --  ---
 |     |     |     |     |  |     |       -   --
       |    |     ||    || |     |      -   --
 |    |     |    ||    || |     ||    --  - -
 |    |     |    |    ||||     |     -  ---
 |    |    |     |   |||      |    -   --
 |    |   ||    |   ||||    ||   --   --
      |   |    |   |  |    |    -   --
 |   |    |   |   || |   ||   --   -
 |   |   ||  |    |||   |   --   -
 |   |   |   |   |||   |   --  --
    |   |   |   ||   ||  --- --
 |  |   |  ||  |||   |  --  -
 |  |   |  |  | |   |  -- -
 |  |  |  |   ||  ||  - --
    | || || |||  |  ----
 | || |  | ||| || ----
 | | || | ||  |  - -
 | | | | ||||| ---
 | | |||| |||----
   || | ||||---
 || ||||||---
 ||||||||--
 ||||| --
  ||||--
 |||--
 ||--
 ---
--

          1              1        1
    D(x,Y- 2) = x* x+ (Y - 2)* (Y- 2)- R *R
                                   1       1
  D(x+1,Y- 12) = (x+ 1)* (x + 1)+ (Y - 2)*(Y - 2)
              - R *R
                                   3       3
D(x+1,y- 12-1) = (x+ 1)* (x + 1)+ (Y - 2)*(Y - 2)
              - R *R

D(x+1,Y - 1 2 )-D(x,Y - 1 2 ):

(x + 1)2+(Y - 0.5)2-R2 - x2 +(Y - 0.5)2-R2 2x + 1 D(x+1,Y - 3 2 )-D(x+1,Y - 1 2 ):

(x + 1)2+(Y - 1 - 0.5)2-R2 - (x + 1)2+(Y - 0.5)2-R2 2(1 - Y )

 
 x:=0  Y:=R
 Delta = (R-0.5) * (R-0.5) - R*R
 PaintPixels(x,Y)
 REPEAT
   Delta :=  Delta +
             (D(x+1,Y - 1 2 )-D(x,Y - 1 2 ))
   IF Delta>0 THEN
     Delta := Delta +
              (D(x+1,Y - 3 2 )-D(x+1,Y - 1 2 ))
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

 
 x:=0
 Y:=R
 Delta := (R-0.5) * (R-0.5) - R*R
 PaintPixels(x,Y)
 REPEAT
   Delta :=  Delta + 2 * x + 1
   IF Delta>0 THEN
     Delta := Delta + 2 * (1 - Y)
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  
_________________________________________________________________________________________

 
 x:=0
 Y:=R
 Delta := 0.5*0.5 - R
 PaintPixels(x,Y)
 Delta :=  Delta + 2 * x + 1
 REPEAT
   IF Delta <= 0 THEN
     Delta := Delta + 2 * x + 1
   ELSE
     Delta := Delta + 2 * (x - Y) + 3
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

 
 x:=0
 Y:=R
 Delta := 1.25 - R
 PaintPixels(x,Y)
 REPEAT
   IF Delta <= 0 THEN
     Delta := Delta + 2 * x + 1
   ELSE
     Delta := Delta + 2 * (x - Y) + 3
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  
_________________________________________________________________________________________

 
 x:=0
 Y:=R
 Delta := 1 - R
 PaintPixels(x,Y)
 REPEAT
   IF Delta <= -0.25 THEN
     Delta := Delta + 2 * x + 1
   ELSE
     Delta := Delta + 2 * (x - Y) + 3
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

 
  Delta deals only with integer values
 x:=0
 Y:=R
 Delta := 1 - R
 PaintPixels(x,Y)
 REPEAT
   IF Delta < 0 THEN
     Delta := Delta + 2 * x + 1
   ELSE
     Delta := Delta + 2 * (x - Y) + 3
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

 
 x:=0
 Y:=R
 Delta := 1 - R
 PaintPixels(x,Y)
 REPEAT
   IF Delta <= 0 THEN
     Delta := Delta + 2 * x + 1
   ELSE
     Delta := Delta + 2 * x + 1
                + 2 * (1-Y)
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

 
 x:=0
 Y:=R
 Delta := 1 - R
 d1 := 1
 d2 := 3 - 2 * R
 PaintPixels(x,Y)
 REPEAT
   IF Delta <= 0 THEN
     Delta := Delta + d1
     d1 := d1 + 2
     d2 := d2 + 2
   ELSE
     Delta := Delta + d2
     d1 := d1 + 2
     d2 := d2 + 4
     Y := Y-1
   END
   x := x+1
   PaintPixels(x,Y)
 UNTIL x>Y  

WHY ‘d2 + 4’ and not ‘d2 + 6’

5.3 Eight-Way Symmetry

    (- x,y)  -----|---- (x,y)
      |||•||    |   -•||||
   --||         |        |||-
  --            |        ------
---             |      ---    --
•(-y,x)               |    ---       •- (y,x)
|               |  ---          -|
|               ---              |
|               -                |
|                               ||
•                              •|
(-y,-x)-                            --- (y,- x)
 --                          --
   -||                     |--
     |||||             |||||
         •|---------|•||
   (-x,- y)            (x,-y)

 
 PROCEDURE CirclePixels(x,y);
 BEGIN
   PaintPixel(x,y)
   PaintPixel(y,x)
   PaintPixel(y,-x)
   PaintPixel(x,-y)
   PaintPixel(-x,-y)
   PaintPixel(-y,-x)
   PaintPixel(-y,x)
   PaintPixel(-x,y)
 END

5.4 Scanline Fill (Polygons)

|---|---|---|--|---|---|---|---|
|   |   |   |  |   |   |   |   |
|-------|---|--|---|-------|---|
|-------|---|--|---|-------|---|
|   |  --   |  |   | --|-  |   |
|-----------|------|-------|---|
|   -------------- |------ |   |
|---|---|---|--|-------|---|---|
|--------------------------|---|
|   |   |   |  |   |   |  -|   |
|------------------------------|
|   ---------------|-------|   |
|---|---|---|--|---|---|---|---|
|---|--------------|-------|---|
|   |   |   |  |   |   |   |   |
-------------------------------

For each scanline Y

INTERSECTION POINTS

--|---|
-|||  |
ooo|o|--|
|||||-|
ooo |o| |          intersection         points
•ooooo-|-o||
| |  ||          o  --    1
•ooo-|-o||          •  --    2
--|----
o |  o-
ooo-|o--|
----  |
oo•oo----

 
 Y := maximum ymax  in ET
 AET := empty
 REPEAT
   AET := AET + 'marked' edges
                in ET[Y]
   AET := AET - 'marked' edges
              in AET with N<=1
   Y := Y - 1
   AET := 'marked' edges of AET
          adjusted one scan line down
   sort AET along x
        coordinates
   fill spans
 UNTIL AET is empty   

 ----|---|--|---|---|---|
 |-- |   |  |   |  ||   |
o|o--|---|--|---|-o|o|--|
 |-------|------|-|-||--|
o|   o---|----  |o| |o| |
o|---|--oo---|o--o|--|o|-|
 |   |   |  |  -||  | |||
o|---|---|--|--oo|---|-o||
 |---|---|--|-------|--|-
o--  |   |  |  ---  |  o-
 |o--|---|--|o--|o--|o--|
 | --|   |  |-- |  ---  |
 ---o------o-------oo----

COHERENCE -- Local similarity (used to speed up algorithms)

Within the scanline fill algorithm

Edge Representation

            |---------|----------
            |x########|#########|
y      ---|||--max-------N-------
 max        |###################|
             -------dx-----------

EDGE TABLE (ET): sorted by y

||------     |-----|------     |-----|------     |-----|------
||#####|     |#####|#####|     |#####|#####|     |#####|#####|
70--6-------||--0-----4-------||--5-----5-------||--5-----6----
0------|     |-0.66------|     |--0.25-----|     |--0.2------|
|
6|------     |-----|------
||#####|     |#####|#####|
53--2-------||--3-----3----
-1-----|     |--0.5------|
|
4
|
3
||------     |-----|------     |-----|------     |-----|------
0|-3-------||--4---|-3-------||--4---|-3-------||--6---|-3----
2######|     |###########|     |###########|     |###########|
0.5-----|     |---0.5-----|     |--0.5------|     |---0.5-----|
1
||------
1|-0----
0######|
?------|

AET[Y] + ET[Y] ==> AET[Y-1]

| |------|------|  |------|------|
| |######|######|  |######|######|
050.6636:|4.75-----4-----|||5.2------5---|
00.66 |---0.25------|  |----0.2------|
| |------|------|  |------|------|
| |######|######|  |######|######|
041.3325:|-4.5-----3-----|||5.4------4---|
00.66 |##-0.25######|  |####0.2######|
| |------|------|  |------|------|   |------|------|  |------|------|
| |######|######|  |######|######|   |######|######|  |######|######|
0321|--2------1-----|||3.5------2---|-||4.25-----2-----|||5.6------3---|
00.664: |####-#1######|  |####0.5######|   |##-0.25######|  |####0.2######|
- --------------   --------------    --------------   --------------
| |------|------|  |------|------|
0231|--4----|-1-----|||5.8---|--2---|
3: |#############|  |#############|
00.5 |---0.25------|  |----0.2------|
|
0161
2:
00.2
| |------|------|  |------|------|
0.523.52|-4.5---|-2-----|||5.5---|--2---|
1:-|#############|  -#############|
0.5-0.5 |---0.5-------|  |----0.5------|
| |------|------|  |------|------|
1131 |#5####|#1####||||##5###|##1###|
0:|--------------- ||-------------|
0.5-0.5 |---0.5-------|  |----0.5------|

7  ---|--|-|--|--|--|
   -- |  | |  | ||  |
6 o|o-|--|-|--|oo||-|
   | --  | |  | ||| |
5 o|--o--|----|o|o|-|
   |  |----|- || ||||
4 o|--|-oo--|o-o|-|o||
   |  |  | | -|| | ||
   |--|--|-|--|--|-||
3 o|  |  | | oo|  |o||
   |--|--|-|-----|---
2 o-- |  | | --- | o-
   |--|--|-|--|--|--|
1  o--|  | |o-|o-|o |
   |----------|-----|
0    o    o     oo
  0  1  2 3  4  5  6 |--|----   |---|----|   |---|----   |---|----|
0--|-6---||--0-|-4---|||-5--|-5---||--5-|-6--|
7######|   |########|   |#######|   |########|
|-0----|   |--0.66---|   |--0.25--|   |--0.2---|
6--|----   |---|----|
3--|-2---||--3-|-3--|
5#-1###|   |##0.5###|
|------|   |--------|
4
3--|----   |---|----|   |---|----   |---|----|
|##|###|   |###|####|   |###|###|   |###|####|
20----3---||--4---3---|||-4----3---||--6---3--|
|#0.5###|   |##-0.5###|   |##0.5###|   |##-0.5###|
1--|----   ---------    ---------   ---------
1##|#0#|
0-------
|--?---|

AET -- ACTIVE EDGE TABLE

oooo-o-o-o-o o o o-o-o-o-o-o-o-o-o o|o o-o
oooo-o-o-o-o|o|o o|oo|o|o|o|o-o-o-o-o-o o-o
ooooooooooooo|oooo|ooo|ooo|ooo oo oo o o-oo-oo-oo-oo|ooo|ooo|ooo|oooo|oooo|oooo o o-oo
ooooo|o-o-o-o o o o-o-o-o-o-o-o-o-o|o|o oo-o

5.5 Seed Fill (Flood Fill)

 
 choose pixel within the region
 paint the pixel
 push the pixel onto a stack
 REPEAT
   pop a pixel X from stack
   find the nonpainted pixels
                 adjacent to X
   paint the adjacent pixels
   push adjacents pixels onto the stack
 UNTIL stack is empty

############|#################|-----
############|#################|    |
#|-----|----|-----|-----############
#|     |    |     |     ############
#|     |    |     |     ############
#|-----|----|-----######|-----######
#|     |    |     ######|     ######
|######|----|-----|-----|-----######
|######|    |     |     |     ######
|######|    |     |  o.   |     ######
|######|----|-----######|-----######
|######|    |     ######|     ######
|###########|#######################
|###########|#######################
|###########|#######################
------------------------------------

#|--|
####|-------------|
####|         |1--|
|###|       ------|
|###|--------------------------------##################|--
1###||---            ---   |         ###|--|--|--|--######
####||3 |              --- |         ###|--|--|--###|--###
####||  |               ---|         ###|  |  |  ###|  ###
---- -2-----------------2--|         |--###|--|--|--|--###
   ----||                ||          |--###|--|3-#1#2--###
|--------------|        | ||         |--##################
#|     | ||    |       ||  |         |--##################
6|     |  ||   |      ||   ||
4|   ---|  ||  |      |     |
5|   |5 |   ||-|  |------------------------#################|--|
5312|   |  |   |  |  ||   |     |   |         ###|-|--|--|--######|
46|   |4 |   4  |  |15  |   --||-||         ##11-|9-1213##|--###|
#|   |  |   |  |  ||   |   |    ||         |-10#|8-|4-|--14-###|
2-----2-----2---  -14-------14---          |  ##|5 |3 |1 |2 ###|
|      |                                   |--##|--|--###|--###|
|-|    |                                   |--###7##6####15####|
#||    |           #################|--|   |--#################|
7||  |---------------------------------|
54||  |8 ||         ###| |  |  |  ######|
5312||  |  ||         ###|-|--|--###|--###|
476||  |4 ||         |--##|8-|4-|--|--###|
#||  |  ||         |--##|5-|3-#1#|2-###|
2-|  |2|||         ------7--6----------|
---  -----         |  #################|
|  |||  ||         |--#################|
#------------|
190   |    || |
1084    |    -|||
#9   |    9 ||
5312    |    | ||
764   |    4 ||
#    |    | ||
-2--------2--|
  |        |
|----|     |
#    |     |            #################|--|
11191   |  |---------------#################|  |
1084    |  ||   ||         ###|--|--|-|--######|
53129   |  |12  ||         ###11-9-12-###|--###|
#    |  ||   ||         |--10#8--4-|--|--###|
764   |  ||4  ||         |--###5--3-#1#|2-###|
#2   |  ||2  ||         |  ###7  6 ###|  ###|
-----   ------          |--#################|
|          |            |--#################|
#-------------|
1191213       |13  ||
#       ||   ||
1084       ||4  ||
5312       ||   ||
76       |-2---|
#       ------
-

5.6 Scanline Seed Fill

             |----------||||||||||||||||||||||||
             |-||       |||-|--|-|-|--|-|-|-||||
             -1--       |||-|--||||||||-|-|-||||
           ||||||       |||||--|-|||--|-|-|-||||
         ||| | |||      |-|||--|-|-|--|-|||-||||
        ||  || ||||     |-|||1-|1|1|1-1-|||-||||
|-----------------------||||||||||||||||||||||||
|   |||    ||   ||  ||  |----------------------
|   |5|   -||    |   || |
|   |4|   |4|   -||   |||
442222   |3|   |3|   |3|   -||
11111   -2-----2-----2-----2-
5533          |           |
-          |           |
           |           |
||||----------         |
||||      |-||         |
||||      |6||       ------------|||||||||||||||||||||||
66|||      |3||       |--|        |||-|-|--|-|-|--|-|-|||
442222|||      -2-|       --9|        |||7|7|7||7|7|7-7-|7|||
11111|||       |           |         |||6|6|--|||-|8-8-|8|||
5533|||       |           |         |-|||4|4-|-|2|2-2||2|||
----       |           |         |-|||1|1-|1|1|1-|||9|||
||||----------         |         |||||5|5||||3|3||||||||
||||      |-||         |         -----------------------
77777777|||      |7||       ------------||||||||||||||||||||||||
66|||      |3||       |--||       |||--|-|-|--|-|-|-|--|||
442222|||      -2-|       -10-|       |||7-|7|7|7|7||7|7|7-|||
11111|||       |                     |||6||6|-||||-|8|8|8-|||
5533|||       |                     |-||||4|4|--2-|2|2|2-|||
----       |                     |-||||1|1|1|1-|1|||9-|||
||||       |                     ||||||5|5|||3||3|||10|||
||||------|--|                   ------------------------
77777777|||      |8||
66888|||      |3||
442222|||      -2-|
11111|||
5533|||
----

CASES TO CONSIDER