Different Types of Polygons - Simple Convex - Simple Concave - Non-Simple: Self-Intersecting - With Holes
Different Types of Polygons - Simple Convex - Simple Concave - Non-Simple: Self-Intersecting - With Holes
• Simple Convex
• Simple Concave
• Non-simple : self-intersecting
• With holes
odd-even fill
Winding Number
• Count clockwise crossings as positive and
counterclockwise crossings as negative
winding number = 1
winding number = 2
C4 C2
scan line
C5
span
C3
Scan Line Polygon Fill
• Determine overlap Intervals for scan lines that cross that area.
– Requires determining intersection positions of the edges of the
polygon with the scan lines
– Fill colors are applied to each section of the scanline that lies
within the interior of the region.
– Interior regions determined as in odd-even test
10 13 16 19
Interior pixels along a scan line passing through a
polygon area
10 13 16 19
Scan Line y
1 2 1 1
• Let (y1, y2) and (y2, y3) be the endpoint y values of two
consecutive edges. If y1, y2, y3 monotonically increase
or decrease, we need to count the middle vertex as a
single intersection point for any scan line passing
through that vertex.
Scan Line Polygon Fill
• One method for implementing the adjustment
to the vertex intersection count is to shorten
some polygon edges to split those vertices that
should be counted as one intersection
(a) (b)
(Xk , Yk )
Scan Line yk
• The slope of the edge is constant from one scan line to the next:
– let m denote the slope of the edge.
yk 1 yk 1
1
xk 1 xk
m
• Each successive x is computed by adding the inverse of the slope and
rounding to the nearest integer
Integer operations
• Recall that slope is the ratio of two integers:
y
m
x
• So, incremental calculation of x can be expressed as
y
xk 1 xk
x
Integer operations
• How to compute x intercepts incrementally using
integer operations:
– Initialize a counter to 0
– Increment counter byx each time we move up to a
new scan line.
– If counter becomes greater or equal to y, increment
the current x intersection value by 1 and decrease the
counter by y
• Example: m=7/3
yk
xk
decrement 0
4
decrement 1
5
decrement2
6
3
0 y0
counter
x0
• Above scheme truncates integers.
• How do we round to nearest integer?
– We need to compare the counter to y/2.
– Can be done by integer arithmetic by incrementing counter by
2x at each step and comparing with y
– When the counetr is greater than or equal to y, increase x
value by 1 and decrement the counter by 2y
• Example: m=7/3
6
0 y0
counter
x0
Sorted Edge Table (SET)
In SET, there is an entry for each scanline.
Traverse edges of the polygon to construct a Sorted Edge Table (SET)
1. Eliminate horizontal edges
2. Add edge to linked-list for the scan line corresponding to the y_lower
vertex. Shorten edges if necessary to resolve the vertex-intersection
problem.
3. For each edge entry, store the following:
- y_upper: the largest y value on that edge (last scanline to
consider)
- x_lower: the x intercept at that scanline (initial x value)
- 1/m: for incrementing x
4. For each scan line the edges are sorted from left to right (based on x)
B
yC yB xC 1 / mBC
C yA y E x A 1 / mAE y B x A 1 / mAB
E
C’
A
Active Edge List (AEL)
• Construct Active Edge List during scan conversion. AEL
is a linked list of active edges on the current scanline, y.
The active edges are kept sorted by x
– The active edge list contains all the edges crossed by that scan
line.
– As we move up, update the active edge list using the sorted
edge table if necessary.
Algorithm
1. Set y to the smallest y coordinate that has an entry in the SET; i.e, y for
the first nonempty bucket.
2. Initialize the AEL to be empty.
3. For each scanline y repeat:
3.1 Copy from SET bucket y to the AEL those edges whose y_min = y
(entering edges).
3.2 The sort the AEL on x is easier because SET is presorted.
3.3 Fill in desired pixel values on scanline y by using pairs of x
coordinates from AEL.
3.5 Remove from the AEL those entries for which y = y_max (edges not
involved in the next scanline.)
• Algorithm:
Initialize all elements of buffer COLOR(row, col) to
background color, and DEPTH(row, col) to
maximum-depth;
FOR EACH polygon:
Rasterize polygon to frame;
FOR EACH pixel center (x, y) that is covered:
IF polygon depth at (x, y) < DEPTH(x, y)
THEN COLOR(x, y) = polygon color at (x, y)
AND DEPTH(x, y) = polygon depth at (x, y)
Depth Buffer Operation
Frame Depth
24
26 27
28 29 30
24
26 27
28 29 30
10 9
24 9 8
26 8 7
28 7 6
10 9
24 9 8
26 8 7
28 7 6
10 9 72
24 9 8 75
26 8 7 71 not
stored
28 7 6
10 9 72
24 9 8 75
26 8 7
28 7 6
scan-line