CMPB335 Geometric Programming

Download Report

Transcript CMPB335 Geometric Programming

CGMB 314
Intro to Computer Graphics
Fill Area Primitives
Filling 2D Shapes

How do we fill shapes?
Solid Fill
Pattern Fill
Texture Fill
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
Representing Filled Shapes

Digital images
•
Inside determined by a color or range of colors
Original Image
Pink pixels have been filled
with yellow
Representing Filled Shapes
(cont…)

A digital outline and a seed point indicating the
interior
Digital outline and seed
points
Filled outlines
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
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)
•
All points to the right of all of the (ordered) edges
• Rule for interior points
Representing Filled Shapes
(cont…)


Edge list
•
•
•
•
Ordered edges
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
Representing Filled Shapes
(cont…)


Edge list
•
•
•
•
Filled shape
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
Fill Options

How to set pixel colors for points inside
the shape?
Solid Fill
Pattern Fill
Texture Fill
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
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
Seed Fill

Basic algorithm
select seed pixel
initialize a fill list to contain seed pixel
while (fill list not empty) {
pixel  get next pixel from fill list
setPixel(pixel)
for (each of the pixel’s neighbors) {
if (neighbor is inside region AND neighbor not set)
add neighbor to fill list
}
}
Which neighbors should be
tested?

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?

Using 4-connected and 8-connected neighbors
gives different results
Magnified area
Original boundary
Fill using 4-connected neighbors
Fill using 8-connected neighbors
When is a Neighbor Inside the
Region?

There are two types of tests, resulting in
two filling approaches
• Boundary fill
• Flood fill
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
Seed pixel
Boundary pixel
Original image and seed point
Image after 4-connected boundary fill
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
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)
Improving Performance (cont…)

Use coherence (logical connection) to improve
performance and reduce memory requirements
•
Neighbor coherence
•
Span coherence
•
• Neighboring pixels tend to be in the same region
• 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
Improving Performance (cont…)

Span-based seed fill algorithm
Seed point
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
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
Improving Performance (cont…)

Span-based seed fill algorithm
•
Repeat until the fill list is empty
Improving Performance (cont…)

Span-based seed fill algorithm
•
Repeat until the fill list is empty
Improving Performance (cont…)

Span-based seed fill algorithm
•
Repeat until the fill list is empty
Improving Performance (cont…)

Span-based seed fill algorithm
•
Repeat until the fill list is empty
Filling Axis-Aligned Rectangles

An axis-aligned rectangle is defined by its corner points
(Xmin, Ymin) and (Xmax, Ymax)
(Xmax, Ymax)
(Xmin, Ymin)
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)
}
}
(Xmax, Ymax)
(Xmin, Ymin)
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
Filling General Polygons

Specifying the interior
•
Must be able to determine which points are inside the polygon
•
Need a fill rule
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
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
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
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
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
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
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
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
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
Dealing with Shared Vertices
2.
•
•
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
Filling Polygons via Boundary
Fill

Polygons are defined by their edges
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
Filling Polygons via Boundary
Fill

Polygons are defined by their edges
•
Fill the inside of the polygon using a boundary fill
Filling Polygons via Boundary
Fill

Problems
1. 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
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
Raster-Based Filling

For each scan line
•
Determine points where the scan line intersects the
polygon
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
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 edge
sort the x-intersections by increasing x-value
for (each pair of intersection points, x1 and x2) {
while (x1 < i < x2) setPixel(i, j, fillColor)
}
}
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
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
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
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
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