You are on page 1of 144

CÁC GIẢI THUẬT SINH

THỰC THỂ CƠ SỞ
ĐOÀN VŨ THỊNH
BỘ MÔN KỸ THUẬT PHẦN MỀM, KHOA CÔNG NGHỆ THÔNG TIN
ĐẠI HỌC NHA TRANG (2019)
2.1. GIỚI THIỆU

• Bất kì một ảnh mô tả thế giới thực nào bao giờ cũng được cấu trúc từ tập các đối
tượng đơn giản hơn. Ví dụ một ảnh thể hiện bài trí của một căn phòng sẽ được
cấu trúc từ các đối tượng như cây cảnh, tủ kính, bàn ghế, tường, ánh sáng đèn
• Với các ảnh đồ họa phát sinh bằng máy tính, hình dạng và màu sắc của mỗi đối
tượng có thể được mô tả riêng biệt bằng hai cách:
Hoặc là bằng dãy các pixel tương ứng
Hoặc là bằng tập các đối tượng hình học cơ sở như đoạn thẳng hay đa giác.
• Sau đó, các ảnh hiển thị bằng cách nạp các pixel vào vùng bộ nhớ màn hình.
2.1. GIỚI THIỆU (tt)

• Với các ảnh được mô tả bằng các đối tượng hình học
cơ sở, cần có một quá trình chuyển các đối tượng này
về dạng ma trận các pixel trước. Quá trình này còn
được gọi là quá trình chuyển đổi bằng dòng quét.

• Đối tượng đồ họa cơ sở đơn giản nhất là điểm và đoạn thẳng, ngoài ra còn
có đường tròn, và các đường conics, mặt bậc hai, các mặt và đường
splines, các vùng tô đa giác, chuỗi kí tự…
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.2.1. Hệ đồ hoạ thế giới thực và hệ đồ hoạ thiết bị y

• Hệ tọa độ thế giới thực (hay hệ tọa độ thực) là hệ tọa độ được Pwc(x,y)
y
dùng mô tả các đối tượng thế giới thực.
• Một trong các hệ tọa độ thực thường được dùng nhất đó là hệ tọa
0 x x
độ Descartes (x, y ∈ R)
• Gốc tọa độ là điểm O có tọa độ (0, 0). Ox, Oy lần lượt được gọi là
trục hoành, trục tung;

• x là khoảng cách từ điểm đến trục hoành hay còn được gọi là hoành độ, y là
khoảng cách từ điểm đến trục tung hay còn được gọi là tung độ.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
0 x
xmax
• 2.2.1. Hệ đồ hoạ thế giới thực và hệ đồ hoạ thiết bị (tt)

• Các điểm trong hệ tọa độ thiết bị cũng được mô tả bởi một PDC(x,y)

cặp tọa độ (x, y ∈ N). Do đó, các điểm trong các hệ tọa độ
ymax
thiết bị là rời rạc do tính chất của tập các số tự nhiên. y

• Các tọa độ x, y của hệ tọa độ thiết bị không thể lớn tùy ý mà đều bị giới hạn trong

một khoảng nào đó. Khoảng giới hạn các tọa độ x, y là khác nhau đối với từng loại

thiết bị khác nhau.


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.2. Biểu diễn điểm và đoạn thẳng

• Điểm

Điểm là thành phần cơ sở được định nghĩa trong một hệ tọa độ.

Đối với hệ tọa độ hai chiều mỗi điểm được xác định bởi cặp tọa

độ (x, y). Ngoài thông tin về tọa độ, điểm còn có thuộc tính là

màu sắc.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.2. Biểu diễn điểm và đoạn thẳng (tt)


• Đoạn thẳng
Một đường thẳng có thể xác định nếu biết hai điểm thuộc nó. Phương trình đường

thẳng đi qua hai điểm (x1, y1) và (x2, y2) có dạng sau:

• Hay ở dạng tương đương: (x − x1)(y2 − y1) = (y − y1)(x2 − x1)


• Khai triển ta có dạng: y = mx + b, trong đó:

 Dy=(y2-y1) Dx=(x2-x1) b=y1-mx1


• Đây còn được gọi là phương trình đoạn thẳng của đường thẳng.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.2. Biểu diễn điểm và đoạn thẳng (tt)

• Đoạn thẳng (tt)

Nếu khai triển dưới dạng: (y2 − y1)x − (x2 − x1)y − x1y2 + x2y1 = 0

và đặt A= y2 − y1, B = −(x2 − x1), C = x2y1 − x1y2 thì phương trình đường thẳng sẽ có dạng

Ax + By + C = 0, dạng này được gọi là phương trình tổng quát của đường thẳng.
• Phương trình tham số của đường thẳng có dạng các tọa độ x, y được mô tả qua một

thành phần thứ ba là t. Dạng này rất thuận tiện khi khảo sát các đoạn thẳng.t

− 0 1 +

8
8
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.2. Biểu diễn điểm và đoạn thẳng (tt)

• Đường gấp khúc

• Là tập các đoạn thẳng nối với nhau một cách tuần tự.

Điểm giao của hai đoạn thẳng được gọi là đỉnh. Các

đường gấp khúc được xác định qua danh sách các đỉnh,

mỗi đỉnh được cho bởi các cặp tọa độ (xi, yi).

• Một đa giác là một đường gấp khúc có điểm đầu và điểm

cuối trùng nhau


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.2. Biểu diễn điểm và đoạn thẳng (tt)


• Các thuộc tính của đoạn thẳng
 Màu sắc
 Độ rộng của nét vẽ
 Kiểu nét vẽ của đoạn thẳng
• Đối với đường gấp khúc, các đoạn thẳng trong cùng một đường gấp
khúc thì có cùng một thuộc tính.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.2. Biểu diễn điểm và đoạn thẳng (tt)


• Vùng tô
Một vùng tô bao gồm đường biên và vùng bên trong. Đường
biên là một đường khép kín ví dụ như đa giác.
• Các thuộc tính của vùng tô bao gồm:
Thuộc tính của đường biên: chính là các thuộc tính như
thuộc tính của đoạn thẳng.
Thuộc tính của vùng bên trong: gồm màu tô và mẫu tô.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật vẽ đoạn thẳng thông thường
Giả sử tọa độ các điểm nguyên sau khi xấp xỉ đối tượng thực lần lượt là (xi,

yi), i = 0,1,2,.... Đây là các điểm nguyên sẽ được hiển thị trên màn hình.

• Bài toán đặt ra là nếu biết được (xi, yi) là tọa độ nguyên xác định ở bước thứ

i, điểm nguyên tiếp theo (xi+1, yi+1) sẽ được xác định như thế nào?
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

8 Line: (3,2) -> (9,6)


7
6
5 ? pixels nào sẽ được bật lên?
4
3
2
1
0 1 2 3 4 5 6 7 8 9 10 11
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật vẽ đoạn thẳng thông thường
4 3 2
• Nhận xét rằng để đối tượng hiển thị trên lưới nguyên được liền nét,
5 1
các điểm mà (xi+1,yi+1) có thể chọn chỉ là một trong tám điểm được
đánh số từ 1 đến 8 (điểm đen chính là (xi,yi). Hay nói cách khác: 6 7 8

(xi+1,yi +1) = (xi±1,yi±1).


• Dáng điệu của đường sẽ cho ta gợi ý khi chọn 1 trong 8 điểm trên.
Cách chọn các điểm như thế nào sẽ tùy thuộc vào từng thuật toán
trên cơ sở xem xét tới vấn đề tối ưu tốc độ.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật vẽ đoạn thẳng thông thường
• Cho phương trình đường thẳng y = mx + b
 Với (x0,y0) là tọa độ điểm đầu, (x1, y1) là tọa độ điểm cuối, xác định m và b?
dy y1  y 0
 Ta có: m  dx  x1  x0 (x1,y1)
dy
b  y 0  m * x0
(x0,y0)
dx
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật vẽ đoạn thẳng thông thường
• Cho ví dụ sau để xác định hệ số góc m: (Ax, Ay) = (23, 41), (Bx, By) = (125, 96)
Ta có:

By  Ay 96  41 55
m    0.5392
Bx  Ax 125  23 102
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

 Cho đường thẳng xuất phát từ điểm có tọa độ x0, y0


 x và y tăng dần theo hệ số trong khoảng 0 – 1
 Từ kết quả của công thức xác định m, ta nhận thấy.
(x1,y1)
 Nếu x tăng nhanh hơn y: m<1
dy
 x=x+1, tính toán và làm tròn y theo x (x0,y0)
dx
 Ngược lại: m>1
 y=y+1, tính toán và làm tròn x theo y
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
(xi+1,yi+1)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt) 2
yi
• Giải thuật vẽ đoạn thẳng thông thường 1
• Xét đoạn thẳng có hệ số góc 0 < m < 1 và Dx > 0 (xi+1,yi)
xi

• Với các đoạn thẳng dạng này, nếu (xi, yi) là điểm đã xác định

được ở bước thứ i (điểm màu đen) thì điểm cần chọn (xi+1,yi+1)

ở bước thứ (i+1) sẽ là một trong hai trường hợp như hình bên:
• Như vậy:
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở


