Thuật toán vẽ đường thẳng Bresenham... Mối tương quan giữa X & Y khi độ lớn hệ số góc nhỏ hơn 1 x tăng 1 và y giữ nguyên hay tăng 1 Điều này bảo đảm cho đường thẳng Điều này bảo đảm ch
Trang 1Thuật toán vẽ đường thẳng Bresenham
Trang 2Mối tương quan giữa X & Y khi độ lớn hệ số góc nhỏ hơn 1
x tăng 1 và y giữ nguyên hay tăng 1
Điều này bảo đảm cho đường thẳng
Điều này bảo đảm cho đường thẳng liên tụcliên tục
Nếu độ lớn của hệ số góc lớn hơn 1, chúng ta đổi vai trò của x
& y
x được gọi là giá trị độc lập và y là giá trị phụ thuộcx được gọi là giá trị độc lập và y là giá trị phụ thuộc
Dx
Dy
Trang 3Thuật toán Bresenham
Giới thiệu:
• Giả sử đường cong được xấp xỉ thành các điểm lần lượt là
(xi,yi) Các điểm này có tọa độ nguyên và được hiển thị trên
màn hình
• Bài toán đặt ra là nếu biết được tọa độ (xi,yi) của bước thứ i, thì điểm ở bước i+1 là (xi+1,yi+1) sẽ được xác định như thế nào
• Trong trường hợp hệ số góc 0<=m<=1, chúng ta có xi+1=xi+1 và
yi+1=yi hay yi+1=yi+1
x
yi
yi+1
yi-1
x
Trang 4Thuật toán
– Nếu d 1 -d 2 <0 thì chọn y i+1 =y i
– Ngược lại, chọn y i+1 =y i +1
xi
yi
xi+1=xi+1 S
d2
d1
(x i+1,y=f(xi+1 ))
Trang 5Thuật toán (cont.)
– C = 2Dy + (2b - 1)Dx
– Nếu p i <0 thì y i+1 =y i nên p i+1 = p i + 2Dy
– Ngược lại thì y i+1 =y i +1 nên p i+1 = p i + 2Dy – 2Dx
2Dy – Dx
Trang 6p = 2Dy - Dx;
const1=2Dy; const2=2(Dy-Dx);
x = x1; y = y1;
putpixel(x,y,color);
x<x2
p<0
p=p+const1;
x=x+1;
putpixel(x,y,color);
p=p+const2;
y = y + 1;
End
Trang 7Chương trình (Dx>Dy>0)
void BresenhamLine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1, Dy = y2 – y1;
int x = x1, y = y1;
int p = 2 * Dy – Dx;
int const1 = 2 * Dy, const2 = 2 * (Dy-Dx);
putpixel(x, y, color);
while (x < x2) {
if (p < 0) {
p += const1;
} else {
p += const2;
y++;
} x++;
putpixel(x, y, color);
}
}
Trang 8Tổng kết
xi
yi
xi+1=xi+1 S
d2
d1
(x i+1,y=f(xi+1 ))
Trang 9Mở rộng
1 4
8
7 6
5
Dx>0,Dy>0,Dx>Dy
Dx>0,Dy<0,Dx>|Dy| Dx<0,Dy>0,|Dx|>Dy
Dx<0,Dy<0,|Dx|>|Dy|
Trang 10Kết hợp vùng 1 và 8
• Vùng 1 y tăng Vùng 1 y tăng còn vùng 2 y giảm còn vùng 2 y giảm
int dy = (Dy < 0) ? -1 : 1;
Dy = abs(Dy);
while (x < x2) {
if (p < 0) {
p += const1;
} else {
p += const2;
y += dy;
} x++;
putpixel(x, y, color);
}
Trang 11
Kết hợp vùng 1 và 4
• Vùng 1 x tăng Vùng 1 x tăng 1, vùng 4 x giảm 1, vùng 4 x giảm 1
• y tăng y tăng
int dx = (Dx < 0) ? -1 : 1;
Dx = abs(Dx);
while (
if (p < 0) {
p += const1;
} else {
p += const2;
y++;
}
x += dx;
putpixel(x, y, color);
}
Trang 12
Kết hợp vùng 1, 4, 5, 8
• x tăng x tăng 1 khi Dx > 0, giảm 1 khi Dx > 0, giảm 1 khi Dx < 0
• y tăng y tăng khi Dy > 0, giảm khi Dy > 0, giảm khi Dy < 0
int dx = (Dx < 0) ? -1 : 1;
Dx = abs(Dx);
int dy = (Dy < 0) ? -1 : 1;
Dy = abs(Dy);
while (
if (p < 0) {
p += const1;
} else {
p += const2;
y += dy;
}
x += dx;
putpixel(x, y, color);
}
Trang 13Kết hợp vùng 2, 3, 6, 7:
Kết hợp vùng 2, 3, 6, 7: x tính theo y x tính theo y
• y tăng y tăng 1 khi Dy > 0, giảm 1 khi Dy > 0, giảm 1 khi Dy < 0
• x tăng x tăng khi Dx > 0, giảm khi Dx > 0, giảm khi Dx < 0
int dx = (Dx < 0) ? -1 : 1;
Dx = abs(Dx);
int dy = (Dy < 0) ? -1 : 1;
Dy = abs(Dy);
while (
if (p < 0) {
p += const1;
} else {
p += const2;
x += dx;
}
y += dy;
putpixel(x, y, color);
}
Trang 14Chương trình hoàn chỉnh BresenhamLine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1, Dy = y2 – y1;
int x = x1, y = y1;
int dx = (Dx < 0) ? -1 : 1; Dx = abs(Dx);
int dy = (Dy < 0) ? -1 : 1; Dy = abs(Dy);
putpixel(x, y, color);
if (Dx > Dy)
{
int p = 2 * Dy – Dx;
int const1 = 2 * Dy, const2 = 2 * (Dy-Dx);
while (
while (x != x2 x != x2) {
if (p < 0) {
p += const1;
} else {
p += const2;
y += dy;
}
x += dx;
putpixel(x, y, color);
} } else {// đổi vai trò giữa x và y
… }
}
Trang 15Bài tập
Cài đặt thuật toán Bresenham cho: