chương trình vẽ đường thẳng bằng c 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 11000m 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.
Trang 1Đề 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:
Trang 2Gọ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) = (x2x1).\frac{2(y2y1)(x_{k}+1) +(x2x1)(2y_{k} + 2b 1)}{x2x1} \\ \\ \indent \indent = 2(y2y1)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}
Trang 3+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
Trang 4
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
Trang 53.3 Vẽ đường thẳng từ màu này qua màu khác
Trang 6
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
Trang 7- 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