• Thuật toán DDA (Digital Differential Analizer) (xi+1,Round(y))

• Với thuật toán DDA, việc quyết định chọn yi+1 là yi hay
(xi+1,y)
yi+1, dựa vào phương trình của đoạn thẳng y = mx+b.
(xi,yi)

• Tọa độ của điểm (xi+1,y) thuộc về đoạn thẳng thực.

• yi+1 sẽ là giá trị sau khi làm tròn giá trị tung độ y.
{ 𝑦=𝑚 ( 𝑥 𝑖 +1 ) +𝑏
𝑦 𝑖 +1=𝑅𝑜𝑢𝑛𝑑 ( 𝑦 )
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Thuật toán DDA (Digital Differential Analizer) (tt)
• Nếu tính trực tiếp giá trị thực y ở mỗi bước từ phương trình y = mx + b thì phải cần một phép
toán nhân và một phép toán cộng số thực.
• Để cải thiện tốc độ, người ta tính giá trị thực của y ở mỗi bước theo cách sau để khử phép
tính nhân trên số thực:
• Nhận xét rằng:
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
y k 1  y k  m
(x2,y2)
x = x1 y = y1

Bật pixel (x, round(y))

x = x1 + 1 y = y1 + 1 * m

0<m<1
Bật pixel (x, round(y))

x=x+1 y=y+1*m

Bật pixel (x, round(y))


(x1, y1)
Cho đến khi x == x2
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
1 (x2,y2)
x k 1  xk  x = x1 y = y1
m
Bật pixel (round(x), y)

y = y1 + 1 x = x1 + 1 * 1/m

1<m Bật pixel (round(x), y)

y=y+1 x = x + 1 /m

Bật pixel (round(x), y)


(x1,y1) Cho đến khi y == y2
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(2,3) và B(12,8) trình bày các bước vẽ đường thẳng đi
từ A đến B
8
7 Line: (2,3) -> (12,8)
6 ?
5
4 pixels nào sẽ được bật lên?
3
2
1

0 1 2 3 4 5 6 7 8 9 10 11
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(2,3) và B(12,8) trình bày các bước vẽ đường thẳng đi
từ A đến B
By  Ay 8  3 5
8 m    0.5(0  m  1)
7 Bx  Ax 12  2 10
6 y k 1  y k  m
5 x = xA= 2 y = yA=3
4 x = xA+1= 3 y = yA + 1 * m = 3+1*0.5 = 3.5 (~4)
3 x = x+1= 4 y = y + 1 * m = 3.5+1*0.5 = 4
2 x = x+1= 5 y = y + 1 * m = 4+1*0.5 = 4.5 (~5)

1 x = x+1= 6 y = y + 1 * m = 4.5+1*0.5 = 5

0 1 2 3 4 5 6 7 8 9 10 11
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(2,3) và B(12,8) trình bày các bước vẽ đường thẳng đi
từ A đến B
By  Ay 8  3 5
8 m    0.5(0  m  1)
7 Bx  Ax 12  2 10
6 y k 1  y k  m
5 x = x+1= 7 y = y + 1 * m = 5+1*0.5 = 5.5 (~6)
4 x = x+1= 8 y = y + 1 * m = 5.5+1*0.5 = 6
3 x = x+1= 9 y = y + 1 * m = 6+1*0.5 = 6.5 (~7)
x = x+1= 10 y = y + 1 * m = 6.5+1*0.5 = 7
2
x = x+1= 11 y = y + 1 * m = 7+1*0.5 = 7.5 (~8)
1 x = x+1= 12 y = y + 1 * m = 7.5+1*0.5 = 8

0 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(12,8) và B(2,3) trình bày các bước vẽ đường thẳng đi
từ A đến B By  Ay 3  8 5
yk 1  yk  m x  1 m    0.5 (0  m  1)
Bx  Ax 2  12  10
x=x-1= 11 y=y-m= 7,5 (~8) 12
11
x=x-1= 10 y=y-m= 7
10
x=x-1= 9 y=y-m= 6,5 (~7) 9
x=x-1= 8 y=y-m= 6 8
x=x-1= 7 y=y-m= 5,5 (~6) 7
6
x=x-1= 6 y=y-m= 5 5
x=x-1= 5 y=y-m= 4,5 (~5) 4
x=x-1= 4 y=y-m= 4 3
2
x=x-1= 3 y=y-m= 3,5 (~4)
1
x=x-1= 2 y=y-m= 3 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(3,2) và B(8,12) trình bày các bước vẽ đường thẳng đi
từ A đến B By  Ay 12  2 10
m    2( m  1)
1 Bx  Ax 83 5
xk 1  xk  y  y 1 12
m 11
y = y+1= 3 x = x + 1 / m = 3+1/2 = 3.5 (~4)
10
y = y+1= 4 x = x + 1 / m = 3.5+1/2 = 4 9
y = y+1= 5 x = x + 1 / m = 4+1/2 = 4.5 (~5) 8
y = y+1= 6 x = x+ 1 / m = 4.5+1/2 = 5 7
6
y = y+1= 7 x = x + 1 / m = 5+1/2 = 5.5 (~6)
5
y= y+1= 8 x = x + 1 /m = 6.5+1/2 = 6
4
y= y+1= 9 x = x + 1 /m = 6+1/2 = 6.5 (~7) 3
y= y+1= 10 x = x + 1 /m = 6.5+1/2 = 7 2
y= y+1= 11 x = x + 1 /m = 7+1/2 = 7.5 (~8) 1
y= y+1= 12 x = x + 1 /m = 7.5+1/2 = 8 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(8,12) và B(3,2) trình bày các bước vẽ đường thẳng đi
từ A đến B 1 By  Ay 2  12  10
xk 1  xk  y  1 m     2 (m  1)
m Bx  Ax 3  8 5
y=y-1= 11 x=x-1/m= 7,5 (~8) 12
11
y=y-1= 10 x=x-1/m= 7
10
y=y-1= 9 x=x-1/m= 6,5 (~7) 9
y=y-1= 8 x=x-1/m= 6 8
y=y-1= 7 x=x-1/m= 5,5 (~6) 7
6
y=y-1= 6 x=x-1/m= 5 5
y=y-1= 5 x=x-1/m= 4,5 (~5) 4
y=y-1= 4 x=x-1/m= 4 3
y=y-1= 3 x=x-1/m= 3,5 (~4) 2
1
y=y-1= 2 x=x-1/m= 3 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(2,8) và B(12,3) trình bày các bước vẽ đường thẳng đi
từ A đến B By  Ay 38 5
yk 1  yk  m x  1 m    0.5 (0 | m | 1)
Bx  Ax 12  2 10
x=x+1= 3 y=y+m= 7,5 (~8) 12
11
x=x+1= 4 x=x-1/m= 7
10
x=x+1= 5 x=x-1/m= 6,5 (~7) 9
x=x+1= 6 x=x-1/m= 6 8
x=x+1= 7 x=x-1/m= 5,5 (~6) 7
6
x=x+1= 8 x=x-1/m= 5 5
x=x+1= 9 x=x-1/m= 4,5 (~5) 4
x=x+1= 10 x=x-1/m= 4 3
2
x=x+1= 11 x=x-1/m= 3,5 (~4)
1
x=x+1= 12 x=x-1/m= 3 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(12,3) và B(2,8) trình bày các bước vẽ đường thẳng đi
từ A đến B By  Ay 8  3 5
yk 1  yk  m x  1 m    0.5 (0 | m | 1)
Bx  Ax 2  12  10
x=x-1= 11 y=y-m= 3,5 (~4) 12
x=x+1= 10 y=y-m= 4 4 11
10
x=x+1= 9 y=y-m= 4,5 (~5) 9
x=x+1= 8 y=y-m= 5 5 8
x=x+1= 7 y=y-m= 5,5 (~6) 7
6
x=x+1= 6 y=y-m= 6 6
5
x=x+1= 5 y=y-m= 6,5 (~7) 4
x=x+1= 4 y=y-m= 7 7 3
x=x+1= 3 y=y-m= 7,5 (~8) 2
1
x=x+1= 2 y=y-m= 8 8
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(3,12) và B(8,2) trình bày các bước vẽ đường thẳng đi
từ A đến B 1 By  Ay 2  12  10
xk 1  xk  y  1 m     2 (| m | 1)
m Bx  Ax 8  3 5
y=y-1= 11 x=x-1/m= 3,5 (~4) 12
y=y-1= 10 x=x-1/m= 4 4 11
10
y=y-1= 9 x=x-1/m= 4,5 (~5) 9
y=y-1= 8 x=x-1/m= 5 5 8
y=y-1= 7 x=x-1/m= 5,5 (~6) 7
6
y=y-1= 6 x=x-1/m= 6 6 5
y=y-1= 5 x=x-1/m= 6,5 (~7) 4
y=y-1= 4 x=x-1/m= 7 7 3
2
y=y-1= 3 x=x-1/m= 7,5 (~8) 1
y=y-1= 2 x=x-1/m= 8 8 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(8,2) và B(3,12) trình bày các bước vẽ đường thẳng đi
từ A đến B 1 By  Ay 12  2 10
xk 1  xk  y  1 m    2 (| m | 1)
y=y+1= 3 x=x+1/m= 7,5 (~8)
m Bx  Ax 3  8  5
12
y=y+1= 4 x=x+1/m= 7 7
11
y=y+1= 5 x=x+1/m= 6,5 (~7) 10
y=y+1= 6 x=x+1/m= 6 6 9
8
y=y+1= 7 x=x+1/m= 5,5 (~6) 7
y=y+1= 8 x=x+1/m= 5 5 6
5
y=y+1= 9 x=x+1/m= 4,5 (~5)
4
y=y+1= 10 x=x+1/m= 4 4 3
y=y+1= 11 x=x+1/m= 3,5 (~4) 2
1
y=y+1= 12 x=x+1/m= 3 3 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

Tóm lại, thuật toán DDA được mô tả theo 8 trường hợp như sau:
1. (xa<xb;ya<yb;dy<dx): 0<m<1 yk 1  yk  m x  x  1
yk 1  yk  m x  x  1
2. (xa>xb;ya>yb;|dy|<|dx|): 0<|m|<1 1
3. (xa<xb;ya<yb;dy>dx): m>1 xk 1  xk  y  y 1 1
m xk 1  xk  y  y 1
4. (xa>xb;ya>yb;|dy|>|dx|): |m|>1 m
5. (xa<xb;ya>yb;|dx|<dy): 0<|m|<1 yk 1  yk  m x  x  1
6. (xa>xb;ya<yb;dx>|dy|): 0<|m|<1 yk 1  yk  m x  x  1
1
7. (xa<xb;ya>yb;dy<|dx|): |m|>1 xk 1  xk  m y  y  1 1
xk 1  xk  y  y 1
8. (xa>xb;ya<yb;dy>|dx|): |m|>1 m
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Begin
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
m=Dy/Dx
• Thuật toán DDA (Digital Differential Analizer) (tt) x=x1
#define Round(a) int(a+0.5) y=y1
int Color = GREEN; putpixel(x,y,color)
void LineDDA(int x1, int y1, int x2, int
y2)
{
int x = x1; x<x2
No
float y = y1;
float m = float(y2-y1)/(x2-x1);
Yes
putpixel(x, Round(y), Color);
for(int i=x1; i<x2; i++) x=x+1
{ y=y+m
x++;
y+=m;
putpixel(x,round(y),color)
putpixel(x,Round(y),Color);
}
} // LineDDA End
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Thuật toán DDA (Digital Differential Analizer)
• Open Source:
https://github.com/thinhdoanvu/ComputerGraphics/tree/master/Coding/LineAlgorithm
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)

