Đây là một câu hỏi rất hay. Tôi đã triển khai thuật toán tương tự trên c # một thời gian trước. Thuật toán xây dựng một đường bao chung của hai đa giác (tức là Tạo một liên hợp không có lỗ). Nó đây.
Bước 1. Tạo đồ thị mô tả các đa giác.
Đầu vào: đa giác thứ nhất (n điểm), đa giác thứ hai (m điểm). Đầu ra: đồ thị. Đỉnh - đa giác điểm giao điểm.
Chúng ta nên tìm các giao lộ. Lặp lại tất cả các cạnh của đa giác trong cả hai đa giác [O (n * m)] và tìm bất kỳ giao điểm nào.
Nếu không tìm thấy giao điểm, chỉ cần thêm các đỉnh và nối chúng với cạnh.
Nếu tìm thấy bất kỳ giao lộ nào, hãy sắp xếp chúng theo độ dài đến điểm bắt đầu, thêm tất cả các đỉnh (bắt đầu, kết thúc và giao điểm) và nối chúng (đã được sắp xếp theo thứ tự) với cạnh.
Bước 2. Kiểm tra đồ thị đã xây dựng
Nếu chúng tôi không tìm thấy bất kỳ giao điểm nào khi xây dựng biểu đồ, chúng tôi có một trong các điều kiện sau:
- Polygon1 chứa polygon2 - return polygon1
- Polygon2 chứa polygon1 - return polygon2
- Polygon1 và polygon2 không cắt nhau. Trả về đa giác1 VÀ đa giác2.
Bước 3. Tìm đỉnh dưới cùng bên trái.
Tìm tọa độ x và y nhỏ nhất (minx, miny). Sau đó tìm khoảng cách nhỏ nhất giữa (minx, miny) và các điểm của đa giác. Điểm này sẽ là điểm dưới cùng bên trái.
Bước 4. Dựng đường bao chung.
Chúng tôi bắt đầu xem qua biểu đồ từ điểm dưới cùng bên trái và tiếp tục cho đến khi chúng tôi quay trở lại nó. Lúc đầu, chúng tôi đánh dấu tất cả các cạnh là không được kiểm tra. Trên mỗi lần lặp, bạn nên chọn điểm tiếp theo và đánh dấu điểm đó là đã truy cập.
Để chọn điểm tiếp theo, hãy chọn một cạnh có góc bên trong lớn nhất theo hướng ngược chiều kim đồng hồ.
Tôi tính toán hai vectơ: vectơ1 cho cạnh hiện tại và vectơ2 cho mỗi cạnh chưa xem tiếp theo (như được trình bày trong hình).
Đối với vectơ tôi tính:
- Sản phẩm vô hướng (sản phẩm chấm). Nó trả về một giá trị liên quan đến một góc giữa các vectơ.
- Sản phẩm vector (sản phẩm chéo). Nó trả về một vector mới. Nếu tọa độ z của vectơ này là dương, tích vô hướng cho tôi góc vuông theo hướng ngược chiều kim đồng hồ. Khác (tọa độ z là âm), tôi tính toán góc giữa các vectơ là 360 - góc từ tích vô hướng.
Kết quả là tôi nhận được một cạnh (và một đỉnh tiếp theo tương ứng) với góc lớn nhất.
Tôi thêm vào danh sách kết quả từng đỉnh đã qua. Danh sách kết quả là đa giác liên hợp.
Nhận xét
- Thuật toán này cho phép chúng ta hợp nhất nhiều đa giác - để áp dụng lặp đi lặp lại với các cặp đa giác.
- Nếu bạn có một đường bao gồm nhiều đường cong và đường cong hơn, bạn nên làm phẳng đường này trước.