Tải bản đầy đủ (.docx) (7 trang)

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 (295.51 KB, 7 trang )

Đề tài: Vẽ Đường Thẳng Dùng Thuật Toán

Bresenham
HÀ NỘI, 12/2017

1. Nguyên Lý Thuật Toán
Cho 2 điểm đầu mút M1 (x1, y1), M2(x2, y2) và màu vẽ C.
Trong bài nguyên lý chung vẽ đoạn thẳng chúng ta đã xây dựng phương trình đường
thẳng có dạng:

Để đơn giản hóa giải thuật ta xét đường thẳng với
Tại mỗi bước ta cho x tăng lên 1 đơn vị tức là
. Bước tiếp theo là ta
tính
nhưng ta sẽ không làm giống thuật toán DDA vì nó phải xử lỹ dữ liệu trên số
thực và làm tròn số dẫn tới mất thời gian. Ta sẽ tìm các tính theo các số nguyên.
Giả sử tại bước thứ k ta có được hình vẽ như sau:


Gọi y là tung độ chính xác của y_{k + 1}. Ta sẽ lấy giá trị y là giá trị gần nhất với y_{k}
+ 1 hay y_{k}. Để làm việc này ta xét d1 và d2.
d1 = y - y_{k} = m(x_{i} + 1) + b - y_{k} \\ d2 = y_{k} + 1 - y = y_{k} + 1 - m(x_{i}
+1) - b\\ => d1 - d2 = 2m(x_{i} +1) - 2y_{k} + 2b - 1
Nếu d1 > d2 khi đó y_{k + 1} = y_{k} + 1
Nếu d1 < d2 khi đó y_{k + 1} = y_{k}
Do đó nếu ta xác định được dấu của d1 – d2 thì ta sẽ biết được giá trị của y_{k+1} . Ta
xét hằng số P_{k} = (x1-x2)(d1-d2) (Ta nhân với (x1-x2) để triệt tiêu được mẫu khi thay
m vào khi tính toán).
Do Dx > 0 nên P_{k} chỉ phụ thuộc vào d1 -d2. Ta có:
m = \frac{y2-y1}{x2-x1} \\ \Rightarrow P_{k} = (x2-x1)(d1 - d2) = (x2-x1).\frac{2(y2y1)(x_{k}+1) +(x2-x1)(-2y_{k} + 2b - 1)}{x2-x1} \\ \\ \indent \indent = 2(y2-y1)x_{k} 2(x2-x1)y_{k} + 2(y2-y1) + (x2-x1)(2b-1) \\ \indent \indent = 2x_{k}Dy - 2y_{k}.Dx +
c \\ \\ \Rightarrow P_{k+1} = 2(x_{k}+1)Dy - 2y_{k+1}Dx + c, voi : \left (c= 2Dy +


(2b-1)Dx \right )\\ \\ TH1: P_{k} \geq 0 \Rightarrow d1 \geq d2 \\ \indent \indent
\Rightarrow y_{k+1} = y_{k} + 1 \\ \indent \indent \Rightarrow P_{k+1} = 2(x_{k}


+1)Dy - 2(y_{k} + 1)Dx + c = P_{k} + 2(Dy - Dx)\\ \\ TH2: P_{k} < 0 \Rightarrow d1 <
d2 \\ \indent \indent \Rightarrow y_{k+1} = y_{k} \\ \indent \indent \Rightarrow
P_{k+1} = 2(x_{k}+1)Dy - 2y_{k}Dx + c = P_{k} + 2Dy

Tính P1, ta có:
y1 = m.x1 + b = \frac{Dy}{Dx}x1 + b\\ P_{1} = 2x1.Dy - 2y1.Dx + c \\ = 2x1.Dy 2(\frac{Dy}{Dx}x1 + b)Dx + 2Dy + (2b - 1)Dx\\ = 2Dy - Dx

2. Lưu đồ thuật toán


3. Phần code cho các trường hợp
3.1. ve duog thang = bresensham

3.2. Vẽ đường thẳng với kích thước


3.3. Vẽ đường thẳng từ màu này qua màu khác


4. Phân tích dữ liệu đầu vào / đầu ra, tương tác của người dùng
- Dữ liệu đầu vào
+ Dữ liệu:
- khoảng dịch chuyển (kiểu dữ liệu: nguyên, thực),
- vận tốc 1/1000m
- Dữ liệu đầu ra:
+ Tương tác người dùng: Bàn phím, chuột,chuột trái.

- thiết kế giao diện
+ Khung cửa sổ:
- kích thước :
- màu nền : màu trắng
- Thiết kế chức năng
+ Các chức năng của chương trình :
- Chức năng chọn màu của đường thẳng
- Chức năng chọn màu nhạt dần cho đường thẳng


- Chức năng chọn vẽ nét liền nét đứt.
5. Hình ảnh kết quả
5.1 Giao diện chạy chương trình

5.3 Kết quả sau khi thực hiện các chức năng



×