Last Time

27
10/22/02 (c) 2002 University of Wiscon sin, CS559 Last Time Drawing lines Inside/Outside tests for polygons

description

Last Time. Drawing lines Inside/Outside tests for polygons. Today. Drawing Polygons. What is inside - 1?. Easy for simple polygons - no self intersections or holes OpenGL requires these. Undefined for other cases OpenGL also requires convex polygons - PowerPoint PPT Presentation

Transcript of Last Time

10/22/02 (c) 2002 University of Wisconsin, CS559

Last Time

• Drawing lines

• Inside/Outside tests for polygons

10/22/02 (c) 2002 University of Wisconsin, CS559

Today

• Drawing Polygons

10/22/02 (c) 2002 University of Wisconsin, CS559

What is inside - 1?

• Easy for simple polygons - no self intersections or holes– OpenGL requires these. Undefined for other cases

– OpenGL also requires convex polygons

• For general polygons, three rules are possible:– Non-exterior rule: A point is inside if every ray to infinity intersects

the polygon

– Non-zero winding number rule: Draw a ray to infinity that does not hit a vertex, if the number of edges crossing in one direction is not equal to the number crossing the other way, the point is inside

– Parity rule: Draw a ray to infinity and count the number or edges that cross it. If even, the point is outside, if odd, it’s inside

10/22/02 (c) 2002 University of Wisconsin, CS559

Polygon

ParityNon-zero Winding No.

Non-exterior

Inside/Outside Rules

10/22/02 (c) 2002 University of Wisconsin, CS559

What is inside - 2?

• Assume sampling with an array of spikes

• If spike is inside, pixel is inside

10/22/02 (c) 2002 University of Wisconsin, CS559

What is inside - 2?

• Assume sampling with an array of spikes

• If spike is inside, pixel is inside

10/22/02 (c) 2002 University of Wisconsin, CS559

Ambiguous Case

• Ambiguous cases: What if a pixel lies on an edge?– Problem because if two polygons share a common edge, we don’t

want pixels on the edge to belong to both

– Ambiguity would lead to different results if the drawing order were different

• Rule: if (x+, y+) is in, (x,y) is in

• What if a pixel is on a vertex? Does our rule still work?

10/22/02 (c) 2002 University of Wisconsin, CS559

Ambiguous Case 1

• Rule:– On edge? If (x+, y+) is in,

pixel is in

– Which pixels are colored?

10/22/02 (c) 2002 University of Wisconsin, CS559

Ambiguous Case 1

• Rule:– Keep left and bottom edges

– Assuming y increases in the up direction

– If rectangles meet at an edge, how often is the edge pixel drawn?

10/22/02 (c) 2002 University of Wisconsin, CS559

Ambiguous Case 2

10/22/02 (c) 2002 University of Wisconsin, CS559

Ambiguous Case 2

?

?

?

?

or

10/22/02 (c) 2002 University of Wisconsin, CS559

Really Ambiguous

• We will accept ambiguity in such cases– The center pixel may end

up colored by one of two polygons in this case

– Which two?

1

2

34

5

6

10/22/02 (c) 2002 University of Wisconsin, CS559

Exploiting Coherence

• When filling a polygon– Several contiguous pixels along a row tend to be in the polygon - a

span of pixels• Scanline coherence

– Consider whole spans, not individual pixels

– The pixels required don’t vary much from one span to the next• Edge coherence

– Incrementally update the span endpoints

10/22/02 (c) 2002 University of Wisconsin, CS559

Sweep Fill Algorithms

• Algorithmic issues:– Reduce to filling many spans

– Which edges define the span of pixels to fill?

– How do you update these edges when moving from span to span?

– What happens when you cross a vertex?

10/22/02 (c) 2002 University of Wisconsin, CS559

Spans

• Process - fill the bottom horizontal span of pixels; move up and keep filling

• Have xmin, xmax for each span

• Define:– floor(x): largest integer < x

– ceiling(x): smallest integer >=x

