Tải bản đầy đủ (.pptx) (14 trang)

Slide Đồ họa máy tính Bài 3 : Thuật Toán Vẽ Đường Thẳng Bresenham

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 (2.15 MB, 14 trang )

Bài 3: Thuật Toán Vẽ Đường
Thẳng - Bresenham
Nhóm thực hiện: Nguyễn Hồng Kỳ
Lê Văn Thiêm
Nguyễn Xuân Tuấn


Bài 3: Thuật toán vẽ đường thẳng - Bresenham
1) Giới thiệu thuật toán
Trong thuật toán DDA việc cộng dồn số thực m vào
y trong công thức ( yk + 1 = yk + m ) rồi làm tròn dẫn
đến tích lũy sai số làm cho hàm làm tròn có kết quả
sai, dẫn tới việc xác định vị trí của điểm vẽ bị chệch
hướng so với đường thẳng thực (điều này xảy ra khi ta
vẽ một đường thẳng khá dài). Hơn nữa, thuật toán
DDA còn bị hạn chế về mặt tốc độ do phép toán cộng
dồn số thực và làm tròn. Để khắc phục những mặt hạn
chế này giáo sư khoa học máy tính IBM là Jack Elton
Bresenham đã thiết kế thuật toán vẽ đường thẳng
Bresenham vào năm 1962 tại công ty IBM. Và sau này
giải thuật này tiếp tục phát triển để vẽ được đường
cong.


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

2)  Ý tưởng của thuật toán
Thay thế các phép toán trên số thực của thuật toán DDA
bằng các phép toán trên các số nguyên.
Hạn chế các phép toán được thực hiện để giảm thời gian so
với thuật toán DDA.



3) Đặt vấn đề
Cho 2 điểm A(, ) và B(, ). Vẽ đường thẳng đi qua A và B.


Bài 3: Thuật toán vẽ đường thẳng - Bresenham
3) Giải thuật
Thuật toán Bresenham đưa ra cách chọn yk +1 là yk hay là yk + 1
như thuật toán DDA nhưng theo một hướng khác. Đó là so sánh
khoảng cách giữa điểm thực yk + 1 với 2 điểm yk và yk + 1. Nếu
điểm nào nằm gần kề với điểm thực yk + 1 nhất thì sẽ được chọn
làm điểm vẽ tiếp theo để vẽ đường thẳng.


Bài 3: Thuật toán vẽ đường thẳng - Bresenham
3) Giải thuật

Ta
  có phương trình đường thẳng đi qua 2 điểm A(x1, y1)

và B(x2, y2) : y = mx + b với (m =
Tại mỗi bước ta cho x tăng lên 1 đơn vị tức là:
xk + 1 = x k + 1


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
Ta xét m :
Gọi yk + 1 là giá trị thực của đường thẳng tại xk + 1 tại bước thứ k + 1

khi đó: yk + 1 = m(xk + 1 ) + b = m(xk + 1 ) +b
Gọi d1 là khoảng cách từ yk + 1 đến yk và d2 là khoảng cách từ yk + 1 đến
yk + 1
Ta có: d1 = yk + 1 – yk = m(xk + 1 ) + b – yk
d2 = yk +1 – yk + 1 = yk +1 – [ m(xk +1 ) b ]
d2 = yk +1 – m(xk +1 ) b
Lại có: d = d1 – d2 = (yk + 1 – yk ) – (yk +1 – yk + 1)
+ 1) + b ] – [ yk +1 – m(xk +1 ) b ]


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
+ 2b
Tuy nhiên trong số thực m =, để đúng ý tưởng của thuật toán
chỉ thực hiện các phép toán trên số nguyên ta sẽ khử mẫu số bằng
cách nhân cả 2 vế của Khi đó ta được:
[+ 2b
Đặt = và thay m = ta được:
= [ 2]
=[ ]
= +c
với c =


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
Do m 0 với mọi trường hợp
Dấu của cùng dấu với

> 0 yk + 1 = yk + 1
0 yk + 1 = yk
Tính = + c
do 1)


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
Nếu > 0 yk + 1 = yk + 1
=+
Nếu 0 yk + 1 = yk
=+ )
Ta có:
= +c
với c =
= 2(+ b) +
=2


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
Các bước của thuật toán Bresenham:

Bước 1: Tính các giá trị , , ,
Gán tọa độ vẽ x = , y = y1
Vẽ điểm có tọa độ (x, y)
Bước 2: Kiểm tra điều kiện x
Nếu không thỏa mãn thì kết thúc chương trình

Nếu thỏa mãn thì chuyển đến bước 3


Bài 3: Thuật toán vẽ đường thẳng - Bresenham

3)  Giải thuật
Các bước của thuật toán Bresenham:
Bước 3: Kiểm tra điều kiện P < 0
Nếu thỏa mãn thì x = x + 1, P = P +
và vẽ điểm có tọa độ (x, y) rồi sau đó quay lại bước 2
Nếu không thỏa mãn thì đến bước 4
Bước 4: P = P + , y = y + 1
Vẽ điểm có tọa độ (x, y) sau đó quay lại bước 2


Bài 3: Thuật toán vẽ đường thẳng - Bresenham
4) Lưu đồ thuật toán


Bài 3: Thuật toán vẽ đường thẳng - Bresenham
5) Code minh họa
void bresenham(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1;
int dy = y2 - y1;
int p = 2*dy - dx;
int c1 = 2*dy;
int c2 = 2*(dy - dx);
int x = x1;
int y = y1;

putpixel(x, y, 3);
while(x <= x2)
{
delay(10);
if (p < 0)
{
p += c1;
}
else
{
p += c2;
y++;
}
x++;
putpixel(x, y, 3);
}
}


Bài thuyết trình đến đây là hết xin cảm ơn mọi
người đã lắng nghe!!
Mọi thông tin ý kiến xin gửi về email:




×