Computer Graphics Filling. Filling Polygons So we can figure out how to draw lines and circles How...

35
Computer Graphics Filling

description

3 Polygon Ordered set of vertices (points) –Usually counter-clockwise Two consecutive vertices define an edge Left side of edge is inside Right side is outside Last vertex implicitly connected to first In 3D vertices are co-planar

Transcript of Computer Graphics Filling. Filling Polygons So we can figure out how to draw lines and circles How...

Computer Graphics

Filling

Filling Polygons

• So we can figure out how to draw lines and circles

• How do we go about drawing polygons?• We use an incremental algorithm known

as the scan-line algorithm

3

Polygon

• Ordered set of vertices (points)– Usually counter-clockwise

• Two consecutive vertices define an edge• Left side of edge is inside• Right side is outside• Last vertex implicitly connected to first• In 3D vertices are co-planar

Filling Polygons

• Three types of polygons

1. Simple convex 2. simple concave 3. non-simple (self-intersection)

Convex polygons have the property that intersecting lines crossing it either one (crossing a corner), two (crossing an edge, going through the polygon and going out the other edge), or an infinite number of times (if the intersecting line lies on an edge).

Some Problems

1. Which pixels should be filled in? 2. Which happened to the top pixels? To the rightmost pixels?

Scan-Line Polygon ExamplePolygonVertices

Maxima /Minima

EdgePixels

Scan Line Fill

Scan Line AlgorithmsCreate a list of vertex events (bucket sorted by y)

Scan-Line Polygon Fill Algorithm

2

4

6

8

10 Scan Line

0 2 4 6 8 10 12 14 16

Scan-Line Polygon Fill Algorithm

• The basic scan-line algorithm is as follows:– Find the intersections of the scan line with

all edges of the polygon– Sort the intersections by increasing x

coordinate– Fill in all pixels between pairs of

intersections that lie interior to the polygon

10

Scanline Algorithms

• given vertices, fill in the pixelsarbitrary polygonsarbitrary polygons(non-simple, non-convex)(non-simple, non-convex)

• build edge table• for each scanline

• obtain list of intersections, i.e., AEL• use parity test to determine in/out and fill in the pixels

trianglestriangles

• split into two regions• fill in between edges

Scan-Line Polygon Fill Algorithm (cont…)

Examples:

Solutions:

Scan Line AlgorithmsCreate a list of the edges intersecting the first scanline

Sort this list by the edge’s x value on the first scanlineCall this the active edge list

Polygon Fill

B C

A

F

D

E

Parity0 = even1 = odd

Parity 010

Polygon Fill 2

B C

A

F

D

E

Parity0 = even1 = odd

Parity 01010

Edge Tables• edge table (ET)

– store edges sorted by y in linked list• at ymin, store ymax, xmin, slope

• active edge table (AET)– active: currently used for computation– store active edges sorted by x

• update each scanline, store ET values + current_x– for each scanline (from bottom to top)

• do EAT bookkeeping• traverse EAT (from leftmost x to rightmost x)

– draw pixels if parity odd

Scanline Rasterization Special Handling

• Intersection is an edge end point, say: (p0, p1, p2) ??• (p0,p1,p1,p2), so we can still fill pairwise• In fact, if we compute the intersection of the scanline with

edge e1 and e2 separately, we will get the intersection point p1 twice. Keep both of the p1.

Scanline Rasterization Special Handling

• But what about this case: still (p0,p1,p1,p2)

Edge Table

Active Edge Table (AET)• A list of edges active for current scanline,

sorted in increasing x

y = 9

y = 8

Edge Table Bookkeeping

• setup: sorting in y– bucket sort, one bucket per pixel– add: simple check of ET[current_y] – delete edges if edge.ymax > current_y

• main loop: sorting in x– for polygons that do not self-intersect, order of

edges does not change between two scanlines – so insertion sort while adding new edges suffices

Parity (Odd-Even) Rule

Begin from a point outside the polygon, increasing the x value, counting the number of edges crossed so far, a pixel is inside the polygon if the number of edges crossed so far (parity) is odd, and outside if the number of edges crossed so far (parity) is even. This is known as the parity, or the odd-even, rule. It works for any kind of polygons.

Parity starting from even

oddodd

oddodd

even

even

even

Polygon Scan-conversion Algorithm

Construct the Edge Table (ET); Active Edge Table (AET) = null;for y = Ymin to Ymax

Merge-sort ET[y] into AET by x valueFill between pairs of x in AETfor each edge in AET

if edge.ymax = yremove edge from AET

elseedge.x = edge.x + dx/dy

sort AET by x valueend scan_fill

Rasterization Special Cases

-Edge Shortening Trick:-Recall Odd-Parity Rule Problem:

-Implement “Count Once” case with edge shortening:

Count onceCount twice

oror

Count onceCount twice

oror

A

B

C

A

B

C

A

B

C

B'

A

B

C

B'

C

B

A

B

C

B

A

B'B

B'

xA,yB’,1/mAB xC,yB’,1/mCB

For each scanline:1. Maintain active edge list (using vertex events)

2. Increment edge’s x-intercepts, sort by x-intercepts

3. Output spans between left and right edges

Scan Line Algorithms

delete insert replace

Penetrating Polygons

S

I

T

a

2

BG

b

c

3

de

1

False edges and new polygons!

Compare z value & intersection when AET is calculated

Flood Fill

• 4-fill– Neighbor pixels are only up, down, left, or

right from the current pixel• 8-fill

– Neighbor pixels are up, down, left, right, or diagonal

4 vs 8 connected

Define: 4-connected versus 8-connected,its about the neighbors

4 vs 8 connected

Fill Result: 4-connected versus 8-connected

“seed pixel”

Flood Fill

• Algorithm:1.Draw all edges into some buffer2.Choose some “seed” position inside the area

to be filled3.As long as you can

1.“Flood out” from seed or colored pixels» 4-Fill, 8-Fill

Flood Fill Algorithm

void boundaryFill4(int x, int y, int fill, int boundary){int curr;curr = getPixel(x, y);if ((current != boundary) && (current != fill)) {

setColor(fill);setPixel(x, y);boundaryFill4(x+1, y, fill, boundary);boundaryFill4(x-1, y, fill, boundary);boundaryFill4(x, y+1, fill, boundary);boundaryFill4(x, y-1, fill, boundary);

}}

Seed Position

Fill “Color”

Edge “Color”

Example

Let’s apply the rules to scan line 8 below. We fill in the pixels from point a, pixel (2, 8), to the first pixel to the left of point b, pixel (4, 8), and from the first pixel to the right of point c, pixel (9, 8), to one pixel to the left of point d, pixel (12, 8). For scan line 3, vertex A counts once because it is the ymin vertex of edge FA, but the ymax vertex of edge AB; this causes odd parity, so we draw the span from there to one pixel to the left of the intersection with edge CB.

oddoddeven evena b c d

A

B

C

D

E

F

Four Elaborations (cont.)

A B

C D

E

FG

HI

J

E

A B

C D

FG

HI

J

Halftoning

For 1-bit (B&W) displays, fill patterns with different fill densities can be used to vary the range of intensities of a polygon. The result is a tradeoff of resolution (addressability) for a greater range of intensities and is called halftoning. The pattern in this case should be designed to avoid being noticed.

These fill patterns are chosen to minimize banding.