Top Banner
CGMB 314 Intro to Computer Graphics Fill Area Primitives
54
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CG3_Fill Area Primitives.ppt

CGMB 314Intro to Computer Graphics

Fill Area Primitives

Page 2: CG3_Fill Area Primitives.ppt

Filling 2D Shapes

How do we fill shapes?

Solid Fill Pattern Fill Texture Fill

Page 3: CG3_Fill Area Primitives.ppt

Filling 2D Shapes (cont…)

Some requirements• A digital representation of the shape

• The shape must be closed

• It must have a well defines inside and outside

• A test for determining if a point is inside or outside of the shape

• A rule or procedure for determining the colors of points inside the shape

Page 4: CG3_Fill Area Primitives.ppt

Representing Filled Shapes

Digital images• Inside determined by a color or range of colors

Original Image Pink pixels have been filled with yellow

Page 5: CG3_Fill Area Primitives.ppt

Representing Filled Shapes (cont…)

A digital outline and a seed point indicating the interior

Digital outline and seed points

Filled outlines

Page 6: CG3_Fill Area Primitives.ppt

Representing Filled Shapes (cont…)

An implicit function representing a shape’s interior

The inside of a circle of radius R

The inside of a unit square

Page 7: CG3_Fill Area Primitives.ppt

Representing Filled Shapes (cont…)

An equation or list of edges representing a shape’s boundary and a rule for determining its interior• E.g.

• Edge list• Line from (0,0) to (1,0)

• Line from (1,0) to (1,1)

• Line from (1,1) to (0,1)

• Line from (0,1) to (1,1)

• Rule for interior points• All points to the right of all of the (ordered) edges

Page 8: CG3_Fill Area Primitives.ppt

Representing Filled Shapes (cont…)

Edge list• Line from (0,0) to (1,0)• Line from (1,0) to (1,1)• Line from (1,1) to (0,1)• Line from (0,1) to (1,1)

Rule for interior points• All points to the right of all of the (ordered) edges

Ordered edges

Page 9: CG3_Fill Area Primitives.ppt

Representing Filled Shapes (cont…)

Edge list• Line from (0,0) to (1,0)• Line from (1,0) to (1,1)• Line from (1,1) to (0,1)• Line from (0,1) to (1,1)

Rule for interior points• All points to the right of all of the (ordered) edges

Filled shape

Page 10: CG3_Fill Area Primitives.ppt

Fill Options

How to set pixel colors for points inside the shape?

Solid Fill Pattern Fill Texture Fill

Page 11: CG3_Fill Area Primitives.ppt

Seed Fill

Approach• Select a seed point inside a region

• Move outwards from the seed point, setting neighboring pixels until the region is filled

Seed point Move outwards to neighbors

Stop when the region is filled

Page 12: CG3_Fill Area Primitives.ppt

Selecting the Seed Point

Difficult to place the seed point automatically• Seed fill works best in an interactive application where

the user sets the seed point

What is the inside of this shape? * It depends on the user’s intent

Page 13: CG3_Fill Area Primitives.ppt

Seed Fill Basic algorithm

select seed pixelinitialize a fill list to contain seed pixelwhile (fill list not empty) {

pixel get next pixel from fill listsetPixel(pixel)

for (each of the pixel’s neighbors) { if (neighbor is inside region AND neighbor not

set) add neighbor to fill list}

}

Page 14: CG3_Fill Area Primitives.ppt

There are two types of 2D regions• 4-connected region (test 4 neighbors)

• Two pixels are 4-connected if they are vertical or horizontal neighbors

• 8-connected region (test 8 neighbors)

• Two pixels are 8-connected if they are vertical, horizontal, or diagonal neighbors

Which neighbors should be tested?

Page 15: CG3_Fill Area Primitives.ppt

Which neighbors should be tested?

Using 4-connected and 8-connected neighbors gives different results

Magnified area

Original boundary

Fill using 4-connected neighbors

Fill using 8-connected neighbors

Page 16: CG3_Fill Area Primitives.ppt

When is a Neighbor Inside the Region?

There are two types of tests, resulting in two filling approaches• Boundary fill

• Flood fill

Page 17: CG3_Fill Area Primitives.ppt

Boundary Fill Fill condition

• The region is defined by a set of boundary pixels

• A neighbor of an inside pixel is also inside if it is not a boundary pixel

Boundary pixel

Seed pixel

Original image and seed point Image after 4-connected boundary fill

Page 18: CG3_Fill Area Primitives.ppt