• Giải thuật Bresenham

• Jack Elton Bresenham (11/10/1937, Clovis, New Mexico, Hoa Kỳ) là cựu giáo sư khoa học máy tính.

Ông từng làm việc trong phòng thí nghiệm tính toán tại phòng thí nghiệm phát triển San Jose của

IBM. Thuật toán được sử dụng cho máy vẽ Calcomp kết nối với IBM 1401 thông qua bảng điều

khiển máy của đánh chữ 1407 vào năm 1962. Thuật toán của ông sau đó đã được mở rộng để xây

dựng đường tròn (Bresenham's midpoint circle algorithm). Thuật toán Bresenham sử dụng hầu hết

trong sản phẩm phần cứng như máy vẽ và trong chip đồ họa của card đồ họa hiện đại và trong

nhiều thư viện phần mềm đồ họa.


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật Bresenham (tt)
• Thuật toán Bresenham đưa ra cách chọn yi+1 là yi hay yi+1 theo một
hướng khác sao cho có thể tối ưu hóa về mặt tốc độ so với thuật toán
DDA. Vấn đề mấu chốt ở đây là làm thế nào để hạn chế tối đa các phép
toán trên số thực.
• Gọi P (xi+1, y) là điểm thuộc đoạn thẳng.

• Ta có: y = m(xi+1) + b
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• Giải thuật Bresenham (tt)
yi+1 P
• Đặt d1=y-yi và d2=yi+1-y d2
y
• Xét tất cả các vị trí tương đối của y so với yi và yi+1, việc chọn d1
y S
điểm (xi+1, yi+1) là S hay P phụ thuộc vào việc dấu của (d1−d2): i

xi xi+1
• Nếu (d1−d2) < 0, điểm S được chọn, tức là yi+1=yi . Ngược lại, ta chọn điểm P, tức yi+1 = yi+1.

• Xét pi = Dx(d1−d2) = Dx(2y−2yi − 1) ⇒ pi = Dx [2(m (xi+1)+ b) − 2yi−1]

• Thay vào phương trình trên ta được: pi = 2Dyxi − 2Dxyi + c , với c = 2Dy + (2b − 1)Dx
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật Bresenham (tt)
• Nhận xét rằng do Dx > 0 nên dấu của biểu thức (d1−d2) cũng chính là dấu của pi. Hay nói
cách khác, nếu tại bước thứ i ta xác định được dấu của pi thì xem như xác định được
điểm cần chọn ở bước (i+1). Vấn đề còn lại là làm thế nào để tính được pi tại mỗi bước
thật nhanh.
• Ta có: pi+1 − pi = (2Dyxi+1 − 2Dxyi+1 + c) − (2Dyxi − 2Dxyi + c)
⇔ pi+1 − pi = 2Dy (xi+1 − xi) − 2Dx (yi+1 − yi)
⇔ pi+1 − pi = 2Dy − 2Dx (yi+1 − yi), do xi+1 = xi + 1
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)

• Giải thuật Bresenham (tt) yi+1 P


d2
y
• Từ đây ta có thể suy ra cách tính pi+1 từ pi như sau: d1
y S
i
Nếu pi < 0 thì pi+1 = pi + 2Dy do ta chọn yi+1 = yi.
xi xi+1

• Ngược lại, nếu pi ≥ 0 , thì pi+1 = pi + 2Dy − 2Dx, do ta chọn yi+1 = yi + 1


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)

• Giải thuật Bresenham (tt)

• Giá trị p0 được tính từ điểm vẽ đầu tiên (x0, y0) theo công thức:

p0 = 2Dyx0 − 2Dxy0 + c = 2Dyx0 − 2Dxy0 + 2Dy+(2b − 1)Dx

• Do (x0, y0) là điểm nguyên thuộc về đoạn thẳng nên ta có: y0 = mx0 + b = x0+b.

• Thế vào phương trình trên ta suy ra: p0 = 2Dy − Dx


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Begin
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
p=Dy-2Dx
const1=2Dy
• Giải thuật Bresenham for(i=x1; i<x2; i++) const2=2(Dy-Dx)
x=x1
{ y=y1
putpixel(x,y,color)
void LineBres (int x1, int y1, int x2, int y2) if (p<0)
{ { No
int Dx, Dy, p, Const1, Const2; p += 2*Dy; x<x2
int x, y;
} Yes
Dx = x2 - x1;
Dy = y2 - y1; else
p<0
p = 2*Dy - Dx; // (Dy <<1) - Dx {
Const1 = 2*Dy; // Dy <<1 p += 2*(Dy-Dx); Yes
No
Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1 y++; p=p+const1
x = x1; }
y = y1; x++;
p=p+const2
y=y+1
putpixel(x, y, Color);
putpixel(x, y, Color);
x=x+1
} putpixel(x,y,color)
} // LineBres
End
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• Bài tập áp dụng:
• Sử dụng thuật toán Bresenham trình bày các bước vẽ đường thẳng đi qua 2
điểm A (30,20), B(40, 28).
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• dy = yB – yA = 28 – 20 = 8 K Pk (Xk+1, Yk+1)

• dx = xB – xA = 40 – 30 = 10 0 6 (31,21)
1 2 (32,22)
• m = 0.8 (0<m<1)
2 -2 (33,22)
• Tính toán giá trị P0:
3 14 (34,23)
• P0= 2dy – dx = 2(8) – 10 = 6 (>0) 4 10 (35,24)
• Hằng số 2dy và 2dy-2dx: 5 6 36,25
 2dy = 2(8) = 16 6 2 37,26
 2dy-2dx = 2(8)- 2(10) =16 – 20 = -4
7 -2 38,26
• Pk+1= Pk+2dy-2dx= 6-4 =2 (>0) 8 14 39,27
• Pk+1= Pk+2dy-2dx= 2-4 =-2 (<0) 9 10 40,28
• Pk+1= Pk+2dy =-2+16 = 14 (>0)
• Pk+1= Pk+2dy-2dx= 14-4 =10 (>0)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
K Pk (Xk+1, Yk+1)
• Pk+1= Pk+2dy-2dx= 10-4 =6 (>0) 0 6 (31,21)
• Pk+1= Pk+2dy-2dx =6-4 = 2 (>0) 1 2 (32,22)
2 -2 (33,22)
• Pk+1= Pk+2dy-2dx= 2-4 =-2 (<0)
3 14 (34,23)
• Pk+1= Pk+2dy = -2+16 =14 (>0)
4 10 (35,24)
• Pk+1= Pk+2dy-2dx= 14-4 = 10 (>0) 5 6 (36,25)
6 2 (37,26)
7 -2 (38,26)
8 14 (39,27)
9 10 (40,28)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(3,2) và B(8,12) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 3 xB 8 dx 5 2dx-2dy -10 m=2
yA 2 yB 12 dy 10 2dx 10 đổi y thành x

