cs 543: computer graphics lecture 8: 3d clipping...
TRANSCRIPT
![Page 1: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/1.jpg)
CS 543: Computer GraphicsLecture 8: 3D Clipping and Viewport Transformation
Emmanuel Agu
![Page 2: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/2.jpg)
3D Clipping
§ Clipping occurs after projection transformation
§Clipping is against canonical view volume
![Page 3: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/3.jpg)
Parametric Equations
n Implicit form
n Parametric forms: n points specified based on single parameter valuen Typical parameter: time t
n Some algorithms work in parametric formn Clipping: exclude line segment rangesn Animation: Interpolate between endpoints by varying t
0),( =yxF
tPPPtP *)()( 010 −+= 10 ≤≤ t
![Page 4: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/4.jpg)
3D Clipping
n 3D clipping against canonical view volume (CVV)
n Automatically clipping after projection matrix
n Liang-Barsky algorithm (embellished by Blinn)
n CVV == 6 infinite planes (x=-1,1;y=-1,1;z=-1,1)
n Clip edge-by-edge of the an object against CVV
n Chopping may change number of sides of an object. E.g. chopping tip of triangle may create quadrilateral
![Page 5: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/5.jpg)
3D Clipping
n Problem: n Two points, A = (Ax, Ay, Az, Aw) and C = (Cx, Cy, Cz, Cw),
in homogeneous coordinatesn If segment intersects with CVV, need to compute
intersection point I-=(Ix,Iy,Iz,Iw)
![Page 6: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/6.jpg)
3D Clipping
n Represent edge parametrically as A + (C – A)tn Intepretation: a point is traveling such that:
n at time t=0, point at A n at time t=1, point at C
n Like Cohen-Sutherland, first determine trivial accept/rejectn E.g. to test edge against plane, point is:
n Inside (right of plane x=-1) if Ax/Aw > -1 or (Aw+Ax)>0n Inside (left of plane x=1) if Ax/Aw < 1 or (Aw-Ax)>0
-1 1
Ax/Aw
![Page 7: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/7.jpg)
3D Clipping
n Using notation (Aw +Ax) = w + x, write boundary coordinates for 6 planes as:
z=1w-zBC5
z=-1w+zBC4
y=1w-yBC3
y=-1w+yBC2
x=1w-xBC1
x=-1w+xBC0
Clip planeHomogenous coordinate
Boundary coordinate (BC)
§Trivial accept: 12 BCs (6 for pt. A, 6 for pt. C) are positive
§Trivial reject: Both endpoints outside of same plane
![Page 8: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/8.jpg)
3D Clipping
n If not trivial accept/reject, then clip
n Define Candidate Interval (CI) as time interval during which edge might still be inside CVV. i.e. CI = t_in to t_out
n Conversely: values of t outside CI = edge is outside CVV
n Initialize CI to [0,1]
0 1
tt_in t_out
CI
![Page 9: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/9.jpg)
3D Clipping
n How to calculate t_hit?
n Represent an edge t as:
n E.g. If x = 1,
n Solving for t above,
1)(
)( =−+−+
tAwCwAwtAxCxAx
)()( CxCwAxAwAxAwt
−−−−=
))((,)((,)((,)((()( tAwCwAwtAzCzAztAyCyAytAxCxAxtEdge −+−+−+−+=
![Page 10: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/10.jpg)
3D Clipping
n Test against each wall in turn
n If BCs have opposite signs = edge hits plane at time t_hit
n Define: “entering” = as t increases, outside to inside
n i.e. if pt. A is outside, C is inside
n Likewise, “leaving” = as t increases, inside to outside (A inside, C outside)
![Page 11: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/11.jpg)
3D Clipping
n Algorithm:
n Test for trivial accept/reject (stop if either occurs)
n Set CI to [0,1]
n For each of 6 planes:
n Find hit time t_hit
n If, as t increases, edge entering, t_in = max(t_in,t_hit)
n If, as t increases, edge leaving, t_out = min(t_out, t_hit)
n If t_in > t_out => exit (no valid intersections)
Note: seeking smallest valid CI without t_in crossing t_out
![Page 12: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/12.jpg)
3D Clipping
Example to illustrate search for t_in, t_out
Note: CVV is different shape. This is just example
![Page 13: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/13.jpg)
3D Clipping
n If valid t_in, t_out, calculate adjusted edge endpoints A, C as
n A_chop = A + t_in ( C – A)n C_chop = A + t_out ( C – A)
![Page 14: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/14.jpg)
3D Clipping Implementation
n Function clipEdge( )n Input: two points A and C (in homogenous coordinates)n Output:
n 0, if no part of line AC lies in CVVn 1, otherwisen Also returns clipped A and C
n Store 6 BCs for A, 6 for C
![Page 15: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/15.jpg)
3D Clipping Implementation
n Use outcodes to track in/outn Number walls 1… 6n Bit i of A’s outcode = 0 if A is inside ith walln 1 otherwise
n Trivial accept: both A and C outcodes = 0n Trivial reject: bitwise AND of A and C outcodes is non-zeron If not trivial accept/reject:
n Compute tHitn Update t_in, t_outn If t_in > t_out, early exit
![Page 16: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/16.jpg)
3D Clipping Pseudocode
int clipEdge(Point4& A, Point4& C){
double tIn = 0.0, tOut = 1.0, tHit;double aBC[6], cBC[6];int aOutcode = 0, cOutcode = 0;
…..find BCs for A and C…..form outcodes for A and C
if((aOutCode & cOutcode) != 0) // trivial rejectreturn 0;
if((aOutCode | cOutcode) == 0) // trivial acceptreturn 1;
![Page 17: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/17.jpg)
3D Clipping Pseudocode
for(i=0;i<6;i++) // clip against each plane{
if(cBC[i] < 0) // exits: C is outside{
tHit = aBC[i]/(aBC[i] – cBC[I]);tOut = MIN(tOut, tHit);
}else if(aBC[i] < 0) // enters: A is outside{
tHit = aBC[i]/(aBC[i] – cBC[i]);tIn = MAX(tIn, tHit);
}if(tIn > tOut) return 0; // CI is empty: early out
}
![Page 18: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/18.jpg)
3D Clipping Pseudocode
Point4 tmp; // stores homogeneous coordinatesIf(aOutcode != 0) // A is out: tIn has changed{
tmp.x = A.x + tIn * (C.x – A.x);// do same for y, z, and w components
}If(cOutcode != 0) // C is out: tOut has changed{
C.x = A.x + tOut * (C.x – A.x);// do same for y, z and w components
}A = tmp;Return 1; // some of the edges lie inside CVV}
![Page 19: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/19.jpg)
Viewport Transformation
n After clipping, do viewport transformationn We have used glViewport(x,y, wid, ht) beforen Use again here!!n glViewport shifts x, y to screen coordinatesn Also maps pseudo-depth z from range [-1,1] to [0,1] n Pseudo-depth stored in depth buffer, used for Depth testing (Will
discuss later)
![Page 20: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/20.jpg)
Clipping Polygons
n Cohen-Sutherland and Liang-Barsky clip line segments against each window in turn
n Polygons can be fragmented into several polygons during clipping
n May need to add edgesn Need more sophisticated algorithms to handle polygons:
n Sutherland-Hodgman: any subject polygon against a convex clip polygon (or window)
n Weiler-Atherton: Both subject polygon and clip polygon can be concave
![Page 21: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/21.jpg)
Sutherland-Hodgman Clipping
n Consider Subject polygon, S to be clipped against a clip polygon, C
n Clip each edge of S against C to get clipped polygonn S is an ordered list of vertices a b c d e f g
C
Sa
f
g
e
dc
b
![Page 22: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/22.jpg)
Sutherland-Hodgman Clipping
n Traverse S vertex list edge by edgen i.e. successive vertex pairs make up edgesn E.g. ab, bc, de, … etc are edgesn Each edge has first point s and endpoint p
C
Sa
f
g
e
dc
bs p
![Page 23: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/23.jpg)
Sutherland-Hodgman Clipping
n For each edge of S, output to new vertex depends on whether s or/and p are inside or outside C
n 4 possible cases:
s
p
is
inside outside
outsideinside p
Case A: Both s and p are inside:
output p
Case B: s inside, p outside:
Find intersection i,
output i
![Page 24: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/24.jpg)
Sutherland-Hodgman Clipping
n And….
ip sp
soutside outsideinsideinside
Case C: Both s and p outside: output nothing
Case D: s outside, p inside:
Find intersection i,
output i and then p
![Page 25: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/25.jpg)
Sutherland-Hodgman Clipping
n Now, let’s work through examplen Treat each edge of C as infinite plane to clip againstn Start with edge that goes from last vertex to first (e.g ga)
a
f
ge
d c
b
a
f
ge
d c
b
a b c d e f g
1 2 c d e f g
21
![Page 26: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/26.jpg)
Sutherland-Hodgman Clipping
n Then chop against right edge
f
ge
d c1 2 c d e f g
21
f
ge
d c3 1 4 5 d e f 6
213
4
5
6
![Page 27: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/27.jpg)
Sutherland-Hodgman Clipping
n Then chop against bottom edge
f
e
d3 1 4 5 d e f 6
1
3
4
5
6
e
3 1 4 7 8 e 9 10 6
13
4
86
9 10 7
![Page 28: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/28.jpg)
Sutherland-Hodgman Clipping
n Finally, clip against left edge
e
3 1 4 7 8 e 9 10 6
13
4
86
9 10 7
e
3 1 4 7 11 12 e 9 10 6
13
4
12 69 10 7
11
![Page 29: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/29.jpg)
Weiler-Atherton Clipping Algorithm
n Sutherland-Hodgman required at least 1 convex polygonn Weiler-Atherton can deal with 2 concave polygonsn Searches perimeter of SUBJ polygon searching for borders that
enclose a clipped filled regionn Finds multiple separate unconnected regions a
D
C
B
A
c
d
b
SUBJ
CLIP
65
4 32
1B
![Page 30: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/30.jpg)
Weiler-Atherton Clipping Algorithm
n Follow detours along CLIP boundary whenever polygon edge crosses to outside of boundary
n Example: SUBJ = {a,b,c,d} CLIP = {A,B,C,D}n Order: clockwise, interior to rightn First find all intersections of 2 polygonsn Example has 6 int. n {1,2,3,4,5,6}
a
D
C
B
A
c
d
b
SUBJ
CLIP
65
4 32
1B
![Page 31: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/31.jpg)
Weiler-Atherton Clipping Algorithm
n Start at a, traverse SUBJ in forward direction till first entering intersection (SUBJ moving outside-inside of CLIP) is found
n Record this intersection (1) to new vertex listn Traverse along SUBJ till next intersection (2)n Turn away from SUBJ at 2n Now follow CLIP in forward directionn Jump between polygons moving in
forward direction till first intersection (1) is found again
n Yields: {1, b, 2}
a
D
C
B
Ac
d
b
SUBJ
CLIP
65
4 32
1B
![Page 32: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/32.jpg)
Weiler-Atherton Clipping Algorithm
n Start again, checking for next entering intersection of SUBJn Intersection (3) is foundn Repeat processn Jump from SUBJ to CLIP at next intersection (4)n Polygon {3,4,5,6} is foundn Further checks show no new entering intersections
a
D
C
B
Ac
d
b
SUBJ
CLIP
65
4 32
1B
![Page 33: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/33.jpg)
Weiler-Atherton Clipping Algorithm
n Can be implemented using 2 simple listsn List all ordered vertices and intersections of SUBJ and CLIPn SUBJ_LIST: a, 1, b, 2, c, 3, 4, d, 5, 6n CLIP_LIST: A, 6, 3, 2, B, 1, C, D, 4, 5
a
D
C
B
Ac
d
b
SUBJ
CLIP
65
4 32
1B
![Page 34: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/34.jpg)
Weiler-Atherton Clipping Algorithm
a
D
C
B
Ac
d
b
SUBJ
CLIP
65
4 32
1
SUBJ_LIST:
CLIP_LIST:4DC
5
1B236A
65d43c2b1astart restart
visitedvisited
B
![Page 35: CS 543: Computer Graphics Lecture 8: 3D Clipping …web.cs.wpi.edu/~emmanuel/courses/cs543/slides/lecture8.pdfCS 543: Computer Graphics Lecture 8: 3D Clipping and Viewport Transformation](https://reader031.vdocuments.us/reader031/viewer/2022022507/5ac9676f7f8b9a5d718d7687/html5/thumbnails/35.jpg)
References
n Hill, sections 7.4.4, 4.8.2