Khoa CNTT-DDHBK Hà nội<br />
Email: hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
Nội dung<br />
<br />
Các giải thuật cơ sở<br />
<br />
Bài 3<br />
<br />
Các giải thuật xén tỉa - Clipping<br />
z Các thuật toán tô miền kín<br />
z Phép xử lý Antialiasing<br />
z<br />
<br />
Le Tan Hung<br />
hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
2<br />
<br />
1<br />
<br />
Xén tỉa - Clipping<br />
<br />
Clipping đoạn thẳng<br />
<br />
Khái niệm<br />
Xén tỉa là tiến trình tự động xác định<br />
các điểm của 1 đối tượng nằm trong<br />
hay ngoài cửa sổ hiển thị<br />
Tiết kiệm thời gian tiến trình rasterize<br />
bỏ qua phần nằm ngoài cửa sổ hiển<br />
thị<br />
ymax<br />
Clipping điểm<br />
xmin ≤ x ≤ xmax<br />
ymin ≤ y ≤ ymax<br />
<br />
z<br />
<br />
Tiến trình, giải thuật kiểm tra chấp nhận các<br />
đoạn thẳng nằm trong và loại bỏ các đoạn thẳng<br />
nằm ngoài dựa trên 2 điểm đầu cuối<br />
Lý do:<br />
Không kiểm tra mọi điểm trên đoạn thẳng<br />
Hầu hết các đoạn thẳng với 1 màn hình hiển thị<br />
đều được chấp nhận hoặc loại bỏ<br />
Rất ít các đợn thẳng cắt cửa sổ hiển thị<br />
<br />
Giải thuật Cohen-Sutherland<br />
thực hiện nhanh với các trương<br />
hợp đoạn thẳng nằm trong hay<br />
ngoài cửa sổ hiện thị<br />
<br />
z<br />
<br />
If P1.code OR P2.code == 0000<br />
<br />
z<br />
<br />
If P1.code AND P2.code != 0000<br />
<br />
z<br />
<br />
Mỗi điểm đầu cuối được gán mã<br />
code phụ thuộc vào vị trí trong<br />
mặt phẳng mã<br />
<br />
z<br />
<br />
z<br />
<br />
p.code = 0000<br />
If p.x > P.code or 0001<br />
If p.y > P.code or 0100<br />
If p.x >= xmax >> P.code or 0010<br />
If p.y >= ymax >> P.code or 1000<br />
<br />
z<br />
<br />
z<br />
<br />
z<br />
<br />
z<br />
<br />
xmin<br />
<br />
z<br />
<br />
xmax<br />
<br />
z<br />
z<br />
<br />
ymin<br />
<br />
3<br />
<br />
4<br />
<br />
Giải thuật Cohen Sutherland Outcode<br />
z<br />
<br />
z<br />
z<br />
z<br />
z<br />
<br />
5<br />
<br />
–<br />
<br />
Chấp nhận toàn đoạn thẳng<br />
<br />
– Loại<br />
Với truờng hợp cắt, giải thuật xác định lại<br />
điểm đầu cuối là giao của đoạn thẳng và<br />
khung bao của cửa sổ hiển thị<br />
<br />
6<br />
<br />
1<br />
<br />
Khoa CNTT-DDHBK Hà nội<br />
Email: hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
Liabarsky<br />
<br />
z<br />
<br />
x = x1 + (x2 - x1)u = x1 + uDx<br />
y = y1 + (y2 - y1)u = y1 + uDy<br />
xmin ≤ x1 + Dx.u ≤ xmax ⇔ x ∈ [xm, xM]<br />
ymin ≤ y1 + Dy.u ≤ ymax ⇔ y ∈ [ym, yM]<br />
<br />
z<br />
<br />
Pk u ≤ qk<br />
<br />
z<br />
z<br />
z<br />
<br />
z<br />
<br />
k = 1, 2, 3, 4<br />
<br />
⎧q1 = x1 − xm<br />
⎪q = x − x<br />
⎪ 2<br />
M<br />
1<br />
⎨<br />
⎪q3 = y1 − ym<br />
⎪⎩q4 = y M − y1<br />
<br />
z<br />
<br />
⎧<br />
⎪<br />
⎪<br />
⎨<br />
⎪<br />
⎪⎩<br />
<br />
P1 = − Dx<br />
<br />
z<br />
<br />
P 2 = Dx<br />
<br />
Nếu Pk = 0 : điều đó tương đương với việc đoạn thẳng<br />
đang xét song song với cạnh thứ k của hình chữ nhật<br />
clipping.<br />
a) Nếu qk < 0 ⇒ Đường thẳng nằm ngoài cửa sổ (hệ bất<br />
phương trình trên vô nghiệm)<br />
b)Nếu qk >= 0 thì đoạn thẳng nằm trong hoặc nằm trên<br />
cạnh của cửa sổ clipping.<br />
Hệ bất phương trình luôn thoả mãn.<br />
<br />
P 3 = − Dy<br />
P 4 = Dy<br />
<br />
7<br />
<br />
8<br />
<br />
z<br />
<br />
9<br />
<br />
z<br />
<br />
Nếu Pk ≠ 0 : đoạn thẳng đang xét sẽ cắt cạnh k tương ứng<br />
của cửa sổ clipping tại vị trí trên đoạn thẳng uk = qk/Pk.<br />
– Pk < 0 đoạn thẳng có dạng đi từ ngoài vào trong<br />
z bất phương trình sẽ có dạng u ≥ qk/Pk Ù u ≥ uk.<br />
– Pk > 0<br />
z u ≥ uk sẽ thuộc cửa sổ hiển thị.<br />
z bất phương trình sẽ có dạng u ≤ qk/Pk<br />
z u ≤ uk với uk = qk/Pk là giao của đoạn thẳng với<br />
cạnh k của cửa sổ clipping<br />
z đoạn thẳng có dạng đi từ trong ra ngoài so với cạnh<br />
k.<br />
<br />
z<br />
<br />
Pk < 0 và uk < 0<br />
–<br />
–<br />
<br />
–<br />
<br />
cạnh k của cửa sổ clipping cắt đoạn thẳng tại phần mở rộng<br />
nằm ngoài đoạn thẳng.<br />
uk ≤ u< 0 thoả mãn bất phương trình sẽ không nằm trên đoạn<br />
thẳng cần xét.<br />
=> uk sẽ nhận là 0 khi uk 0 và uk > 1<br />
<br />
z<br />
<br />
điểm nằm trong cửa sổ clipping sẽ có dạng như sau:<br />
<br />
–<br />
<br />
–<br />
<br />
=> uk tương ứng sẽ nhận giá trị 1.<br />
U 1 ≤ u ≤ U2<br />
<br />
10<br />
<br />
Sutherland-Hodgman Clipping<br />
z<br />
<br />
–<br />
<br />
⎛<br />
⎧<br />
⎫⎞<br />
q<br />
U 2 = min⎜ {1}∪ ⎨u k : u k = k , Pk > 0 ⎬ ⎟<br />
⎜<br />
⎟<br />
Pk<br />
⎩<br />
⎭⎠<br />
⎝<br />
⎛<br />
⎧<br />
⎫⎞<br />
q<br />
U 1 = max ⎜ {0}∪ ⎨u k : u k = k , Pk < 0 ⎬ ⎟<br />
⎜<br />
⎟<br />
Pk<br />
⎩<br />
⎭⎠<br />
⎝<br />
11<br />
<br />
Basic idea:<br />
–<br />
–<br />
<br />
Consider each edge of the viewport individually<br />
Clip the polygon against the edge equation<br />
After doing all planes, the polygon is fully clipped<br />
<br />
12<br />
<br />
2<br />
<br />
Khoa CNTT-DDHBK Hà nội<br />
Email: hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
Sutherland-Hodgman Clipping<br />
z<br />
<br />
Input/output for algorithm:<br />
–<br />
–<br />
<br />
z<br />
<br />
Sutherland-Hodgman Clipping<br />
z<br />
<br />
Input: list of polygon vertices in order<br />
Output: list of clipped poygon vertices consisting of<br />
old vertices (maybe) and new vertices (maybe)<br />
<br />
Sutherland-Hodgman basic routine:<br />
–<br />
–<br />
–<br />
<br />
Note: this is exactly what we expect from the<br />
clipping operation against each edge<br />
<br />
13<br />
<br />
Go around polygon one vertex at a time<br />
Current vertex has position p<br />
Previous vertex had position s, and it has been added<br />
to the output if appropriate<br />
<br />
14<br />
<br />
Sutherland-Hodgman Clipping<br />
z<br />
<br />
Sutherland-Hodgman Clipping<br />
<br />
Edge from s to p takes one of four cases:<br />
<br />
z<br />
<br />
(Purple line can be a line or a plane)<br />
inside<br />
<br />
outside<br />
<br />
inside<br />
<br />
outside<br />
<br />
inside<br />
<br />
Four cases:<br />
–<br />
<br />
outside<br />
<br />
p<br />
s<br />
<br />
inside<br />
<br />
p<br />
<br />
s inside plane and p inside plane<br />
z<br />
<br />
outside<br />
<br />
z<br />
<br />
s<br />
<br />
–<br />
<br />
s inside plane and p outside plane<br />
z<br />
z<br />
<br />
p<br />
<br />
s<br />
<br />
p output<br />
<br />
i output<br />
<br />
no output<br />
<br />
–<br />
<br />
s outside plane and p inside plane<br />
z<br />
<br />
i output<br />
p output<br />
<br />
z<br />
<br />
Add nothing<br />
Find intersection point i<br />
Add i to output, followed by p<br />
<br />
16<br />
<br />
Giải thuật Cyrus-Beck<br />
Liang Barsky<br />
z<br />
z<br />
z<br />
z<br />
<br />
17<br />
<br />
s outside plane and p outside plane<br />
z<br />
<br />
15<br />
<br />
Find intersection point i<br />
Add i to output<br />
<br />
–<br />
<br />
s<br />
<br />
p<br />
<br />
Add p to output<br />
Note: s has already been added<br />
<br />
3-D Clipping<br />
<br />
Giải Cohen-Sutherland yêu cầu cửa sổ là hình chữ<br />
nhật, các cạnh là cạnh của màn hình<br />
Vấn đề nảy sinh khi cửa sổ clip là 1 đa giác bất kỳ<br />
hoặc hình chữ nhật quay đi 1 góc<br />
Giải thuật Liang-Barsky tối ưu khi tìm giao điểm của<br />
đoạn thẳng với cử sổ hiển thị<br />
Nicholl-Lee-Nicholl reducing redundant boundary<br />
clipping by identifying edge and corner regions<br />
<br />
z<br />
z<br />
<br />
Before actually drawing on the screen, we have<br />
to clip (Why?)<br />
Can we transform to screen coordinates first,<br />
then clip in 2D?<br />
–<br />
<br />
Correctness: shouldn’t draw objects behind viewer<br />
(what will an object with negative z coordinates do in<br />
our perspective matrix?) (draw it…)<br />
<br />
18<br />
<br />
3<br />
<br />
Khoa CNTT-DDHBK Hà nội<br />
Email: hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
Giải thuật đường biên (Boundary - File<br />
Algorithm)<br />
<br />
Edge Walking<br />
z<br />
<br />
z Giải_thuật_đường_biên ( x, y )<br />
Color : biến mầu<br />
Begin<br />
Color = Readpixel ( x, y );<br />
If ( Color = mầu tô ) or ( Color = mầu đường biên )<br />
Kết thúc vì chạm biên<br />
hoặc chạm phần đã tô<br />
Else<br />
Putcolor(x,y, mauto)<br />
Giải_thuật_đường_biên ( x+1, y );<br />
Giải_thuật_đường_biên ( x-1, y );<br />
Giải_thuật_đường_biên ( x, y+1 );<br />
Giải_thuật_đường_biên ( x, y-1 );<br />
// Thực hiện lại giải thuật với các điểm lân cận<br />
End.<br />
<br />
19<br />
<br />
–<br />
–<br />
–<br />
–<br />
<br />
Draw edges vertically<br />
Fill in horizontal spans for each scanline<br />
Interpolate colors down edges<br />
At each scanline, interpolate<br />
edge colors across span<br />
<br />
20<br />
<br />
Edge Walking: Notes<br />
z<br />
z<br />
<br />
–<br />
<br />
z<br />
<br />
z<br />
<br />
Fractional offsets:<br />
<br />
z<br />
<br />
Be careful when interpolating color values!<br />
Also: beware gaps between adjacent edges<br />
<br />
3 cases: break left, break right, no break<br />
<br />
Walk down left and right edges<br />
–<br />
<br />
z<br />
<br />
Edge Walking: Notes<br />
<br />
Order vertices in x and y<br />
–<br />
<br />
Fill each span<br />
Until breakpoint or bottom vertex is reached<br />
<br />
Advantage: can be made very fast<br />
Disadvantages:<br />
–<br />
–<br />
–<br />
<br />
Lots of finicky special cases<br />
Tough to get right<br />
Need to pay attention to fractional offsets<br />
<br />
z<br />
21<br />
<br />
22<br />
<br />
Giải thuật đường quét<br />
Scan-Line Algorithm<br />
z<br />
<br />
The scan-line algorithm uses edge-coherence and<br />
incremental integer calculations for maximum efficiency:<br />
–<br />
–<br />
<br />
z<br />
z<br />
z<br />
<br />
23<br />
<br />
Basic idea:<br />
<br />
Edge Table (ET)<br />
(0,0)<br />
<br />
Tạo bảng edge table (ET) tập của các cạnh đa giác theo thứ tự<br />
giá trị ymin của chúng<br />
Tạo bảng active edge table (AET) tập các cạnh giao vớI đoạn<br />
thẳng quét scan-line<br />
<br />
Trong tiến trình quét các cạnh sẽ chuyển từ ET ra AET.<br />
Các cạnh sẽ ở trong AET cho đến khi giá trị ymax của<br />
cạnh đạt tới = scanline<br />
Lúc nay cạnh sẽ bị loại ra khỏi AET.<br />
<br />
ymax<br />
<br />
xmin<br />
<br />
numerator<br />
1 −3<br />
⇒ =<br />
denominator m 5<br />
<br />
(15,15)<br />
scan-line<br />
Note: line (8,6) → (13,6) has been deleted according to the scan rules<br />
<br />
24<br />
<br />
4<br />
<br />
Khoa CNTT-DDHBK Hà nội<br />
Email: hunglt@it-hut.edu.vn<br />
0913030731<br />
<br />
Active Edge Table (AET)<br />
<br />
Giải thuật dòng quét-Scanline cho việc tô mầu vùng<br />
<br />
round down<br />
<br />
round down<br />
<br />
round up<br />
<br />
round up<br />
<br />
AET =<br />
<br />
AET =<br />
<br />
25<br />
<br />
yma<br />
<br />
current x denominator current numerator<br />
<br />
ymax<br />
<br />
26<br />
<br />
current numerator<br />
current x denominator<br />
<br />
x<br />
<br />
Scan-Line Algorithm<br />
<br />
Rasterizing Triangles<br />
z<br />
<br />
y = y of first non empty entry in ET<br />
AET = null<br />
repeat<br />
move all ET entries in slot y to AET<br />
sort AET entries according to xmin<br />
fill spans using pairs of AET entries<br />
for all AET members<br />
if ymax = y then remove from AET<br />
y = y+1<br />
for all AET members<br />
update numerator<br />
if numerator>denominator<br />
numerator=numerator-denominator<br />
x = x+1<br />
until AET and ET empty<br />
<br />
27<br />
<br />
z<br />
<br />
Interactive graphics hardware commonly uses<br />
edge walking or edge equation techniques for<br />
rasterizing triangles<br />
Two techniques we won’t talk about much:<br />
–<br />
–<br />
<br />
Recursive subdivision of primitive into micropolygons<br />
(REYES, Renderman)<br />
Recursive subdivision of screen (Warnock)<br />
<br />
28<br />
<br />
Recursive Triangle Subdivision<br />
<br />
Edge Equations<br />
z<br />
<br />
An edge equation is simply the equation of the<br />
line containing that edge<br />
–<br />
–<br />
–<br />
–<br />
<br />
Q: What is the equation of a 2D line?<br />
A: Ax + By + C = 0<br />
Q: Given a point (x,y), what does plugging x & y into<br />
this equation tell us?<br />
A: Whether the point is:<br />
z<br />
z<br />
z<br />
<br />
29<br />
<br />
On the line: Ax + By + C = 0<br />
“Above” the line: Ax + By + C > 0<br />
“Below” the line: Ax + By + C < 0<br />
<br />
30<br />
<br />
5<br />
<br />