12
K Cal Pk (Xk+1, Yk+1)
11
0 2dx-dy 0 4,3
10
p0>0 1 p0+2(dx-dy) -10 4,4 9
p1<0 2 p1+2dx 0 5,5 8
p2>0 3 p2+2(dx-dy) -10 5,6 m>1 7
p3<0 4 p3+2dx 0 6,7 TF 6
p4>0 5
5 p4+2(dx-dy) -10 6,8
4
p5<0 6 p5+2dx 0 7,9 3
p6>0 7 p6+2(dx-dy) -10 7.10 2
p7<0 8 p7+2dx 0 8,11 1
p8>0 9 p8+2(dx-dy) -10 8,12 1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Ta có: y = m(xi-1) + b 0<m<1; y biến thiên theo x (Dx) do x >> nhanh hơn y

• Đặt d1= y - yi và d2= yi+1 - y

• Xét pi = Dx(d1−d2) = Dx(2y - 2yi + 1). Vì yi+1 = yi -1

• ⇒ pi = Dx {2[m (xi-1)+ b]- 2yi+1}

• Thay vào phương trình trên ta được: y P


d1
0<m<1 yi
• pi = 2Dyxi - 2Dy + 2bDx - 2Dxyi + Dx d2
FT S
yi-1
• pi = 2Dyxi - 2Dxyi + c , với c = (2b + 1)Dx - 2Dy

• pi+1 − pi = (2Dyxi+1 - 2Dxyi+1 + c) − (2Dyxi - 2Dxyi + c)


⇔ pi+1 − pi = 2Dy (xi+1 − xi) - 2Dx (yi+1 - yi) xi-1 xi
⇔ pi+1 − pi = - 2Dx (yi+1 − yi) - 2Dy, do xi+1 = xi - 1
Dx<0  (d1-d2)<0 thì pi>0, chọn S
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Từ đây ta có thể suy ra cách tính pi+1 như sau:

• Từ pi+1 − pi = - 2Dx (yi+1 − yi) - 2Dy

Nếu pi >= 0 thì pi+1 = pi - 2Dy + 2Dx do ta chọn yi+1 = yi-1, có nghĩa x=x-1 và y=y-1

• Ngược lại, nếu pi< 0 , thì pi+1 = pi - 2Dy, do ta chọn yi+1 = yi


y P
• Giá trị p0 được tính từ điểm vẽ đầu tiên (x0, y0) theo công thức: d1
i
y
d2
pi = 2Dyxi - 2Dy + 2bDx - 2Dxyi + Dx = 2Dyx0 - 2Dxy0 + (2b + 1)Dx - 2Dy yi-1 S
• Do (x0, y0) là điểm nguyên thuộc về đoạn thẳng nên ta có:

• y0 = mx0 + b = x0+b. xi-1 xi


• Thế vào phương trình trên ta suy ra: p0 = Dx - 2Dy
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(12,8) và B(2,3) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 12 xB 2 dx -10 2dx-2dy -10 m=0,5
yA 8 yB 3 dy -5 2dy -10
K Cal Pk (Xk-1 , Yk-1) 12
p0 0 dx-2dy 5 11;7 11
p0>0 1 p0-2dy+2dx -5 10;7 10
p1<0 2 p1-2dy 5 9;6 9
p2>0 3 p2-2dy+2dx -5 8;6 8
p3<0 4 p3-2dy 5 7;5
0<m<1 7
p4>0 5 p4-2dy+2dx -5 6;5 FT 6
p5<0 6 p5-2dy 5 5;4 5
p6>0 7 p6-2dy+2dx -5 4;4 4
p7<0 8 p7-2dy 5 3;3 3
p8>0 9 p8-2dy+2dx -5 2;3 2
if (p>0; x--;y--) else(x--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(8,12) và B(3,2) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 8 xB 3 dx -5 2dy-2dx -10 m=2
yA 12 yB 2 dy -10 2dx -10 đổi vai trò x,y
K Cal Pk (Xk-1 , Yk-1)
p0 0 dx-2dy 0 8;11 12
p0<=0 1 p0-2dx 10 7;10 11
p1>0 2 p1-2dx+2dy 0 7;9 10
p2<=0 3 p2-2dx 10 6;8 9
p3>0 4 p3-2dx+2dy 0 6;7
8 m>1
7
p4<=0 5 p4-2dx 10 5;6 FT
6
p5>0 6 p5-2dx+2dy 0 5;5 5
p6<=0 7 p6-2dx 10 4;4 4
p7>0 8 p7-2dx+2dy 0 4;3 3
p8<=0 9 p8-2dx 10 3;2 2
if (p>0; x--;y--) else(y--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Ta có: y = m(xi+1) + b 0<|m|<1; y biến thiên theo x (Dx) do x >> nhanh hơn y

• Đặt d1= y - yi và d2= yi+1 - y

• Xét pi = Dx(d1−d2) = Dx(2y - 2yi + 1). Vì yi+1 = yi -1

• ⇒ pi = Dx {2[m (xi+1)+ b] - 2yi +1} y P


d1
0<|m|<1 i
y
• Thay vào phương trình trên ta được: TF d2
yi-1 S
• pi = -2Dxyi + 2Dyxi + 2Dy + 2bDx + Dx

• pi+1 − pi = -2Dx(yi+1 - yi) +2Dy(xi+1 - xi) xi xi+1


⇔ pi+1 − pi = -2Dx (yi+1 − yi) + 2Dy, do xi+1 = xi + 1 Dx>0  (|d1|-|d2|)<0 thì chọn S (pi<0)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Từ đây ta có thể suy ra cách tính pi+1 như sau:

• Từ pi+1 − pi = -2Dx (yi+1 − yi) + 2Dy

Nếu pi  0 thì pi+1 = pi + 2Dy + 2Dx do ta chọn yi+1 = yi-1, có nghĩa x=x+1 và y=y-1

• Ngược lại, nếu pi> 0 , thì pi+1 = pi + 2Dy, do ta chọn yi+1 = yi


y P
• Giá trị p0 được tính từ điểm vẽ đầu tiên (x0, y0) theo công thức: d1
i
y
d2
pi = -2Dxyi + 2Dyxi + 2Dy + 2bDx + Dx yi-1 S

• Do (x0, y0) là điểm nguyên thuộc về đoạn thẳng nên ta có:

• y0 = mx0 + b = x0+b. xi xi+1


• Thế vào phương trình trên ta suy ra: p0 = Dx+2Dy
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(12,8) và B(2,3) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 2 xB 12 dx 10 2dx+2dy 10 m=-0,5
yA 8 yB 3 dy -5 2dy -10
K Cal Pk Yk-1 Xk+1 12
p0 0 dx+2dy 0 7 3 11
p0<=0 1 p0+2dx+2dy 10 7 4 10
p1>0 2 p1+2dy 0 6 5 9
p2<=0 3 p2+2dx+2dy 10 6 6 8
p3>0 4 p3+2dy 0 5 7 0<|m|<1 7
p4<=0 8 6
5 p4+2dx+2dy 10 5 TF
p5>0 6 p5+2dy 0 4 9 5
p6<=0 7 p6+2dx+2dy 10 4 10 4
p7>0 8 p7+2dy 0 3 11 3
p8<=0 9 p8+2dx+2dy 10 3 12 2
if (p<=0; x++;y--) else(x++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Bài tập: cho tọa điểm A(3,12) và B(8, 2) trình bày các bước vẽ đường thẳng đi
từ A đến B xA 3 xB 8 dx 5 2dy+2dx -10 m=-2
yA 12 yB 2 dy -10 2dx 10 đổi vai trò x,y
K Cal Pk Xk-1 Yk-1 12
11
p0 0 dx-2dy 0 4 11
10
p0<=0 1 p0+2dx 10 4 10 9
p1>0 2 p1+2dx+2dy 0 5 9 8
p2<=0 3 p2+2dx 10 5 8 7
p3>0 4 p3+2dx+2dy 0 6 7 |m|>1 6
p4<=0 5 p4+2dx 10 6 6 TF 5
p5>0 5 4
6 p5+2dx+2dy 0 7
p6<=0 3
7 p6+2dx 10 7 4
2
p7>0 8 p7+2dx+2dy 0 8 3 1
p8<=0 9 p8+2dx 10 8 2 1 2 3 4 5 6 7 8 9 10 11 12
if (p<=0; x++;y--) else(y--)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Ta có: y = m(xi-1) + b 0<|m|<1; y biến thiên theo x (Dx) do x >> nhanh hơn y

• Đặt d1= yi+1 -y và d2= y - yi

• Xét pi = Dx(d1−d2) = Dx(2yi - 2y + 1). Vì yi+1 = yi +1

• ⇒ pi = Dx {2yi - 2[m (xi-1)+ b] + 1} yi+1 P


d1
0<|m|<1
y
• Thay vào phương trình trên ta được: FT d2
yi S
• pi = 2Dxyi - 2Dyxi + 2Dy - 2bDx + Dx

• pi+1 − pi = 2Dx(yi+1 - yi) - 2Dy(xi+1 - xi) xi-1 xi


⇔ pi+1 − pi = 2Dy + 2Dx (yi+1 − yi) , do xi+1 = xi - 1 Dx<0  (|d1|-|d2|)<0 thì chọn P (pi>0)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Từ đây ta có thể suy ra cách tính pi+1 như sau:

• Từ pi+1 − pi = 2Dy + 2Dx (yi+1 − yi)

Nếu pi 0 thì pi+1 = pi + 2Dy do ta chọn yi+1 = yi, có nghĩa x=x-1 và y=y-1

• Ngược lại, nếu pi< 0 , thì pi+1 = pi + 2Dx + 2Dy, do ta chọn yi+1 = yi +1
yi+1 P
• Giá trị p0 được tính từ điểm vẽ đầu tiên (x0, y0) theo công thức: d1
y
d2
pi = 2Dxyi - 2Dyxi + 2Dy - 2bDx + Dx yi S
0<|m|<1
• Do (x0, y0) là điểm nguyên thuộc về đoạn thẳng nên ta có: FT
• y0 = mx0 + b = x0+b. xi-1 xi
• Thế vào phương trình trên ta suy ra: p0 = Dx+2Dy
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(12,8) và B(2,3) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 12 xB 2 dx -10 2dy+2dx -10 m=-0.5
yA 3 yB 8 dy 5 2dy 10
K Cal Pk Yk-1 Xk-1
p0 12
0 dx+2dy 0 4 11
p0<=0 11
1 p0+2dy+2dx 10 4 10
10
p1>0 2 p1+2dy 0 5 9
9
p2<=0 3 p2+2dy+2dx 10 5 8
8
p3>0 4 p3+2dy 0 6 7 0<|m|<1 7
p4<=0 5 p4+2dy+2dx 10 6 6 FT 6
p5>0 6 p5+2dy 0 7 5 5
p6<=0 7 p6+2dy+2dx 10 7 4 4
p7>0 8 p7+2dy 0 8 3 3
p8<=0 9 p8+2dy+2dx 10 8 2 2
if (p<=0; x--;y++) else(x--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• Bài tập: cho tọa điểm A(12,8) và B(2,3) trình bày các bước vẽ đường thẳng đi từ A đến B
xA 8 xB 3 dx -5 2dx+2dy 10 m=-2
yA 2 yB 12 dy 10 2dx -10 đổi vai trò x,y
K Cal Pk Yk+1 Xk-1
12
p0 0 2dx+dy 0 3 7
11
p0<=0 1 p0+2dx+2dy 10 4 7
10
p1>0 2 p1+2dx -10 5 6 9
p2<=0 3 p2+2dx+2dy 0 6 5 8
p3<=0 4 p3+2dx+2dy 10 7 5 |m|>1 7
p4>0 5 p4+2dx 0 8 4 FT 6
p5<=0 6 p5+2dx+2dy 10 9 4 5
p6>0 7 p6+2dx 0 10 3 4
p7<=0 8 p7+2dx+2dy 10 11 3 3
p8>0 9 p8+2dx 0 12 2 2
if (p<=0; x--;y++) else(y++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Thuật toán Bresenham
• Open Source:
https://github.com/thinhdoanvu/ComputerGraphics/tree/master/Coding/LineAlgorithm
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• Các việc cần bổ sung:


 Khi Ax > Bx (hoán đổi d1 và d2)
 Đường thẳng có độ dốc lớn (thay vai trò x và y)
 Đường thẳng có độ dốc âm (x++, yi+1=yi hoặc yi-1)
 Đường thẳng đứng hoặc nằm ngang (a.x = b.x bỏ qua)
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật trung điểm (Midpoint)
yi+1 P
Q(xi+1,y)
• Thuật toán MidPoint đưa ra cách chọn yi+1 là yi hay yi+1 bằng Midpoint
(xi+1,yi+1/2)
yi S
cách so sánh điểm thực Q(xi+1,y) với điểm MidPoint là trung
xi xi+1
điểm của S và P. Ta có:
• Nếu điểm Q nằm dưới điểm MidPoint, ta chọn S.
• Ngược lại nếu điểm Q nằm trên điểm MidPoint ta chọn P.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)

• Giải thuật trung điểm (Midpoint) (tt)

• Ta có dạng tổng quát của phương trình đường thẳng:

Ax + By + C = 0, với A= y2 − y1, B = −(x2 − x1),C = x2y1 − x1y2


• Đặt f(x,y ) = Ax + By + C, ta có nhận xét:

[
¿ 0 ,𝑛ế 𝑢 ( 𝑥 , 𝑦 ) 𝑛ằ 𝑚 𝑝h í 𝑎𝑡𝑟 ê 𝑛đườ 𝑛𝑔 𝑡h ẳ𝑛𝑔
𝑓 (𝑥 , 𝑦 ) ¿ 0 ,𝑛ế 𝑢 ( 𝑥 , 𝑦 ) 𝑡h𝑢ộ 𝑐 đườ 𝑛𝑔 𝑡h ẳ 𝑛𝑔
¿ 0 , 𝑛ế 𝑢 ( 𝑥 , 𝑦 ) 𝑛 ằ 𝑚 𝑝h í 𝑎 𝑑ướ 𝑖 đườ 𝑛𝑔 𝑡h ẳ 𝑛𝑔
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)

• Giải thuật trung điểm (Midpoint) (tt)


yi+1 P
Q(xi+1,y)
• Lúc này việc chọn các điểm S, P ở trên được đưa về việc xét dấu của Midpoint
(xi+1,yi+1/2)
yi S
• pi = f(midpoint) = f(xi+1,yi+)
xi xi+1
• Nếu pi < 0, điểm MidPoint nằm phía trên đoạn thẳng. Lúc này điểm thực Q nằm
dưới điểm MidPoint nên ta chọn S, tức là yi+1 = yi.

• Ngược lại, nếu pi ≥ 0 , điểm MidPoint nằm phía dưới đoạn thẳng. Lúc này điểm
thực Q nằm trên điểm MidPoint nên ta chọn P, tức là yi+1 = yi+1.
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật trung điểm (Midpoint) (tt) pi>0
yi+1 P
• Mặt khác: pi+1 – pi = f(xi+1+1,yi+1+
yi S
pi<0
• pi+1 – pi = [A(xi+1+1)+B(yi+1+)+C] - [A(xi+1)+B(yi+)+C]
xi xi+1
• pi+1 – pi = A(xi+1 - xi) + B(yi+1 - yi)

• Vậy:pi+1 = pi + Dy, nếu pi < 0, do ta chọn S: yi+1 = yi

• pi+1 = pi + Dy − Dx, nếu pi ≥ 0 do ta chọn P: yi+1 = y i+1


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)

• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)


• Giải thuật trung điểm (Midpoint) (tt)
• Ta tính giá trị p0 ứng với điểm ban đầu (x0, y0), với nhận xét rằng:

• (x0, y0) là điểm thuộc về đoạn thẳng, tức: Ax0 + By0 + C = 0

• p0 = f(x0+1,y0+

• ⇒ p0 = (Ax0 + By0 + C) + A+ B/2 = A+ B/2 = Dy − Dx/2


2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
Begin
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• Giải thuật trung điểm (Midpoint) (tt) x=x1
y=y1
dx=x2-x1
dy=y2-y1
void Mid_line(int x1, int y1, int x2, int y2, if (p<0) p=dy-dx/2
int c) {
{ p = p + dy; putpixel(x,y,color
int x, y, dx, dy,d; }
y = y1; else p<0
No
p=p+dy-dx
dx = x2 - x1; {
dy = y2 - y1; y ++; Yes
x=x+1 p=p+dy y=y+1
p= dy - dx/2; d = d + dy - dx;
for (x=x1; x<=x2; x++) }
Yes
{ }//end for x<x2
putpixel(x, y, color); }//end midpoint line No
End
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 2 xB= 12 B= -10 m=(dy/dx)=0.5
• Giải thuật trung điểm (Midpoint) yA= 3 yB= 8 A= 5 p0=A+1/2B 0
K Cal Pk Xk+1 Yk+1 12
p0 0 A+B/2 0 3 4 11
p0<=0 1 p0+A+B 5 4 4 10
p1>0 2 p1+A 0 5 5 9
p2<=0 3 p2+A+B 5 6 5 0<m<1 8
p3>0 4 p3+A 0 7 6 7
p4<=0 5 p4+A+B 5 8 6 6
p5>0 6 p5+A 0 9 7 5
p6<=0 7 p6+A+B 5 10 7 4
p7>0 8 p7+A 0 11 8 3
p8<=0 9 p8+A+B 5 12 8 2
if (p<=0; x++;y++) else(x++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 3 xB= 8 B= -5 m=(dy/dx)=2
• Giải thuật trung điểm (Midpoint) yA= 2 yB= 12 A= 10 p0=B+1/2A 0
K Cal Pk Xk+1 Yk+1 12
p0 0 B+A/2 0 3 3 11
p0<=0 1 p0+B+A 5 4 4 10
p1>0 2 p1+B 0 4 5 9
p2<=0 3 p2+B+A 5 5 6 m>1 8
p3>0 4 p3+B 0 5 7 7
p4<=0 5 p4+B+A 5 6 8 6
p5>0 6 p5+B 0 6 9 5
p6<=0 7 p6+B+A 5 7 10 4
p7>0 8 p7+B 0 7 11 3
p8<=0 9 p8+B+A 5 8 12 2
if (p<=0; x++;y++) else(y++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 12 xB= 2 B= 10 m=(dy/dx)=0.5
• Giải thuật trung điểm (Midpoint) yA= 8 yB= 3 A= -5 p0=-A-1/2B 0
K Cal Pk Xk-1 Yk-1 12
p0 0 -A-B/2 0 11 7 11
p0<=0 1 p0-A 5 10 7 10
p1>0 2 p1-A-B 0 9 6 9
p2<=0 3 p2-A 5 8 6 0<m<1 8
p3>0 4 p3-A-B 0 7 5 7
p4<=0 5 p4-A 5 6 5 6
p5>0 6 p5-A-B 0 5 4 5
p6<=0 7 p6-A 5 4 4 4
p7>0 8 p7-A-B 0 3 3 3
p8<=0 9 p8-A 5 2 3 2
if (p<=0; x--;y--) else(x--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 8 xB= 3 B= 5 m=(dy/dx)=2
• Giải thuật trung điểm (Midpoint) yA= 12 yB= 2 A= -10 p0=-B-1/2A 0

K Cal Pk Xk-1 Yk-1 12


p0 0 -B-A/2 0 7 11 11
p0<=0 1 p0-B-A 5 7 10 10
p1>0 2 p1-B 0 6 9 9
p2<=0 3 p0-B-A 5 6 8 m>1 8
p3>0 4 p3-B 0 5 7 7
p4<=0 5 p0-B-A 5 5 6 6
p5>0 6 p5-B 0 4 5 5
p6<=0 7 p0-B-A 5 4 4 4
p7>0 8 p7-B 0 3 3 3
p8<=0 9 p0-B-A 5 3 2 2
if (p<=0; x--;y--) else(y--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 2 xB= 12 B= -10 m=(dy/dx)=-0.5
• Giải thuật trung điểm (Midpoint) yA= 8 yB= 3 A= -5 p0=A-1/2B 0

K Cal Pk Xk+1 Yk-1 12


p0 0 A-B/2 0 3 7 11
p0<=0 1 p0+A-B 5 4 7 10
p1>0 2 p1+A 0 5 6 9
p2<=0 3 p2+A-B 5 6 6 -1<m<0 8
p3>0 4 p3+A 0 7 5 7
p4<=0 5 p4+A-B 5 8 5 6
p5>0 6 p5+A 0 9 4 5
p6<=0 7 p6+A-B 5 10 4 4
p7>0 8 p7+A 0 11 3 3
p8<=0 9 p8+A-B 5 12 3 2
if (p<=0; x++;y--) else(x++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 2 xB= 12 B= -10 m=(dy/dx)=-0.5
• Giải thuật trung điểm (Midpoint) yA= 8 yB= 3 A= -5 p0=A-1/2B 0

K Cal Pk Xk+1 Yk-1 12


p0 0 B-A/2 0 4 11 11
p0<=0 1 p0+B-A 5 4 10 10
p1>0 2 p1+B 0 5 9 9
p2<=0 3 p2+B-A 5 5 8 m<-1 8
p3>0 4 p3+B 0 6 7 7
p4<=0 5 p4+B-A 5 6 6 6
p5>0 6 p5+B 0 7 5 5
p6<=0 7 p6+B-A 5 7 4 4
p7>0 8 p7+B 0 8 3 3
p8<=0 9 p8+B-A 5 8 2 2
if (p<=0; x++;y--) else(y--) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 12 xB= 2 B= 10 m=(dy/dx)=-0.5
• Giải thuật trung điểm (Midpoint) yA= 3 yB= 8 A= 5 p0=-A+1/2B 0
K Cal Pk Xk-1 Yk+1 12
p0 0 -A+B/2 0 11 4 11
p0<=0 1 p0-A+B/2 5 10 4 10
p1>0 2 p1-A 0 9 5 9
p2<=0 3 p2-A+B/2 5 8 5 8
p3>0 4 p3-A 0 7 6 -1<m<0 7
p4<=0 5 p4-A+B/2 5 6 6 6
p5>0 6 p5-A 0 5 7 5
p6<=0 7 p6-A+B/2 5 4 7 4
p7>0 8 p7-A 0 3 8 3
p8<=0 9 p8-A+B/2 5 2 8 2
if (p<=0; x--) else(x--,y++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
xA= 8 xB= 3 B= 5 m=(dy/dx)=-2
• Giải thuật trung điểm (Midpoint) yA= 2 yB= 12 A= 10 p0=-B+1/2A 0
K Cal Pk Xk-1 Yk+1 12
p0 0 -B+A/2 0 7 3 11
p0<=0 1 p0-B+A/2 5 7 4 10
p1>0 2 p1-B 0 6 5 9
p2<=0 3 p2-B+A/2 5 6 6 m<-1 8
p3>0 4 p3-B 0 5 7 7
p4<=0 5 p4-B+A/2 5 5 8 6
p5>0 6 p5-B 0 4 9 5
p6<=0 7 p6-B+A/2 5 4 10 4
p7>0 8 p7-B 0 3 11 3
p8<=0 9 p8-B+A/2 5 3 12 2
if (p<=0; x--;y++) else(y++) 1
1 2 3 4 5 6 7 8 9 10 11 12
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• Giải thuật trung điểm (Midpoint)
• Open Source:
• https://github.com/thinhdoanvu/ComputerGraphics/blob/master/Coding/LineAlgorith
m/Midpoint
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• So sánh DDA và Bresenham
DDA Bresenham
Số học Số thực Số nguyên
Phép toán Nhân và Chia Cộng và Trừ
Tốc độ Chậm hơn Nhanh hơn
Độ chính xác Không bằng Bresenham Chính xác hơn DDA
Hạn chế DDA cho sai số lớn hơn khi áp dụng để vẽ đường cong, đường tròn
Bộ nhớ Tốn bộ nhớ hơn do phải xử lý dấu phẩy động Ít tốn bộ nhớ hơn do chỉ thực
hiện phép toán cộng và trừ
2.2. CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ (tt)
• 2.2.3. Các giải thuật xây dựng thực thể cơ sở (tt)
• Bài tập áp dụng:
• Bài 1. Sử dụng thuật toán Bresenham trình bày các bước vẽ đường
thẳng đi qua 2 điểm A(3,7) và B(9,10).
• Bài 2. Sử dụng thuật toán Midpoint trình bày thứ tự các bước vẽ đường
thẳng đi qua 2 điểm A(4,8) và B(10,12).
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

• Phương trình đường tròn có tâm là gốc tọa độ, bán kính r là:
x2 + y2 = r2 (định lý pithagoras)
• Từ phương trình này ta có thể đưa về dạng

• Để vẽ các đường tròn có tâm (xC,yC) bất kì, đơn giản chỉ cần
tịnh tiến các điểm sau khi vẽ xong đường tròn có tâm là gốc
tọa độ theo vector tịnh tiến (xC, yC)
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)
• Một trong những cách đơn giản nhất là cho x chạy từ 0
đến r, sau đó tính y từ công thức trên (chỉ lấy giá trị >0)
rồi làm tròn để xác định giá trị nguyên tương ứng.
• Cách làm này không hiệu quả do gặp phải các phép
toán nhân và lấy căn bậc 2 làm hạn chế tốc độ, ngoài ra
đường tròn vẽ ra theo cách này có thể không liền nét
(trừ trường hợp R lớn) khi x gần R (do chỉ có một giá trị
y duy nhất cho một giá trị x).
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

R = 10 R = 50 R = 100 R = 1000
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

• Một cách tiếp cận khác là vẽ các điểm (Rcos(θ ), Rsin(θ)), với θ
chạy từ 0 đến 900.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)
 Ta chia đường tròn là làm 8 phần, do tính chất đối xứng của nó.
 Nên khi ta tính toán được 1 điểm có tọa độ x,y đồng nghĩa với việc
ta xác định đầy đủ 8 điểm cho 8 phần như sau:
 putpixel ()  putpixel ()
 putpixel ()  putpixel ()
 putpixel (  putpixel ()
 putpixel ()  putpixel ()
Ta xét các điểm tạo ra từ góc phần tư thứ 2: từ 450 đến 900, thực hiện theo hướng x, y.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

• Đặt .

• Trong đó: f(N) và f(S) gọi là sai số tương quan


d, tham số quyết định
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)
• Áp dụng định lý pithagoras:
• Khi đó các sai số f(S) và f(N) được xác định lại như sau:

• Từ đó:
• Và
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

• Nếu thì N được chọn và

• Nếu thì S được chọn và


CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)

• Từ phương trình:

• Tại điểm d0 có x=0, y=r


CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Bresenham (Scan Converting Circles)
x=0
y=r
d=3-2r

True True
x<y circle(xc,yc,x,y) d<=0 d=d+4x+6

False False

y--
exit
d=d+4x-4y+10

circle(xc,yc,x,y)
x++
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Midpoint
• Do tính đối xứng của đường tròn (C) nên ta chỉ cần vẽ cung (C1/8)
là cung 1/8 đường tròn, sau đó lấy đối xứng. Cung (C1/8) được mô
tả như sau (cung của phần tô màu trong hình vẽ)

• Nếu có (x, y) ∈ (C1/8) thì các điểm: (y,x), (x,-y), (y,-x), (-x,-y), (-y,-x), (-y,x), (-x,y) ∈ (C).
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Midpoint

• Chọn điểm (0,R) bắt đầu để vẽ. Dựa vào hình trên, nếu (xi, yi)
là điểm nguyên đã tìm được ở bước thứ i, thì điểm ( xi+1, yi+1)
ở bước thứ (i+1) là sự lựa chọn giữa S và P.

• Tương tự như thuật toán MidPoint vẽ đoạn thẳng, việc quyết định chọn một trong hai
điểm S và P sẽ được thực hiện thông qua việc xét dấu của một hàm nào đó tại điểm
MidPoint là điểm nằm giữa chúng.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Midpoint
• Đặt f( x, y ) = x2 + y2 − R2, ta có

• Xét

• Nếu pi < 0 , điểm MidPoint nằm trong đường tròn. Lúc này điểm thực Q gần S hơn nên ta
chọn S, tức là yi+1 = yi
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường tròn Midpoint

• Ngược lại, nếu pi ≥ 0, điểm MidPoint nằm ngoài đường tròn. Lúc này điểm
thực Q gần P hơn nên ta chọn P, tức là yi+1 = yi − 1. Mặt khác:

• Do
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường tròn Midpoint
• Vậy:
 , nếu pi < 0 do ta chọn yi+1 = yi.
 , nếu pi ≥ 0 do ta chọn yi+1 = yi−1

• Ta tính giá trị p0 ứng với điểm ban đầu (x0,y0 ) = (0, R).


CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
Begin

• 2.3. Các giải thuật xây dựng thực thể cơ sở p=5/4-R


x=0
• Giải thuật sinh đường tròn Midpoint: Code y=R
put8pixel(x,y,color)

void Put8Pixel(int x, int y)


void CircleMidPoint
{ (int R) else No
putpixel(x, y, Color); { {
x<y

putpixel(y, x, Color); int x, y;


p += 2*(x -y) + 5; Yes
putpixel(y, -x, Color); x = 0;
putpixel(x, -y, Color); y = R;
y--; p<0
No

putpixel(-x, -y, Color); Put8Pixel(x, y); }


Yes
putpixel(-y, -x, Color);
p = 1 - R; // 5/4-R x++; p=p+2*x+3
putpixel(-y, x, Color); Put8Pixel(x, y);
putpixel(-x, y, Color);
while (x < y)
} // Put8Pixel { } p=p+2*(x-y)+5
y=y-1
if (p < 0) } // CircleMidPoint
{ x=x+1
put8pixel(x,y,color)
p += 2*x + 3;
} End
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Ta có: tổng khoảng cách của các tiêu điểm F1 và F2 đến bất
kỳ điểm P (nằm trên cung của Ellipse) đều có cùng giá trị. Hay:

• Trong đó: và
• Nên:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Trong hệ tọa độ Decartes:


• Trong hệ tọa độ cực:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Các tính chất của Ellipse:


(1) Đối xứng qua các góc phần tư
(2) Không đối xứng qua các quãng 8 của các góc phần tư
• Do đó, chúng ta sẽ tính toán các pixel của Ellipse thông qua 1 góc phần tư thứ
nhất. Sau đó, các điểm còn lại của các góc phần tư khác sẽ thực hiện thông qua
các phép đối xứng.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Phương trình Ellipse:

• Hệ số góc:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Bắt đầu tại tâm (0,r), thực hiện dịch chuyển x tăng dần cho đến
khi chạm biên của vùng 1 và vùng 2.
• Sau đó, dịch chuyển y tăng dần từ biên vùng 2 cho đến hết góc
phần tư thứ nhất.
• Tại đường biên:
• Bên ngoài vùng 1:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật Midpoint

• Ta có:
• Nếu , điểm midpoint nằm bên trong Ellipse. Hay S là điểm kế tiếp.
• Ngược lại, điểm midpoint nằm ngoài trong Ellipse. Hay P là điểm kế
tiếp.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Xét trên miền 1:


• Từ pt:

• Hay:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Xét trên miền 1:

TH1. , nếu , hay


TH2. , nếu , hay
• Xác định
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Xét trên miền 2:


• Từ pt:
• Nếu , điểm midpoint nằm bên ngoài ellipse, gần đường biên hơn
• Ngược lại, , điểm midpoint nằm bên trong ellipse, gần đường biên hơn
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Xét trên miền 2:


• Từ pt:
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đường ellipse

• Xét trên miền 2:

TH1. , nếu >0, hay


TH2. , nếu <=0, hay +1
• Xác định
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh đường ellipse
• CODE:
https://github.com/thinhdoanvu/ComputerGraphics/blob/master/Coding/Ellipse/Midpoint
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh ký tự
• Trong màn hình text, truy xuất các ký tự trên màn hình được hỗ trợ bởi phần cứng.
Các ký tự được lưu trữ trong bộ nhớ ROM, dưới dạng bitmap hay các ma trận ảnh.
Phần cứng sẽ đưa ký tự lên màn hình tại ví trí xác định, tính toán cuốn trang và xuống
dòng.
• Trong đồ hoạ:
+ Vector: định nghĩa các ký tự theo những đường cong mềm bao ngoài của chúng:
phức tạp (tính toán phương trình)
lưu trữ gọn nhẹ (các phép biến đổi dựa vào công thức biến đổi)
Kích thước phụ thuộc vào môi trường (không có kích thước cố định)
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Giải thuật sinh ký tự
• Trong đồ hoạ:
• + Bitmap: Mỗi ký tự với 1 font chữ cho trước là 1 ảnh bitmap hình chữ nhật nhỏ.
• Đơn giản trong việc sinh ký tự (copypixel)
• Lưu trữ lớn
• Các phép biến đổi (I,B,U, scale) đòi hỏi lưu trữ thêm
• Kích thước không đổi
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh ký tự
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ

• 2.3. Các giải thuật xây dựng thực thể cơ sở


• Annimation
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đa giác (Polygon)
• Thuật giải vẽ đường bao đa giác:
• Việc biểu diễn đa giác thông qua:
Tập các đoạn thẳng
Tập các điểm thuộc đa giác
• Các loại đa giác:
Đa giác lồi: là đa giác có đường thẳng nối bất ký 2 điểm bên trong nào của đa
giác đều nằm trọn trong đa giác.
Đa giác không lồi là đa giác lõm.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đa giác (Polygon)
• Thuật giải vẽ đường bao đa giác:
• Các đường thẳng bao đa giác - cạnh của đa giác. Các điểm giao của cạnh - đỉnh
của đa giác. Polygon (arrayx, arrayy,n)
{ if (n<3//không phải đa giác
• Thông tin cần thiết để xác định đa giác: exit;
Số cạnh for (i=1 ; i<= n-1; i++)
line(arrayx[i],arrayy[i], arrayx[i+1], arrayy[i+1]);
Toạ độ các đỉnh của đa giác line(arrayx[i+1],arrayy[i+1], arrayx[1], arrayy[1]);
}
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đa giác (Polygon)
• Các thuật toán tô miền kín đa giác:
• Lợi thế của hiển thị raster là: khả năng lưu trữ, copy, tô màu một vùng...Có hai
dạng vùng tô thường gặp đó là:
Tô bằng một màu thuần nhất (solid fill)
Tô theo mẫu tô (fill pattern) nào đó.
• Còn thiết bị vector thì hạn chế do các vùng tô màu tạo ra bởi một tập các đoạn
thẳng sát nhau - làm chậm quá trình làm tươi.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác:
• Thuật toán tô màu Scanline (hay còn gọi là thuật toán tô màu theo dòng quét) được
áp dụng để tô màu các đa giác lồi, lõm hay đa giác tự cắt.
• Với mỗi dòng quét, ta sẽ xác định phần giao của đa giác
và dòng quét, rồi tô màu các pixel thuộc đoạn giao đó.
Để xác định các đoạn giao, ta tiến hành việc tìm giao
điểm của dòng quét với các cạnh của đa giác, sau đó
các giao điểm này sẽ được sắp theo thứ tự tăng dần
của hoành độ giao điểm. Các đoạn giao chính là các
đoạn thẳng được giới hạn bởi từng cặp giao điểm một.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Giải thuật dựa trên ý tưởng sử dụng một đường quét trên trục y của màn hình đi
từ ymax đến ymin của vùng cần được tô màu.

• Ứng với mỗi dòng quét y=k, k thay đổi từ ymin đến ymax, lặp lại:

• Tìm tất cả các hoành độ giao điểm của dòng quét y=k với các cạnh của đa giác.
• Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần : x0, x1, …
• Tô màu các đoạn thẳng y=k trên đường thẳng lần lượt được giới hạn bởi các cặp
(x0, x1), ( x2, x3), ….(x2k, x2k+1).
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật sinh đa giác (Polygon)
• Các thuật toán tô miền kín đa giác:
• Giải thuật dòng quét (scanline) cho việc tô màu vùng
void scanline_rectg(x1,y1,x2,y2,c)
• Tô màu hình chữ nhật: {
int i,j;
for(i=y1; i>=y2; i--) {
Phép tô màu 1 đa giác bất kỳ sẽ phức tạp hơn for(j=x1; j<= x2;j++) {
rất nhiều so với hình chữ nhật putpixel(i,j,c);
}
}
}
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
Ma trận các đỉnh của tam giác
• Các thuật toán tô miền kín đa giác: ScanLine
• Tô màu đa giác có tọa độ như sau: Xác định giá trị dx và dy

Hệ số góc dy/dy

Hệ số góc dx/dy

 
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Tìm các điểm giao cắt các cạnh của tam giác với các dòng quét (y=0 đến y=5).
Nếu tồn tại giao điểm, xác định tọa độ tài điểm cắt với giá trị (xgiao điểm, y)

• Nếu scanline y bất kỳ cắt qua cạnh XY nào đó khi và chỉ khi:

• Tọa đọa điểm cắt được xác định thông qua phương trình sau:
 hay
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=0
• Xét cạnh AB, rõ ràng cả 2 đỉnh A và B đều không thỏa mãn
biểu thức để chứng tỏ đường thẳng y=0 cắt ngang cạnh
AB. Do đó không cần xác định tọa độ điểm giao nhau giữa
y=0 và đoạn AB
• Xét cạnh BC và CA đều tương tự như cạnh AB
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=1
• Xét cạnh AB, rõ ràng cả 2 đỉnh A và B đều không thỏa mãn
biểu thức để chứng tỏ đường thẳng y=1 cắt ngang cạnh
AB. Do đó không cần xác định tọa độ điểm giao nhau giữa
y=1 và đoạn AB
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=1
• Xét cạnh BC
yB = 4 > 1 và yC = 1 <=1
xgđ[0] = xB + m(y-yB) hoặc xgđ[0] = xC + m(y-yC)
 xgđ[0] = 3 + 1/3(1-4) hoặc xgđ[0] = 2 + 1/3(1-1)
 xgđ[0] = 2 hoặc xgđ[0] = 2
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=1
• Xét cạnh CA
yC = 1 <= 1 và yA = 2 >1
xgđ[1] = xA + m(y-yA) hoặc xgđ[1] = xC + m(y-yC)
 xgđ[1] = 1 - 1(1-2) hoặc xgđ[1] = 2 - 1(1-1)
 xgđ[1] = 2 hoặc xgđ[1] = 2
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=2
• Xét cạnh AB
yA = 2 <=2 và yB = 4 > 2
xgđ[2] = xA + m(y-yA) hoặc xgđ[2] = xB + m(y-yB)
 xgđ[2] = 1 + 1(2-2) hoặc xgđ[2] = 3 + 1(2-4)
 xgđ[2] = 1 hoặc xgđ[2] = 1
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=2
• Xét cạnh BC
yC = 1 <= 2 và yB = 4 >2
xgđ[3] = xB + m(y-yB) hoặc xgđ[3] = xC + m(y-yC)
 xgđ[3] = 3 + 1/3(2-4) hoặc xgđ[3] = 2 + 1/3(2-1)
 xgđ[3] = 2 hoặc xgđ[3] = 2
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=2
• Xét cạnh CA
yC = 1 < 2 và yA = 2 >=2
xgđ[4] = xA + m(y-yA) hoặc xgđ[4] = xC + m(y-yC)
 xgđ[4] = 1 - 1(2-2) hoặc xgđ[4] = 2 - 1(2-1)
 xgđ[4] = 1 hoặc xgđ[4] = 1
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=3
• Xét cạnh AB
y=3
yA = 2 <=3 và yB = 4 > 3
xgđ[5] = xA + m(y-yA) hoặc xgđ[5] = xB + m(y-yB)
 xgđ[5] = 1 + 1(3-2) hoặc xgđ[5] = 3 + 1(3-4)
 xgđ[5] = 2 hoặc xgđ[5] = 2
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=3
• Xét cạnh BC
y=3
yC = 1 <= 3 và yB = 4 >3
xgđ[6] = xB + m(y-yB) hoặc xgđ[6] = xC + m(y-yC)
 xgđ[6] = 3 + 1/3(3-4) hoặc xgđ[6] = 2 + 1/3(3-1)
 xgđ[6] = 3 hoặc xgđ[3] = 3
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=3
• Xét cạnh CA, rõ ràng cả 2 đỉnh A và C đều không thỏa mãn y=3
biểu thức để chứng tỏ đường thẳng y=3 cắt ngang cạnh
AC. Do đó không cần xác định tọa độ điểm giao nhau giữa
y=3 và đoạn AC
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=4
• Xét cạnh AB
yA = 2 <4 và yB = 4 >=4
xgđ[7] = xA + m(y-yA) hoặc xgđ[7] = xB + m(y-yB)
 xgđ[7] = 1 + 1(4-2) hoặc xgđ[7] = 3 + 1(4-4)
 xgđ[7] = 3 hoặc xgđ[7] = 3
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=4
• Xét cạnh BC
yC = 1 < 4 và yB = 4 >= 4
xgđ[8] = xB + m(y-yB) hoặc xgđ[8] = xC + m(y-yC)
 xgđ[8] = 3 + 1/3(4-4) hoặc xgđ[8] = 2 + 1/3(4-1)
 xgđ[8] = 3 hoặc xgđ[8] = 3
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=4
• Xét cạnh CA, rõ ràng cả 2 đỉnh A và C đều không thỏa mãn
biểu thức để chứng tỏ đường thẳng y=4 cắt ngang cạnh
AC. Do đó không cần xác định tọa độ điểm giao nhau giữa
y=4 và đoạn AC
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Y=5
• Xét cạnh AB, rõ ràng cả 2 đỉnh A và B đều không thỏa mãn
biểu thức để chứng tỏ đường thẳng y=5 cắt ngang cạnh
AB. Do đó không cần xác định tọa độ điểm giao nhau giữa
y=5 và đoạn AB
• Xét cạnh BC và CA đều tương tự như cạnh AB
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
• Tập hợp các giao điểm:

• Tọa độ các đoạn thẳng (xgđ,y) là:

• Tiến hành tô màu: thực hiện vẽ các đường thẳng nối các tọa độ ở trên
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác: ScanLine
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác:
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
• Thuật toán tô màu loang (hay còn gọi là tô màu theo đường biên, tô lân cận). Khác với
thuật toán tô màu dựa theo dòng quét, đường biên của vùng tô màu ở thuật toán tô
loang được xác định bởi tập các đỉnh của 1 đa giác, đường biên trong thuật toán được
mô tả bằng một giá trị duy nhất, đó là màu của tất cả các điểm thuộc về đường biên (nói
ngắn gọn là chúng ta sẽ tô đường biên một màu riêng).
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác:
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
• Bắt đầu từ 1 điểm nằm bên trong vùng tô, ta sẽ kiểm tra
các điểm lân cận của nó đã được tô màu hay có phải
điểm biên hay không. Nếu không phải là điểm đã tô và
không phải là điểm biên ta sẽ tô màu nó. Lặp lại cho tới
khi nào không còn tô được điểm nào nữa thì dừng.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
• Thuật toán này có thể sẽ không hoạt động chính xác khi có 1 số điểm nằm trong vùng
tô có màu là màu cần tô của vùng tô. Để khắc phục điều này, trước khi tô màu, cần
phải đảm bảo rằng toàn bộ các điểm thuộc về vùng tô có màu khác màu tô.
• Có hai quan điểm về cách tô này, đó là dùng 4 điểm lân cận hay 8 điểm lân cận đối với
điểm đang xét.
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
Ma trận các đỉnh của đa giác

Xác định giá trị bên trong đa giác

Màu nền (background) = trắng

 
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Giải thuật vết dầu loang (Flood Fill - fill Algorithm)
• Nếu chọn sai điểm trung tâm (nằm trên hoặc nằm bên ngoài đa giác) kết quả là không
thể tô màu
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ SỞ
• 2.3. Các giải thuật xây dựng thực thể cơ sở
• Các thuật toán tô miền kín đa giác:
• Giải thuật đường biên bé nhất – đường biên lớn nhất (Boundary Fill Algorithm)
• Thuật toán này tương tự như thuật toán tô theo vết dầu loang. Nghĩa là sẽ đi xác định
điểm biên tận cùng bên phải, sau đó tăng y để tô cho tận cùng lên trên (xuống dưới), tiếp
tục giảm y ngay tại điểm xuất phát để tô cho tận cùng bên dưới (bên trên).
• Lặp lại thao tác này với giá trị hoành độ x giảm 1 pixel cho đến khi x = giá trị khởi tạo.
• Thực hiện 2 thao tác trên với giá trị biên trái.
• Ví dụ và giải thuật tham khảo Flood Fill Algorithm.

You might also like