×

Cài đặt thuật toán Midpoint Circle vẽ hình tròn trong C#

Thuật toán Midpoint Circle là một phương pháp hiệu quả để vẽ hình tròn 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 sử dụng một điểm giữa để quyết định pixel tiếp theo cần được tô màu, giảm thiểu các phép tính toán số thực và do đó cải thiện hiệu suất.

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

  1. Khởi tạo:

    • Xác định các giá trị khởi đầu: bán kính của hình tròn, điểm trung tâm và giá trị khởi đầu của biến lỗi.
    • Bắt đầu từ điểm (x = 0, y = bán kính).
  2. Vẽ các điểm:

    • Sử dụng tính đối xứng của hình tròn để vẽ 8 điểm dựa trên điểm hiện tại.
    • Cập nhật biến lỗi:
      • Nếu lỗi nhỏ hơn 0, di chuyển theo hướng ngang (x tăng).
      • Nếu lỗi lớn hơn hoặc bằng 0, di chuyển theo hướng chéo (x tăng, y giảm).
  3. Lặp lại:

    • Lặp lại cho đến khi x vượt qua y.

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

Dưới đây là một ví dụ cài đặt thuật toán Midpoint Circle để vẽ hình tròn trong C#:

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

public class MidpointCircle : Form
{
    private Bitmap canvas;

    public MidpointCircle()
    {
        this.Text = "Midpoint Circle Algorithm";
        this.Width = 800;
        this.Height = 600;
        canvas = new Bitmap(this.Width, this.Height);
        this.Paint += new PaintEventHandler(DrawCircle);
    }

    private void DrawCircle(object sender, PaintEventArgs e)
    {
        // Tâm và bán kính của hình tròn
        int centerX = 400, centerY = 300, radius = 200;

        // Vẽ hình tròn sử dụng thuật toán Midpoint Circle
        MidpointCircleAlgorithm(centerX, centerY, radius);

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

    private void MidpointCircleAlgorithm(int centerX, int centerY, int radius)
    {
        int x = 0;
        int y = radius;
        int p = 1 - radius;

        // Vẽ các điểm ban đầu
        DrawCirclePoints(centerX, centerY, x, y);

        while (x < y)
        {
            x++;
            if (p < 0)
            {
                p += 2 * x + 1;
            }
            else
            {
                y--;
                p += 2 * (x - y) + 1;
            }
            DrawCirclePoints(centerX, centerY, x, y);
        }
    }

    private void DrawCirclePoints(int centerX, int centerY, int x, int y)
    {
        // Sử dụng tính đối xứng để vẽ 8 điểm
        canvas.SetPixel(centerX + x, centerY + y, Color.Black);
        canvas.SetPixel(centerX - x, centerY + y, Color.Black);
        canvas.SetPixel(centerX + x, centerY - y, Color.Black);
        canvas.SetPixel(centerX - x, centerY - y, Color.Black);
        canvas.SetPixel(centerX + y, centerY + x, Color.Black);
        canvas.SetPixel(centerX - y, centerY + x, Color.Black);
        canvas.SetPixel(centerX + y, centerY - x, Color.Black);
        canvas.SetPixel(centerX - y, centerY - x, Color.Black);
    }

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

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 DrawCircle: Được gọi khi form cần vẽ lại. Nó gọi phương thức MidpointCircleAlgorithm để vẽ hình tròn.
  3. Phương thức MidpointCircleAlgorithm: Thực hiện thuật toán Midpoint Circle để vẽ hình tròn với tâm (centerX, centerY) và bán kính radius.
    • Khởi tạo các giá trị x, y, và p (biến lỗi).
    • Vẽ các điểm ban đầu sử dụng tính đối xứng của hình tròn.
    • Sử dụng vòng lặp để cập nhật vị trí x, y và biến lỗi cho đến khi x vượt qua y.
    • Vẽ các điểm sử dụng tính đối xứng cho mỗi bước.
  4. Phương thức DrawCirclePoints: Sử dụng tính đối xứng để vẽ 8 điểm xung quanh tâm hình tròn.

Thuật toán Midpoint Circle rất hiệu quả trong việc vẽ hình tròn vì nó chỉ sử dụng các phép toán số nguyên, giúp giảm thiểu các phép tính toán phức tạp và tăng tốc độ vẽ.

Comments