vẽ đường thẳng bằng thuật toán bresenham .Dây là slide giảng bresenham mình làm ra và lên kế hoạch để thuyết chình trước lớp . nay đăng lên đây để cho mọi người xem qua . Mình đã thàng công khi thuyết trình nha . chỉ cần ae tự tin còn về slide thì cực kì đầy đủ cho ae . Nếu thích thì tải về ủng hộ mình nha
Trang 1Bà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
Trang 2Bà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 ( y k + 1 = y k + 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.
Trang 3Bà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
Trang 4Bà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 y k +1 là y k hay là y k + 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 y k + 1 với 2 điểm y k và y k + 1 Nếu
điểm nào nằm gần kề với điểm thực y k + 1 nhất thì sẽ được chọn làm điểm vẽ tiếp theo để vẽ đường thẳng
Trang 5Bà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à:
x k + 1 = x k + 1
Trang 6Bài 3: Thuật toán vẽ đường thẳng - Bresenham
3) Giải thuật
Ta xét m :
Gọi y k + 1 là giá trị thực của đường thẳng tại x k + 1 tại bước thứ k + 1 khi đó: y k + 1 = m(x k + 1 ) + b = m(x k + 1 ) +b
Gọi d1 là khoảng cách từ y k + 1 đến y k và d2 là khoảng cách từ y k + 1 đến
y k + 1
Ta có: d1 = y k + 1 – y k = m(x k + 1 ) + b – y k
d2 = y k +1 – y k + 1 = y k +1 – [ m(x k +1 ) b ]
d2 = y k +1 – m(x k +1 ) b
Lại có: d = d1 – d2 = (y k + 1 – y k ) – (y k +1 – y k + 1)
+ 1) + b ] – [ y k +1 – m(x k +1 ) b ]
Trang 7Bà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 =
Trang 8Bà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 y k + 1 = y k + 1
0 y k + 1 = y k
Tính = + c
do 1)
Trang 9Bài 3: Thuật toán vẽ đường thẳng - Bresenham
3) Giải thuật
Nếu > 0 y k + 1 = y k + 1
= +
Nếu 0 y k + 1 = y k
=+ )
Ta có:
= + c với c =
= 2(+ b) +
= 2
Trang 10Bà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
Trang 11Bà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
Trang 12Bài 3: Thuật toán vẽ đường thẳng - Bresenham
4) Lưu đồ thuật toán
Trang 13Bà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);
}
}
Trang 14Bà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:
marinkqh@gmail.com