Tải bản đầy đủ (.pdf) (7 trang)

Bài giải bài tập Đồ họa máy tính tut7

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (453.09 KB, 7 trang )

SOLUTION TUT 7

Câu I:
(left, right, bottom, top) = (30, 220, 50, 240)
Bảng outcode:



1. p1 = (40, 140), p2 = (100, 200)
//Compute Out Code
p1: outcode1 = 0000 p2: outcode2 = 0000
Bước 1: outcode1 | outcode2 = 0000
 Đoạn thẳng p1p2 thuộc vùng nhìn thấy.

2. p1 = (10, 270), p2 = (300, 0)
//Compute Out Code
p1: outcode1 = 1001 p2: outcode2 = 0110
Bước 1: outcode1 | outcode2 = 1111
Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 1000
Tính giao điểm:

x = x1 + (x2 – x1) * (top – y1) / (y2 – y1)
= 10 + (300-10) * (240 – 270) / (0 – 270) =42.22
y = top = 240
outcode của giao điểm: 0000
// Gán p1= p2(300,0) ; p2 = (x ,y)= (42.22 ,240)
// Lặp
p1: outcode1 = 0110 p2: outcode2 = 0000
Bước 1: outcode1 | outcode2 = 0110


Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 0000
outcode1 & 0100 = 0100
Tính giao điểm:

x = x1 + (x2 – x1) * (bottom – y1) / (y2 – y1);
= 300 + (42.22-300) * (50 – 0) / (240 – 0)
= 246.29
y = bottom = 50
outcode của giao điểm: 0010
// Gán p1= (x ,y)= (246.29 ,50) ; p2 =(42.22 ,240)
// Lặp
p1: outcode1 = 0010 p2: outcode2 = 0000
Bước 1: outcode1 | outcode2 = 0010
Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 0000
outcode1 & 0100 = 0000
outcode1 & 0010 = 0010
Tính giao điểm:
y = y1 + (y2 – y1) * (right – x1) / (x2 – x1)
= 50 + (240 – 50) * (220 – 246.29) / (42.22-246.29)
= 74.48
x = right = 220;
outcode của giao điểm: 0000
Out code của p2 : 0000
 Đoạn nằm trong khung nhìn (42.22 ,240) (220,74.48)

3. p1 = (20, 10), p2 = (20, 200)

//Compute Out Code
p1: outcode1 = 0101 p2: outcode2 = 0001
Bước 1: outcode1 | outcode2 = 0101
Bước 2: outcode1 & outcode2 = 0001
 Toàn bộ nằm ngoài khung nhìn.


4. p1 = (0, 0), p2 = (250, 250)
//Compute Out Code
p1: outcode1 = 0101 p2: outcode2 = 1010
Bước 1: outcode1 | outcode2 = 1111
Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 0000
outcode1 & 0100 = 0100
Tính giao điểm:

x = x1 + (x2 – x1) * (bottom – y1) / (y2 – y1);
= 0 + (250-0) * (50 – 0) / (250 – 0)
= 50
y = bottom = 50
outcode của giao điểm: 0000
// Gán p1= (x ,y)= (250 ,250) ; p2 =(50,50)
// Lặp
p1: outcode1 = 1010 p2: outcode2 = 0000
Bước 1: outcode1 | outcode2 = 1010
Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 1000
Tính giao điểm:


x = x1 + (x2 – x1) * (top – y1) / (y2 – y1)
= 250 + (50-250) * (240 – 250) / (50 – 250) = 240
y = top = 240
outcode của giao điểm: 0010
// Gán p1= (x ,y)= (240 ,240) ; p2 =(50,50)
// Lặp
p1: outcode1 = 0010 p2: outcode2 = 0000
Bước 1: outcode1 | outcode2 = 0010
Bước 2: outcode1 & outcode2 = 0000
 Giao một phần.
Bước 3: outcode1 & 1000 = 0000
outcode1 & 0100 = 0000
outcode1 & 0010 = 0010
Tính giao điểm:
y = y1 + (y2 – y1) * (right – x1) / (x2 – x1)
= 240 + (50 – 240) * (220 – 240) / (50-240)
= 220
x = right = 220;
outcode của giao điểm: 0000
outcode của p2: 0000
 Đoạn nằm trong khung nhìn (50,50) (220,220)
Câu II:
Chạy từng bước giải thuật Bresenham để sinh ra vị trí các pixel dọc theo đoạn thẳng đi qua 2
điểm trên màn hình:
a. (2, 1) và (3, 7).
dx = 1
dy = 6
//dx <dy hoán đổi vai trò x,y
e_noinc = 2dx = 2

e = 2dx-dy = -4
e_inc = 2dx – 2dy = -10
x = 2
//lặp y từ 1 đến 7
// sau lần lặp đầu tiên
Chọn điểm ( 2, 1)
x = 2 ; e = -2
// sau lần lặp thứ 2: y= 2
Chọn điểm (2, 2)
x = 2 ; e = 0
// sau lần lặp thứ 3: y= 3
Chọn điểm (2, 3)
// e >= 0 nên x++; e = e + e_inc
x = 3 ; e = -10
// sau lần lặp thứ 4: y= 4
Chọn điểm (3, 4)
x = 3 ; e = -8
// sau lần lặp thứ 5: y= 5
Chọn điểm (3, 5)
x = 3 ; e = -6
// sau lần lặp thứ 6: y= 6
Chọn điểm (3 ,6)
x = 3 ; e = -4
// sau lần lặp thứ 7: y= 7
Chọn điểm (3, 7)
//kết thúc
b. (1, 1) và (7, 5).
dx = 6
dy = 4
// dx > dy

e_noinc = 2dy = 8
e = 2dy-dx = 2
e_inc = 2dy – 2dx = -4
y = 1
//lặp x từ 1 đến 7
// sau lần lặp thứ 2: x= 1
Chọn điểm (1, 1)
// e >= 0 nên y++; e = e + e_inc
y = 2 ; e = -2
// sau lần lặp thứ 2: x= 2
Chọn điểm (2, 2)
// e < 0 nên e = e + e_noinc
y = 2 ; e = 6
// sau lần lặp thứ 3: y= 3
Chọn điểm (3,2)
// e >= 0 nên y++; e = e + e_inc
y = 3 ; e = 2
// sau lần lặp thứ 4: x= 4
Chọn điểm (4, 3)
// e >= 0 nên y++; e = e + e_inc
y = 4 ; e = -2
// sau lần lặp thứ 5: x= 5
Chọn điểm (5, 4)
y = 4 ; e = 6
// sau lần lặp thứ 6: x= 6
Chọn điểm (6 ,3)
y = 5 ; e = 2
// sau lần lặp thứ 7: x= 7
Chọn điểm (7, 5)
//kết thúc



Câu III :
Cho đa giác ABCDEF có tọa độ các đỉnh như sau:
A = (2, 1); B = (6, 1); C = (7, 3); D = (6, 7); E = (4, 3); F = (2, 4)
Người ta dùng phương pháp đường quét để tô màu cho đa giác này
1) Hãy xây dựng bảng cạnh (Edge Table) cho đa giác này.
2) Hãy cho biết AEL (Active Edge List) tại các scan line y =1, y = 2, y = 3 và y = 4.


1) Edge table

Line 1


Line 2

Line 3




4
2
0

2
6
1/2


4
4
-2

7
4
1/2

7
7
-1/4

A B
C
D
E
F
0
1
2
3
4
5
6
7
8
0 1 2 3 4 5 6 7 8
Y-Values
Y-Values



Line 4
Line 5
Line 6
Line 7
2) AEL (Active Edge List)

Scan line y =1



Scan line y =2




Scan line y = 3
















Scan line y = 4










Câu IV:
Đọc trang 357 trong cuốn sách “Interactive Computer Graphics – A Top-Down Approach
Using OpenGL”.
4
2
0

2
6
1/2

4
2
0

2
6.5

1/2

4
2
0

2
7
1/2

4
2
0

4
4
-2

7
4
1/2

7
7
-1/4

4
2
0


4
2
-2

7
4.5
1/2

7
6.75
-1/4

Loại bỏ
Thêm

Hãy chạy thử giải thuật tô màu flood_fill bằng tay cho vùng mà phần bên trong của nó
được định nghĩa bởi các pixel (1, 1), (2, 1), (2, 2), (3, 2), (2, 3) và (1, 3). Chọn pixel ở vị trí (2, 2)
làm hạt giống.
Hãy viết lại giải thuật này và chạy bằng tay trong trường hợp vùng được định nghĩa là 8-
kết nối và thứ tự của bốn lời gọi hàm cho các pixel lân cận nằm trên đường chéo của pixel đang
xét lần lượt là (x – 1, y – 1), (x + 1, y – 1), (x – 1, y + 1) và (x + 1, y + 1).

Chạy tay flood_fill (Four-way)
flood_fill(int x, int y)
{
if (read_pixel(x,y) == WHITE)
{
write_pixel(x,y,BLACK);
flood_fill(x-1,y);
flood_fill(x+1,y);

flood_fill(x,y-1);
flood_fill(x,y+1);
}
}

Thứ tự cách pixel được tô:
(2, 2)  (3,2)  (2,1)  (1,1)  (2,3)  (1,3)

flood_fill (Eight-way)
flood_fill(int x, int y)
{
if (read_pixel(x,y) == WHITE)
{
write_pixel(x,y,BLACK);
flood_fill(x-1,y);
flood_fill(x+1,y);
flood_fill(x,y-1);
flood_fill(x,y+1);

flood_fill(x-1,y-1);
flood_fill(x+1,y-1);
flood_fill(x-1,y+1);
flood_fill(x+1,y+1);

}
}
Thứ tự cách pixel được tô:
(2, 2)  (3,2)  (2,1)  (1,1)  (2,3)  (1,3)


×