Flood Fill Fill condition

• The region is defined by a patch of like-colored pixels

• A neighbor of an inside pixel is also inside if its color is within a range of the seed pixel’s original color

• The range of inside colors can be specified in the application

Seed pixel

Original image and seed point Image after 4-connected flood fill

Page 19: CG3_Fill Area Primitives.ppt

Improving Performance

Problems with the basic algorithm• We don’t know how big the fill list should be

• Worst case, all the image pixels

• Slow• Pixels may be checked many times to see if they

have already been set (especially for 8-connected regions)

Page 20: CG3_Fill Area Primitives.ppt

Improving Performance (cont…)

Use coherence (logical connection) to improve performance and reduce memory requirements• Neighbor coherence

• Neighboring pixels tend to be in the same region

• Span coherence

• Neighboring pixels along a given scan line tend to be in the same region

• Scan-line coherence

• The filling patterns of adjacent scan lines tends to be similar

Page 21: CG3_Fill Area Primitives.ppt

Improving Performance (cont…)

Span-based seed fill algorithm

Seed point

Page 22: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Start from the seed point

• Fill the entire horizontal span of pixels inside the region

Seed point

Page 23: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Determine spans of pixels in the rows above and below the current row that are connected to the current span

• Add the left-most pixel of these spans to the fill list

Page 24: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Repeat until the fill list is empty

Page 25: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Repeat until the fill list is empty

Page 26: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Repeat until the fill list is empty

Page 27: CG3_Fill Area Primitives.ppt

Improving Performance (cont…) Span-based seed fill algorithm

• Repeat until the fill list is empty

Page 28: CG3_Fill Area Primitives.ppt

Filling Axis-Aligned Rectangles An axis-aligned rectangle is defined by its corner points

(Xmin, Ymin) and (Xmax, Ymax)

(Xmin, Ymin)

(Xmax, Ymax)

Page 29: CG3_Fill Area Primitives.ppt

Filling Axis-Aligned Rectangles Filling can be done in a nested loop

for (j = Ymin, j < Ymax, j++) { for (i = Xmin, i < Xmax, i++) { setPixel(i, j, fillColor) }}

(Xmin, Ymin)

(Xmax, Ymax)

Page 30: CG3_Fill Area Primitives.ppt

Filling General Polygons Representing general polygons

• Defined by a list of connected line segments

• The line segments must form a closed shape (i.e. the boundary must connected)

• General polygons

• Can be self intersecting

• Can have interior holes

Page 31: CG3_Fill Area Primitives.ppt

Filling General Polygons Specifying the interior

• Must be able to determine which points are inside the polygon

• Need a fill rule

Page 32: CG3_Fill Area Primitives.ppt

Filling General Polygons

Specifying the interior• There are two commonly used fill rules

• Even-odd parity rule

• Non-zero winding rule

Filled using even-odd parity rule Filled using none-zero winding rule

Page 33: CG3_Fill Area Primitives.ppt

Even-odd Parity Rule To determine if a point P is inside or outside

• Draw a line from P to infinity

• Count the number of times the line crosses an edge

• If the number of crossing is odd, the point is inside

• If the number of crossing is even, the point is outside

Page 34: CG3_Fill Area Primitives.ppt

Non-zero Winding Number Rule

The outline of the shape must be directed• The line segments must have a consistent direction so that

they formed a continuous, closed path

Page 35: CG3_Fill Area Primitives.ppt

Non-zero Winding Number Rule To determine if a points is inside or outside

• Determine the winding number (i.e. the number of times the edge winds around the point in either a clockwise or counterclockwise direction)

• Points are outside if the winding number is zero

• Point are inside if the winding number is not zero

Page 36: CG3_Fill Area Primitives.ppt

Non-zero Winding Number Rule To determine the winding number at a point P

• Initialize the winding number to zero and draw a line (e.g. horizontal) from P to infinity

• If the line crosses an edge directed bottom to up

• Add 1 to the winding number

• If the line crosses an edge directed top to bottom

• Subtract 1 from the winding number

Page 37: CG3_Fill Area Primitives.ppt

Inside-Outside Tests The non-zero winding number rule and the even-odd parity

rule can give different results for general polygons• When polygons self intersect

• When polygons have interior holes

Even-odd parity Non-zero winding

Page 38: CG3_Fill Area Primitives.ppt

Inside-Outside Tests Standard polygons

• Standard polygons (e.g. triangles, rectangles, octagons) do not self intersect and do not contain holes

• The non-zero winding number rule and the even-odd parity rule give the same results for standard polygons

Page 39: CG3_Fill Area Primitives.ppt

Shared Vertices

Edges share vertices• If the line drawn for the fill rule intersects a vertex, the

edge crossing would be counted twice

• This yields incorrect and inconsistent even-odd parity checks and winding numbers

Line pierces the outline- Should count as one crossing

Line grazes the outline- Should count as no crossings

Page 40: CG3_Fill Area Primitives.ppt

Dealing with Shared Vertices

1. Check the vertex type (piercing or grazing)• If the vertex is between two upwards or two downwards edges, the line

pierces the edge

• Process a single edge crossing

• If the vertex is between an upwards and a downwards edge, the line grazes the vertex

• Don’t process any edge crossings

Vertex between two upwards edges- Process a single crossing

Vertex between upwards and downwards edges- Process no crossings

Page 41: CG3_Fill Area Primitives.ppt

Dealing with Shared Vertices2. Ensure that the line does not intersect a vertex

• Use a different line if the first line intersects a vertex• Could be costly if you have to try several lines

• If using horizontal scan line for the inside-outside test• Preprocess edge vertices to make sure that none of them fall on a scan line

• Add a small floating point value to each vertex y-position

Page 42: CG3_Fill Area Primitives.ppt

Filling Polygons via Boundary Fill

Polygons are defined by their edges

Page 43: CG3_Fill Area Primitives.ppt

Filling Polygons via Boundary Fill

Polygons are defined by their edges• Use a line drawing algorithm to draw edges of the polygon

with a boundary color

Page 44: CG3_Fill Area Primitives.ppt

Filling Polygons via Boundary Fill

Polygons are defined by their edges• Fill the inside of the polygon using a boundary fill

Page 45: CG3_Fill Area Primitives.ppt

Filling Polygons via Boundary Fill

Problems1. Pixels are drawn on both sides of the line

• The polygon contains pixels outside of the outline

• Polygons with shared edges will have overlapping pixels

2. Efficiency• Drawing outlines and then filling can be less efficient

that combining the edge drawing and filling in one step

Page 46: CG3_Fill Area Primitives.ppt

Raster-Based Filling Fill polygons in raster-scan order

• Fill spans of pixels inside the polygon along each horizontal scan line

• More efficient addressing by accessing spans of pixels

• Only test pixels at the span endpoints

Page 47: CG3_Fill Area Primitives.ppt

Raster-Based Filling

For each scan line• Determine points where the scan line intersects the

polygon

Page 48: CG3_Fill Area Primitives.ppt

Raster-Based Filling For each scan line

• Set pixels between intersection points (using a fill rule)

• Even-odd parity rule: set pixels between pairs of intersections

• Non-zero winding rule: set pixels according to the winding number

Page 49: CG3_Fill Area Primitives.ppt

Raster-Based Filling Basic algorithm (with even-odd parity rule)

for (each scan line, j) {find the x-intersections between the scan line and each edgesort the x-intersections by increasing x-value

for (each pair of intersection points, x1 and x2) {while (x1 < i < x2) setPixel(i, j, fillColor)

}}

Page 50: CG3_Fill Area Primitives.ppt

Conventions for Setting Edge Pixels

Adjacent polygons share edges• When rendered, some pixels along the edges are shared

• Need to know what color to use for shared edge pixels

Page 51: CG3_Fill Area Primitives.ppt

Conventions for Setting Edge Pixels If we draw all edge pixels for each polygon

• Shared pixels will be rendered more than once

• If setPixel() overwrites the current pixel, the last polygon drawn will look larger

Green triangle written last

Page 52: CG3_Fill Area Primitives.ppt

Conventions for Setting Edge Pixels If we draw all edge pixels for each polygon

• Shared pixels will be rendered more than once

• If setPixel() overwrites the current pixel, the last polygon drawn will look larger

Blue triangle written last

Page 53: CG3_Fill Area Primitives.ppt

Conventions for Setting Edge Pixels If we draw all edge pixels for each polygon

• Shared pixels will be rendered more than once

• If setPixel() blends the background color with the foreground color, shared edge pixels will have a blended color

Edge color different than either triangle

Page 54: CG3_Fill Area Primitives.ppt

Conventions for Setting Edge Pixels If we draw none of the edge pixels

• Only interior pixels are drawn

• Gaps appear between polygons and the background shows through

Gaps between adjacent triangles