• Fill from ceiling(xmin) up to floor(xmax)

• Consistent with convention

10/22/02 (c) 2002 University of Wisconsin, CS559

Algorithm

• For each row in the polygon:– Throw away irrelevant edges

– Obtain newly relevant edges

– Fill span

– Update current edges

• Issues:– How do we update existing edges?

– When is an edge relevant/irrelevant?

• All can be resolved by referring to our convention about what polygon pixel belongs to

10/22/02 (c) 2002 University of Wisconsin, CS559

Updating Edges

• Each edge is a line of the form:

• Next row is:

• So, each current edge can have it’s x position updated by adding a constant stored with the edge

• Other values may also be updated, such as depth or color information

cmyxcmxy or

mxcmyx ii )1(1

10/22/02 (c) 2002 University of Wisconsin, CS559

When are Edges Relevant (1)

• Use figures and convention to determine when edge is irrelevant– For y<ymin and y>=ymax of edge

• Similarly, edge is relevant when y>=ymin and y<ymax of edge

• What about horizontal edges?– m’ is infinite

10/22/02 (c) 2002 University of Wisconsin, CS559

When are Edges Relevant (2)

1

2

3

43,4

1,3

1,2

Convex polygon:Always only two edges active

10/22/02 (c) 2002 University of Wisconsin, CS559

When are Edges Relevant (3)

1,3

Horizontal edges?

1

2

3

44?

2?

10/22/02 (c) 2002 University of Wisconsin, CS559

Sweep Fill Details

• Maintain a list of active edges in case there are multiple spans of pixels - known as Active Edge List.

• For each edge on the list, must know: x-value, maximum y value of edge, m’– Maybe also depth, color…

• Keep all edges in a table, indexed by minimum y value - Edge Table

• For row = min to row=max– AEL=append(AEL, ET(row));

– remove edges whose ymax=row

– sort AEL by x-value

– fill spans

– update each edge in AEL

10/22/02 (c) 2002 University of Wisconsin, CS559

1

2

3

4

5

6

1 2 3 4 5 6

Row:6

5

4

3

2

1 2 0 4 6 0 6

4 0 6

6 0 6

xmin 1/m ymax

Edge Table

10/22/02 (c) 2002 University of Wisconsin, CS559

Row:6

5

4

3

2

1 2 0 4 6 0 6

2 0 4 6 0 6

2 0 4 6 0 6

4 0 6 6 0 6

4 0 6 6 0 6

1

2

3

4

5

6

1 2 3 4 5 66 0 6

x 1/m ymax

Active Edge List (shown just before filling each row)

10/22/02 (c) 2002 University of Wisconsin, CS559

1

2

3

4

5

6

1 2 3 4 5 6

Row:6

5

4

3

2

1 2 1 5 6 -1 5

6 0 6

xmin 1/m ymax

Edge Table

10/22/02 (c) 2002 University of Wisconsin, CS559

1

2

3

4

5

6

1 2 3 4 5 6

Row:6

5

4

3

2

1 2 1 5 6 -1 5

3 1 5 5 -1 5

4 1 5 4 -1 5

3 -1 5 5 1 5

6 0 6

x 1/m ymax

Active Edge List

10/22/02 (c) 2002 University of Wisconsin, CS559

Comments

• Sort is quite fast, because AEL is usually almost in order

• OpenGL limits to convex polygons, meaning two and only two elements in AEL at any time, and no sorting

• Can generate memory addresses (for pixel writes) efficiently

• Does not require floating point - next slide

10/22/02 (c) 2002 University of Wisconsin, CS559

Avoiding Floating Point

• For edge, m=x/y, which is a rational number• View x as xi+xn/y, with xn<y. Store xi and xn

• Then x->x+m’ is given by:– xn=xn+x– if (xn>=y) { xi=xi+1; xn=xn- y }

• Advantages:– no floating point– can tell if x is an integer or not, and get floor(x) and ceiling(x) easily, for

the span endpoints