×

Thuật Toán Vẽ Đường thẳng Bresenham Cài Đặt Trong C#

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:

  1. 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.
  2. 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

  1. 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 đó.
  2. Phương thức DrawLine: Được gọi khi form cần vẽ lại. Nó gọi phương thức Bresenham để vẽ đường thẳng.
  3. 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