Professional Documents
Culture Documents
Comp 535
Line Clipping
What happens when one or both endpoints of
a line segment are not inside the specified
drawing area?
Drawing
Area
Line Clipping
Strategies for clipping:
a) Check (in inner loop) if each point is inside
Works, but slow
if (x xmin and x xmax and y ymin and y ymax)
drawPoint(x,y,c);
No clipping necessary
H
B
J
D
Clip and
retest
H
B
Trivially accept
E
G
Trivially reject
if y > ymax
if y < ymin
if x > xmax
if x < xmin
1001
1000
1010
0001
0000
0010
0101
0100
0110
Cohen-Sutherland Accept/Reject
Accept/reject/redo all based on bit-wise
Boolean ops.
1001
1000
1010
0001
0000
0010
0101
0100
0110
Cohen-Sutherland: Overview
1. Choose an endpoint outside the clipping
region.
2. Clip to a boundary using a consistent
ordering (top to bottom, left to right).
3. Set the new line to have as endpoints the
new intersection point and the other original
endpoint.
4. You may need to run this a few times on a
single line.
8
Intersection algorithm:
(x, y)
dy
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
(x0, y0)
ymax
dx
ymin
xmin
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
x0 = x; y0 = y;
else
x1 = x; y1 = y;
9
xmax
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
x0 = x; y0 = y;
else
x1 = x; y1 = y;
10
dx
xmax = 300
dy
y _
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
x0 = x; y0 = y;
else
x1 = x; y1 = y;
11
dx
xmax = 300
dy
y _
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
12
dx
xmax = 300
dy
y _
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
13
dx
250
xmax = 300
dy
150
y _
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
14
dx
250
xmax = 300
dy
150
y _
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
15
dx
250
xmax = 300
dy
150
x
233
y _
200
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
16
dx
250
xmax = 300
dy
150
x
233
y _
200
(x1, y1) =
(400, 300)
c1 = (1010)
Intersection algorithm:
if c0 0000 then c = c0;
else
c = c1;
dx = x1 x0; dy = y1 y0
if c & 1000
// ymax
x = x0 + dx * (ymax y0) / dy; y = ymax;
ymax=200
(x0, y0) =
(150, 150)
c0 = (0000)
ymin=100
Xmin = 100
else
// xmin
y = y0 + dy * (xmin x0) / dx; x = xmin;
if c = c0
c
1010
x0 = x; y0 = y;
else
x1 = x; y1 = y;
17
dx
250
xmax = 300
dy
150
x
233
y _
200
1000
1001
1010
if c0 | c1 = 0000
accept (draw)
else if c0 & c1 0000
reject (dont draw) 0001
else clip and retest A
0000
0010
0101
0100
0110
B
A 0001
B 0100
OR 0101
AND 0000
clip
C
0000
D
0010
OR 0010
AND 0000
clip
E
0000
F
0000
OR 0000
AND 0000
accept
18
G
0000
H
1010
OR 1010
AND 0000
clip
I
0110
J
0010
OR 0110
AND 0010
reject
1000
1001
1010
if c0 | c1 = 0000
accept (draw)
else if c0 & c1 0000
reject (dont draw) 0001
else clip and retest A
0000
0010
0101
0100
B
remove
AB
A 0001
A 0001
OR 0001
AND 0001
reject
remove
CD
C 0000
C 0000
OR 0000
AND 0000
accept
19
remove
GH
0110
G
0000
G 0000
OR 0000
AND 0000
accept
Cohen-Sutherland: Summary
1. Choose an endpoint outside the clipping
region.
2. Clip to a boundary using a consistent
ordering (top to bottom, left to right).
3. Set the new line to have as endpoints the
new intersection point and the other original
endpoint.
4. You may need to run this a few times on a
single line.
20
Polygon Clipping
What about polygons?
21
v0
v8
vertex: v0
v6
v7
ymax
p0
Inside region: No
v9
Line intersect
boundary: Yes
v2
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
v5
v1
v4
v0
v8
vertex: v1
v6
v7
ymax
p0
line intersect
boundary: no
v2
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
v5
v1
v4
v0
v8
vertex: v2
v6
v7
ymax
p0
line intersect
boundary: yes
v2
v5
v1
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
v4
v0
v8
vertex: v3
v6
v7
ymax
p0
inside region: no
v9
line intersect
boundary: no
v5
v1
v2
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
v4
v0
v8
vertex: v4
v6
v7
ymax
p0
inside region: no
v9
line intersect
boundary: yes
v2
v5
v1
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
p2
v4
v0
v8
vertex: v5
v6
v7
ymax
p3
p0
line intersect
boundary: yes
v2
v5
v1
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
p2
v4
v0
v8
vertex: v6
v6
v7
ymax
p3
p0
inside region: no
v9
line intersect
boundary: no
v5
v1
v2
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
p2
v4
v0
v8
vertex: v7
v6
v7
ymax
p3
p0
inside region: no
v9
line intersect
boundary: no
v5
v1
v2
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
p2
v4
vertex: v8
v6
v7
v0
p4
ymax
p3
p0
inside region: no
v9
line intersect
boundary: yes
v2
v5
v1
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
Output vertex list: p0, v1, v2, p1, p2, v5, p3, p4
31
p2
v4
vertex: v9
v6
v7
p4
p5
ymax
v0
p3
p0
line intersect
boundary: yes
v2
v5
v1
p1
ymin
v3
Input vertex list: (v0, v1, v2, v3, v4, v5, v6, v7, v8, v9)
Output vertex list: p0, v1, v2, p1, p2, v5, p3, p4 , v9, p5
32
p2
v4
p3
p5
ymax
p0
v9
v2
p1
ymin
with vertices: (p0, v1, v2, p1, p2, v5, p3, p4, v9, p5)
33
v5
v1
p2
xmin
xmax
p4
p3
p5
p0
p9
v9
p6
v2
p7
p1
Input vertex list: = (p0, v1, v2, p1, p2, v5, p3, p4, v9, p5)
Output vertex list: (p0, p6, p7, v2, p1, p8, p9, p3, p4, v9, p5)
34
v5
v1
p8
p2
xmax
p4
p3
p5
p0
p9
v9
p6
v2
p7
pv13
p8
Output vertex list: (p0, p6, p7, v2, p1, p8, p9, p3, p4, v9, p5)
Post-process: (p0, p6, p9, p3,) and (p7, v2, p1, p8) and (v4, v9, p5)
35