- 117 Views
- Uploaded on
- Presentation posted in: General

Clipping Lines

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Clipping Lines

Lecture 7

Wed, Sep 10, 2003

- From time to time we will discuss the graphics pipeline.
- The graphics pipeline is the sequence of operations that are performed on primitives to render them on the screen as collections of colored pixels.
- We have discussed the framebuffer.
- Now we will discuss 2-dimensional clipping of lines.

- Any object that is not entirely within the viewport must be clipped.
- That is, the part that is outside the viewport must be eliminated before the object is drawn.
- The graphics pipeline, does this “automatically.”
- Why is it necessary to clip?

- If a line is partially in the viewport, then we need to recalculate its endpoints.
- In general, there are four possible cases.
- The line is entirely within the viewport.
- The line is entirely outside the viewport.
- One endpoint is in and the other is out.
- Both endpoints are out, but the middle part is in.

C

B

D

E

A

G

F

H

- Before clipping

C

B

D

E

A

F'

G

F

G'

H'

H

- After clipping

ymax

ymin

xmax

xmin

- Let the x-coordinates of the window boundaries be xmin and xmax and let the y-coordinates be ymin and ymax.

- For each endpoint p of a line segment we will define a codeword c3c2c1c0 consisting of 4 true/false values.
- c3 = true, if p is left of the window.
- c2 = true, if p is above the window.
- c1 = true, if p is right of the window.
- c0 = true, if p is below the window.

- How many different values are possible for a codeword?

- How many different combinations of values are possible for the codewords of the two endpoints of a segment?
- How do we compute a codeword?

- Consider the vertical edge x = xmin. (You can do the other edges.)
- Compare the x-coordinate of p to xmin.
- If it is less, then “set” bit 3 of the codeword.

if (p.x < xmin)

c = 1 << 3;

- After the codewords for both endpoints are computed, we divide the possibilities into three cases:
- Trivial accept – both codewords are FFFF.
- Trivial reject – both codewords have T in the same position.
- Indeterminate so far – Investigate further.

- What is the quickest way to separate the cases?
- Use bitwise “and” and “or.”

- If ((codeword1 | codeword2) == 0) then we trivially accept.
- Why?

- If ((codeword1 & codeword2) != 0) then we trivially reject.
- Why?

- What about the third case?
- We clip against each edge of the window, in sequence, as necessary.
- After clipping against an edge, we may test again for trivial acceptance or trivial rejection before moving on to the next edge.

clip

clip

clip

clip

- This raises some questions?
- What is the worst case?
- What is the best case?
- How do we decide whether to clip against a particular edge?
- If we do clip, how to we determine the new endpoint?

- Consider again the vertical edge x = xmin. (You can do the other edges.)
- Compute codeword1 ^ codeword2.
- This shows where they disagree.
- Why?

- “And” this with (1 << 3).
- If result = 1, then clip.
- Else do not clip.

- If we clip, then the new point will be on the line x = xmin.
- So its x-coordinate will be xmin.
- We must calculate its y-coordinate.

x = xmin

q

r

p

x = xmin

q

r

p

x = xmin

q

q.y – p.y

r

r.y – p.y

p

xmin – p.x

q.x – p.x

- Then
(r.y – p.y)/(xmin – p.x) = (q.y – p.y)/(q.x – p.x)

- So
r.y = p.y + (xmin – p.x)(q.y – p.y)/(q.x – p.x)

- This used to be done in software.
- Now it is done in hardware, in the graphics pipeline.
- Should it be done before or after the line is rasterized?
- We will discuss clipping polygons and clipping in 3D later.

- LineClipper.cpp