Thuật toán vẽ đường thẳng Bresenham là một thuật toán hiệu quả để vẽ đường thẳng trên màn hình raster bằng cách sử dụng các phép toán số nguyên. Thuật toán này được phát triển bởi Jack Bresenham vào năm 1962. Mục tiêu của nó là xác định các pixel nào cần được tô màu để tạo ra một đường thẳng giữa hai điểm.
Nguyên lý hoạt động của thuật toán Bresenham
Thuật toán này hoạt động bằng cách duy trì một sai số, gọi là biến lỗi, để quyết định pixel tiếp theo cần được tô màu. Thuật toán bắt đầu từ một điểm đầu (x0, y0) và tiến hành từng bước đến điểm cuối (x1, y1). Ở mỗi bước, nó kiểm tra biến lỗi để xác định hướng đi tiếp theo (ngang hoặc dọc).
Cụ thể, các bước của thuật toán như sau:
-
Khởi tạo:
- Xác định các giá trị khởi tạo: dx (khoảng cách x), dy (khoảng cách y), x, y, và các biến lỗi.
- Tính dx = x1 - x0
- Tính dy = y1 - y0
- Xác định các bước tăng cho x và y dựa trên hướng của đường thẳng.
-
Lặp lại:
- Vẽ pixel tại vị trí hiện tại (x, y).
- Cập nhật biến lỗi:
- Nếu lỗi lớn hơn 0, tăng y lên một đơn vị và giảm lỗi đi dx.
- Luôn tăng x lên một đơn vị và tăng lỗi lên dy.
- Lặp lại cho đến khi đạt đến điểm cuối.
Cài đặt thuật toán Bresenham trong C#
Dưới đây là một ví dụ cài đặt thuật toán Bresenham để vẽ đường thẳng trong C#:
using System;
using System.Drawing;
using System.Windows.Forms;
public class BresenhamLine : Form
{
private Bitmap canvas;
public BresenhamLine()
{
this.Text = "Bresenham Line Algorithm";
this.Width = 800;
this.Height = 600;
canvas = new Bitmap(this.Width, this.Height);
this.Paint += new PaintEventHandler(DrawLine);
}
private void DrawLine(object sender, PaintEventArgs e)
{
// Điểm bắt đầu và điểm kết thúc
int x0 = 100, y0 = 100, x1 = 700, y1 = 500;
// Vẽ đường thẳng sử dụng thuật toán Bresenham
Bresenham(x0, y0, x1, y1);
// Hiển thị hình ảnh lên form
e.Graphics.DrawImage(canvas, 0, 0);
}
private void Bresenham(int x0, int y0, int x1, int y1)
{
int dx = Math.Abs(x1 - x0);
int dy = Math.Abs(y1 - y0);
int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;
int err = dx - dy;
while (true)
{
canvas.SetPixel(x0, y0, Color.Black); // Tô màu pixel hiện tại
if (x0 == x1 && y0 == y1) break;
int e2 = 2 * err;
if (e2 > -dy)
{
err -= dy;
x0 += sx;
}
if (e2 < dx)
{
err += dx;
y0 += sy;
}
}
}
[STAThread]
public static void Main()
{
Application.Run(new BresenhamLine());
}
}
Giải thích mã nguồn
- Khởi tạo form: Tạo một form với tiêu đề và kích thước nhất định. Khởi tạo một đối tượng
Bitmap
để vẽ trên đó. - Phương thức
DrawLine
: Được gọi khi form cần vẽ lại. Nó gọi phương thứcBresenham
để vẽ đường thẳng. - Phương thức
Bresenham
: Thực hiện thuật toán Bresenham để vẽ đường thẳng từ (x0, y0) đến (x1, y1). Tại mỗi bước, nó tô màu pixel hiện tại và cập nhật vị trí x, y dựa trên biến lỗi.
Thuật toán này sử dụng các phép toán số nguyên, do đó, nó rất hiệu quả và nhanh chóng trong việc vẽ đường thẳng trên màn hình raster.
Comments