1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Đồ họa máy tính: Thuật toán Bresenham - Vẽ đường thẳng

15 24 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 329 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Đồ họa máy tính: Thuật toán Bresenham - Vẽ đường thẳng có nội dung giới thiệu về thuật toán Bresenham, cài đặt thuật toán, chương trình thuật toán và bài tập. Tham khảo nội dung bài giảng để hiểu rõ hơn về các nội dung trên.

Trang 1

1 Thuật toán Bresenham

vẽ đường thẳng

Trang 2

Xét k<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 3

Thuật toán Bresenham

Giới thiệu:

• Giả sử đường thẳng đượ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<k<1, chúng ta có xi+1=xi+1 và

yi+1=yi hayhay yi+1=yi+1

xi

yi

yi+1

yi-1

xi+1

Trang 4

Thuật toán Bresenham (tiếp)

• Phương trình đường thẳng qua 2 điểm (x1, y1) và (x2, y2) là

y=kx+m với m=Dy/Dx và m=y1-kx1

• Đặt d1=y-yi và d2=(yi+1)-y, do đó việc chọn tọa độ của yi+1 phụ

thuộc vào d1 và d2 ( hay dấu của d1 - d2):

– Nếu d1-d2<0 thì chọn yi+1=yi

xi

yi

xi+1=xi+1 S

d2

d1

(x i+1,y=f(xi+1 ))

Trang 5

Thuật toán Bresenham (tiếp)

• d1 - d2 = (2y – 2yi – 1) là một số thực do chứa k – 1) là một số thực do chứa k

• Xét pi = Dx (d1 - d2) = Dx (2y - 2yi - 1) = 2Dy xi - 2Dx yi + C

– C = 2Dy + (2b - 1)Dx

• Do dấu của pi và (d1-d2) giống nhau nên khi xét dấu của pi thì ta xác

định được y i+1

• Mặc khác, pi+1 – pi = (2Dy xi+1 - 2Dx yi+1 + C) - (2Dy xi - 2Dx yi + C) =

2Dy – 2Dx(y i+1 – y i )

• Từ đây, ta suy ra cách tính pi+1 theo pi:

– Nếu pi<0 thì yi+1=yi nên pi+1 = pi + 2Dy

– Ngược lại thì y i+1 =y i +1 nên p i+1 = p i + 2Dy – 2Dx

• Giá trị p đầu tiên được tính tại (x1, y1) là p1 = 2Dy x1 -2Dx y1 + C =

2Dy – Dx

Trang 6

p = 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 7

Cài đặt thuật toán (với 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 8

Tổng kết

• Xác định d1 và d2 sao cho d1 là độ lệch từ y đến điểm hiện hành

yi

• Xác định pi sao cho pi cùng dấu với (d1 – d2) và mang giá trị

nguyên

• Tính pi+1 theo pi theo 2 trường hợp pi < 0 và pi > 0 Chú ý trường

hợp pi = 0

• Tính p1

xi

yi

xi+1=xi+1 S

d2

d1

(x i+1,y=f(xi+1 ))

Trang 9

Mở 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 10

Kết hợp vùng 1 và 8

x tăng 1

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 13

Kế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 14

Chương trình hoàn chỉnh

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 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 15

Bài tập

Cài đặt thuật toán Bresenham vẽ hình sau

Ngày đăng: 11/05/2021, 01:36

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm