Transcript PowerPoint
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 = x00 + (x01 - x00) t0 – y0 = y00 + (y01 - y00) t0 Edge L: – xL = xL0 + (xL1 - xL0) tL – yL = yL0 + (yL1 - yL0) tL x00 + (x01 - x00) t0 = xL0 + (xL1 - xL0) tL y00 + (y01 - y00) t0 = yL0 + (yL1 - yL0) 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: 1001 1000 1010 0001 0000 0010 0101 0100 0110 Cohen-Sutherland Line Clipping Set bits with simple tests x > 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 D C B A E Cohen-Sutherland Line Clipping Intersect line with edge (how?) D C B A E Cohen-Sutherland Line Clipping Discard portion on wrong side of edge and assign outcode to new vertex D C B A Apply trivial accept/reject tests and repeat if necessary 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 PL P(t) Inside P0 NL Substitute line equation for P(t) Solve for t – t = NL [P0 - PL] / -NL [P1 - 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 Cyrus-Beck Algorithm Compute PE with largest t Compute PL with smallest t Clip to these two points PL PL PE PE P0 P1 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? Why Is Clipping Hard? What happens to a triangle during clipping? Possible outcomes: triangletriangle trianglequad triangle5-gon How many sides can a clipped triangle have? Why Is Clipping Hard? A really tough case: Why Is Clipping Hard? A really tough case: 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 inside outside inside outside p s p p output s i output p inside p s no output i output p output outside s 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 - q) • n = 0: (p - q) • n > 0: q p inside P p on P p outside P q q n p n n p p P P P 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