×

Cài đặt thuật toán Voronoi Diagram trong lập trình

Thuật toán Voronoi Diagram là một công cụ mạnh mẽ trong lĩnh vực khoa học máy tính và ứng dụng thực tế. Việc cài đặt thuật toán này trong lập trình có thể được thực hiện qua nhiều ngôn ngữ và thư viện khác nhau. Dưới đây là một hướng dẫn chi tiết về cách triển khai thuật toán này.

Giới thiệu về Voronoi Diagram

Voronoi Diagram (sơ đồ Voronoi) chia một mặt phẳng thành nhiều vùng khác nhau dựa trên khoảng cách đến một tập hợp các điểm cho trước. Mỗi vùng chứa tất cả các điểm gần hơn điểm tương ứng của nó hơn bất kỳ điểm nào khác. Điều này tạo ra một dạng đồ thị cụ thể rất hữu ích trong nhiều ứng dụng như viễn thám, tối ưu hóa mạng lưới, và nhiều lĩnh vực khác.

Các bước cài đặt thuật toán

Để cài đặt Voronoi Diagram, chúng ta sẽ sử dụng một số thuật toán cơ bản như Bowyer-Watson hoặc Fortune's Algorithm. Bài viết này sẽ tập trung vào Bowyer-Watson, một thuật toán chia và trị đơn giản.

Bước 1: Chuẩn bị dữ liệu

Trước tiên, bạn cần có một tập hợp các điểm (sites) để tạo Voronoi Diagram. Các điểm này có thể đọc từ một tệp hoặc được sinh ngẫu nhiên.

import random

def generate_random_points(num_points, width, height):
    points = [(random.uniform(0, width), random.uniform(0, height)) for _ in range(num_points)]
    return points

points = generate_random_points(10, 100, 100)

Bước 2: Tạo Tam giác Super (Super Triangle)

Trước khi bắt đầu, chúng ta cần tạo một tam giác lớn bao xung quanh toàn bộ điểm. Đây là một yêu cầu của Bowyer-Watson để không điểm nào nằm ngoài tam giác khi bắt đầu quá trình.

import math

def create_super_triangle(points):
    min_x = min(points, key=lambda p: p[0])[0]
    max_x = max(points, key=lambda p: p[0])[0]
    min_y = min(points, key=lambda p: p[1])[1]
    max_y = max(points, key=lambda p: p[1])[1]

    dx = max_x - min_x
    dy = max_y - min_y
    dmax = max(dx, dy)
    
    mid_x = (min_x + max_x) / 2
    mid_y = (min_y + max_y) / 2

    p1 = (mid_x - 20 * dmax, mid_y - dmax)
    p2 = (mid_x, mid_y + 20 * dmax)
    p3 = (mid_x + 20 * dmax, mid_y - dmax)

    return [p1, p2, p3]

super_triangle = create_super_triangle(points)

Bước 3: Triangulation

Sử dụng các điểm đã cung cấp và tam giác super để tạo ra tập hợp các tam giác Delaunay.

import matplotlib.tri as tri
import matplotlib.pyplot as plt

all_points = points + super_triangle

triangulation = tri.Triangulation([p[0] for p in all_points], [p[1] for p in all_points])

plt.triplot(triangulation, 'bo-')
plt.plot([p[0] for p in points], [p[1] for p in points], 'ro')
plt.show()

Bước 4: Xây dựng Voronoi Diagram từ Delaunay Triangulation

Voronoi Diagram có thể được suy ra từ các tam giác Delaunay bằng cách xác định các điểm trung bình của mỗi tam giác và kết nối chúng lại.

from scipy.spatial import Voronoi, voronoi_plot_2d

vor = Voronoi(points)
fig = voronoi_plot_2d(vor)
plt.show()

Bước 5: Xử lý cạnh

Cuối cùng, để hoàn thiện sơ đồ Voronoi, bạn cần xử lý các cạnh và xác định ranh giới vùng hợp lý.

import numpy as np

def plot_voronoi_diagram(vor):
    fig = voronoi_plot_2d(vor)
    # Vẽ lại điểm ban đầu
    plt.scatter([p[0] for p in points], [p[1] for p in points], color='r')
    plt.show()

plot_voronoi_diagram(vor)

Kết luận

Cài đặt Voronoi Diagram trong lập trình đòi hỏi kiến thức về toán học đồ thị và thuật toán cơ bản. Bài viết này cung cấp một khung làm việc để bạn phát triển tiếp và áp dụng vào các sản phẩm thực tế. Hi vọng rằng các bước trên giúp bạn hiểu rõ hơn về quá trình và có thể triển khai thuật toán này một cách hiệu quả.

Comments