cs 551 / 645: introductory computer graphics clipping lines and polygons
TRANSCRIPT
CS 551 / 645: Introductory Computer Graphics
Clipping Lines and Polygons
Know your role...
Brian talks about assignment 1 Clipping lines to viewports Clipping lines to arbitrary polygons Clipping polygons
Clipping Lines To Viewport
Discard segments of lines outside viewport– Trivially accept lines with both endpoints inside all edges of
the viewport– Trivially reject lines with both endpoints outside the same
edge of the viewport– Otherwise, reduce to trivial cases by splitting into two
segments
Solving Simultaneous Equations
Equation of a line– Slope-intercept: y = mx + b– Implicit Equation: Ax + By + C = 0
– Parametric: Line defined by two points, P0 and P1
P(t) = P0 + (P1 - P0) t
x(t) = x0 + (x1 - x0) t
y(t) = x0 + (y1 - y0) t
Parametric Line Equation
Describes a finite line Works with vertical lines (like the viewport) 0 <=t <= 1
– Defines line between P0 and P1
t < 0– Defines line before P0
t > 1– Defines line after P1
Parametric Lines and Clipping
Define each line in parametric form: – P0(t)…Pn-1(t)
Define each edge of viewport in parametric form:– PL(t), PR(t), PT(t), PB(t)
For each line, compute intersection with all viewport edges
Computing Intersections
Line 0:– x0 = x0
0 + (x01 - x0
0) t0
– y0 = y00 + (y0
1 - y00) t0
Edge L:– xL = xL
0 + (xL1 - xL
0) tL
– yL = yL0 + (yL
1 - yL0) tL
x00 + (x0
1 - x00) t0 = xL
0 + (xL1 - xL
0) tL
y00 + (y0
1 - y00) t0 = yL
0 + (yL1 - yL
0) tL
– Solve for t0 and tL
What’s wrong with this?
Cohen-Sutherland Line Clipping
Divide viewplane into regions defined by viewport edges
Assign each region a 4-bit outcode:
0000 00100001
1001
0101 0100
1000 1010
0110
Cohen-Sutherland Line Clipping
Set bits with simple testsx > xmax y < ymin etc.
Assign an outcode to each vertex of line– If both outcodes = 0, trivial accept– bitwise AND vertex outcodes together– If result 0, trivial reject
Cohen-Sutherland Line Clipping
If line cannot be trivially accepted or rejected, subdivide so that one or both segments can be discarded
Pick an edge that the line crosses
A
B
D E
C
Cohen-Sutherland Line Clipping
Intersect line with edge (how?)
A
B
D E
C
Discard portion on wrong side of edge and assign outcode to new vertex
Apply trivial accept/reject tests and repeat if necessary
Cohen-Sutherland Line Clipping
A
B
DC
Cohen-Sutherland Line Clipping
Outcode tests and line-edge intersects are quite fast
But some lines require multiple iterations (see F&vD figure 3.40)
Fundamentally more efficient algorithms: – Cyrus-Beck uses parametric lines– Liang-Barsky optimizes this for upright volumes– F&vD for more details
Cyrus-Beck Algorithm
Use parametric equations of lines Optimize We saw that this could be expensive…
Start with parametric equation of line:– P(t) = P0 + (P1 - P0) t
And a point and normal for each edge– PL, NL
Cyrus-Beck Algorithm
NL [P(t) - PL] = 0
Substitute line equation for P(t) Solve for t
– t = NL [P0 - PL] / -NL [P1 - P0]
PL
NL
P(t)Inside
P0
P1
Cyrus-Beck Algorithm
Compute t for line intersection with all four edges Discard all (t < 0) and (t > 1) Classify each remaining intersection as
– Potentially Entering (PE)– Potentially Leaving (PL)
NL [P1 - P0] > 0 implies PL
NL [P1 - P0] < 0 implies PE– Note that we computed this term in when computing t
Compute PE with largest t Compute PL with smallest t Clip to these two points
Cyrus-Beck Algorithm
PE
PLP1
PL
PE
P0
Cyrus-Beck Algorithm
Because of horizontal and vertical clip lines:– Many computations reduce
Normals: (-1, 0), (1, 0), (0, -1), (0, 1) Pick constant points on edges solution for t:
– -(x0 - xleft) / (x1 - x0)
– (x0 - xright) / -(x1 - x0)
– -(y0 - ybottom) / (y1 - y0)
– (y0 - ytop) / -(y1 - y0)
Comparison
Cohen-Sutherland– Repeated clipping is expensive– Best used when trivial acceptance and rejection is
possible for most lines
Cyrus-Beck– Computation of t-intersections is cheap– Computation of (x,y) clip points is only done once– Algorithm doesn’t consider trivial accepts/rejects– Best when many lines must be clipped
Liang-Barsky: Optimized Cyrus-Beck Nicholl et al.: Fastest, but doesn’t do 3D
Clipping Polygons
Clipping polygons is more complex than clipping the individual lines– Input: polygon– Output: polygon, or nothing
When can we trivially accept/reject a polygon as opposed to the line segments that make up the polygon?
What happens to a triangle during clipping? Possible outcomes:
triangletriangle
Why Is Clipping Hard?
trianglequad triangle5-gon
How many sides can a clipped triangle have?
A really tough case:
Why Is Clipping Hard?
A really tough case:
Why Is Clipping Hard?
concave polygonmultiple polygons
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping
Basic idea:– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Sutherland-Hodgman Clipping:The Algorithm Basic idea:
– Consider each edge of the viewport individually– Clip the polygon against the edge equation– After doing all planes, the polygon is fully clipped
Will this work for non-rectangular clip regions? What would 3-D
clipping involve?
Sutherland-Hodgman Clipping
Input/output for algorithm:– Input: list of polygon vertices in order – Output: list of clipped poygon vertices consisting of
old vertices (maybe) and new vertices (maybe)
Note: this is exactly what we expect from the clipping operation against each edge
Sutherland-Hodgman Clipping
Sutherland-Hodgman basic routine:– Go around polygon one vertex at a time– Current vertex has position p – Previous vertex had position s, and it has been
added to the output if appropriate
Sutherland-Hodgman Clipping
Edge from s to p takes one of four cases:(Purple line can be a line or a plane)
inside outside
s
p
p output
inside outside
s
p
no output
inside outside
sp
i output
inside outside
sp
i outputp output
Sutherland-Hodgman Clipping
Four cases:– s inside plane and p inside plane
Add p to output Note: s has already been added
– s inside plane and p outside plane Find intersection point i Add i to output
– s outside plane and p outside plane Add nothing
– s outside plane and p inside plane Find intersection point i Add i to output, followed by p
Point-to-Plane test
A very general test to determine if a point p is “inside” a plane P, defined by q and n:
(p - q) • n < 0: p inside P
(p - q) • n = 0: p on P
(p - q) • n > 0: p outside P
P
np
q
P
np
q
P
np
q
Point-to-Plane Test
Dot product is relatively expensive– 3 multiplies– 5 additions– 1 comparison (to 0, in this case)
Think about how you might optimize or special-case this
Finding Line-Plane Intersections
Use parametric definition of edge:L(t) = L0 + (L1 - L0)t
– If t = 0 then L(t) = L0
– If t = 1 then L(t) = L1
– Otherwise, L(t) is part way from L0 to L1
Finding Line-Plane Intersections
Edge intersects plane P where E(t) is on P– q is a point on P– n is normal to P
(L(t) - q) • n = 0
t = [(q - L0) • n] / [(L1 - L0) • n]
– The intersection point i = L(t) for this value of t
Line-Plane Intersections
Note that the length of n doesn’t affect result: Again, lots of opportunity for optimization