2. CÁC THUẬT TỐN VẼ ĐƯỜNG
2.1.2. Thuật tốn Bresenham
Thuật tốn Bresenham đưa ra cách chọn là hay theo một hướng khác sao cho cĩ thể tối ưu hĩa về mặt tốc độ so với thuật tốn DDA. Vấn đề mấu chốt ở đây là làm thế nào để hạn chế tối đa các phép tốn trên số thực trong thuật tốn.
Hình 2.13 – Minh họa thuật tốn Bresenham
Gọi là điểm thuộc đoạn thẳng. Ta cĩ: .
Đặt
Xét tất cả các vị trí tương đối của y so với và , việc chọn điểm là S hay P phụ thuộc vào việc so sánh d1 và d2hay dấu của :
•Nếu , ta sẽ chọn điểm S, tức là .
•Ngược lại, nếu , ta sẽ chọn điểm P, tức là . Xét
Thay vào phương trình trên ta được : , với .
Nhận xét rằng do nên dấu của biểu thức cũng chính là dấu của . Hay nĩi một cách khác, nếu tại bước thứ i ta xác định được dấu của thì xem như ta xác định được điểm cần chọn ở bước (i+1). Vấn đề cịn lại là làm thế nào để tính được tại mỗi bước thật nhanh.
Từ đây ta cĩ thể suy ra cách tính từ như sau :
•Nếu thì do ta chọn .
•Ngược lại, nếu , thì , do ta chọn .
Giá trị được tính từ điểm vẽ đầu tiên theo cơng thức :
Do là điểm nguyên thuộc về đoạn thẳng nên ta cĩ . Thế vào phương trình trên ta suy ra : .
Cài đặt minh họa thuật tốn Bresenham
void LineBres (int x1, int y1, int x2, int y2) {
int Dx, Dy, p, Const1, Const2; int x, y;
Dx = x2 - x1; Dy = y2 - y1;
p = 2*Dy - Dx; // Dy <<1 - Dx
Const1 = 2*Dy; // Dy <<1
Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1
x = x1; y = y1;
putpixel(x, y, Color);
for(i=x1; i<x2; i++) { if (p<0) p += Const1; else { p += Const2; y++; } x++; putpixel(x, y, Color);
}
} // LineBres Nhận xét
•Thuật tốn Bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit (phép nhân 2) điều này là một cải tiến làm tăng tốc độ đáng kể so với thuật tốn DDA. Ý tưởng chính của thuật tốn nằm ở chỗ xét dấu để quyết định điểm kế tiếp, và sử dụng cơng thức truy hồi để tính bằng các phép tốn đơn giản trên số nguyên.
•Thuật tốn này cho kết quả tương tự như thuật tốn DDA.
2.1.3. Thuật tốn MidPoint
Thuật tốn MidPoint đưa ra cách chọn là hay bằng cách so sánh điểm thực Q với điểm MidPoint là trung điểm của S và P. Ta cĩ :
•Nếu điểm Q nằm dưới điểm MidPoint, ta chọn S.
•Ngược lại nếu điểm Q nằm trên điểm MidPoint ta chọn P.
Hình 2.14 – Minh hoạ thuật tốn MidPoint
Ta cĩ dạng tổng quát của phương trình đường thẳng :
với
Lúc này việc chọn các điểm S, P ở trên được đưa về việc xét dấu của .
•Nếu , điểm MidPoint nằm phía trên đoạn thẳng. Lúc này điểm thực Q nằm dưới điểm MidPoint nên ta chọn S, tức là .
•Ngược lại, nếu , điểm MidPoint nằm phía dưới đoạn thẳng. Lúc này điểm thực Q nằm trên điểm MidPoint nên ta chọn P, tức là .
Mặt khác :
Vậy :
, nếu do ta chọn .
, nếu do ta chọn .
Ta tính giá trị ứng với điểm ban đầu , với nhận xét rằng là điểm thuộc về đoạn thẳng, tức là cĩ :
Nhận xét rằng thuật tốn MidPoint cho kết quả tương tự như thuật tốn Bresenham.