×

Thuật toán DDA Vẽ đường thẳng trong C#

Thuật toán DDA (Digital Differential Analyzer) là một phương pháp tuyến tính để vẽ đường thẳng trên màn hình raster. Thuật toán này hoạt động bằng cách tính toán các bước nhỏ để di chuyển từ điểm đầu đến điểm cuối của đường thẳng. DDA sử dụng các phép toán số thực, nên có thể chính xác hơn trong một số trường hợp so với thuật toán Bresenham, nhưng có thể chậm hơn do việc xử lý số thực.

Nguyên lý hoạt động của thuật toán DDA

  1. Khởi tạo:
    • Xác định độ dài đường thẳng theo hai chiều x và y.
    • Tính số bước cần thiết để đi từ điểm đầu đến điểm cuối. Số bước này là giá trị lớn hơn giữa độ dài theo chiều x và y.
    • Tính bước tăng cho mỗi bước theo x và y.
  2. Vẽ đường thẳng:
    • Khởi tạo vị trí hiện tại là điểm đầu.
    • Lặp lại số bước đã tính:
      • Vẽ điểm tại vị trí hiện tại.
      • Cập nhật vị trí hiện tại bằng cách tăng thêm bước tăng theo x và y.

Cài đặt thuật toán DDA trong C#

Dưới đây là một ví dụ cài đặt thuật toán DDA để vẽ đường thẳng trong C#:

using System;
using System.Drawing;
using System.Windows.Forms;

public class DDALine : Form
{
    private Bitmap canvas;

    public DDALine()
    {
        this.Text = "DDA 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 DDA
        DDA(x0, y0, x1, y1);

        // Hiển thị hình ảnh lên form
        e.Graphics.DrawImage(canvas, 0, 0);
    }

    private void DDA(int x0, int y0, int x1, int y1)
    {
        int dx = x1 - x0;
        int dy = y1 - y0;

        int steps = Math.Max(Math.Abs(dx), Math.Abs(dy));
        float xIncrement = dx / (float)steps;
        float yIncrement = dy / (float)steps;

        float x = x0;
        float y = y0;

        for (int i = 0; i <= steps; i++)
        {
            canvas.SetPixel((int)Math.Round(x), (int)Math.Round(y), Color.Black);
            x += xIncrement;
            y += yIncrement;
        }
    }

    [STAThread]
    public static void Main()
    {
        Application.Run(new DDALine());
    }
}

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 DDA để vẽ đường thẳng.
  3. Phương thức DDA: Thực hiện thuật toán DDA để vẽ đường thẳng từ (x0, y0) đến (x1, y1).
    • Tính toán dxdy là độ chênh lệch theo x và y giữa hai điểm.
    • Xác định số bước cần thiết bằng cách lấy giá trị lớn hơn giữa dxdy.
    • Tính bước tăng cho x và y (xIncrementyIncrement) bằng cách chia dxdy cho số bước.
    • Sử dụng vòng lặp for để vẽ từng điểm trên đường thẳng, cập nhật giá trị x và y cho mỗi bước.

Thuật toán DDA hoạt động bằng cách chia đường thẳng thành các bước nhỏ và vẽ từng điểm tại mỗi bước. Điều này làm cho đường thẳng được vẽ chính xác hơn, nhưng do sử dụng phép toán số thực, có thể không nhanh bằng thuật toán Bresenham trong một số trường hợp.

Comments