Nếu "nhanh nhất" bao gồm lượng thời gian bạn sử dụng, giải pháp sẽ phụ thuộc vào phần mềm bạn cảm thấy thoải mái và có thể sử dụng nhanh chóng. Do đó, các nhận xét sau đây tập trung vào các ý tưởng để đạt được thời gian tính toán nhanh nhất có thể .
Nếu bạn sử dụng chương trình đóng hộp, gần như chắc chắn điều tốt nhất bạn có thể làm là xử lý trước các đa giác để thiết lập cấu trúc dữ liệu đa giác điểm, như cây KD hoặc tứ giác, có hiệu suất thường là O (log (V (V) ) * (N + V)) trong đó V là tổng số đỉnh trong đa giác và N là số điểm, vì cấu trúc dữ liệu sẽ mất ít nhất nỗ lực O (log (V) * V) để tạo và sau đó sẽ phải được thăm dò cho mỗi điểm với chi phí mỗi điểm O (log (V)).
Bạn có thể làm tốt hơn đáng kể bằng cách đầu tiên chia lưới cho các đa giác, khai thác giả định không có sự chồng chéo. Mỗi ô lưới hoàn toàn nằm trong một đa giác bên trong (bao gồm cả phần bên trong của "đa giác phổ quát"), trong trường hợp này gắn nhãn ô với id của đa giác, hoặc nếu không nó chứa một hoặc nhiều cạnh đa giác. Chi phí của quá trình rasterization này, bằng với số lượng ô lưới được tham chiếu trong khi raster hóa tất cả các cạnh, là O (V / c) trong đó c là kích thước của một ô, nhưng hằng số ẩn trong ký hiệu big-O là nhỏ.
(Một điểm hay của phương pháp này là bạn có thể khai thác các thói quen đồ họa tiêu chuẩn. Ví dụ: nếu bạn có một hệ thống (a) sẽ vẽ các đa giác trên màn hình ảo bằng cách sử dụng (b) một màu riêng biệt cho mỗi đa giác và (c) cho phép bạn đọc màu của bất kỳ pixel nào bạn quan tâm để giải quyết, bạn đã thực hiện nó.)
Khi có lưới này, sàng lọc trước các điểm bằng cách tính toán ô chứa mỗi điểm (thao tác O (1) chỉ cần một vài đồng hồ). Trừ khi các điểm được nhóm xung quanh các ranh giới đa giác, điều này thường sẽ chỉ để lại các điểm O (c) với kết quả không rõ ràng. Do đó, tổng chi phí xây dựng lưới và sàng lọc trước là O (V / c + 1 / c ^ 2) + O (N). Bạn phải sử dụng một số phương pháp khác (chẳng hạn như bất kỳ phương pháp nào được đề xuất cho đến nay) để xử lý các điểm còn lại (nghĩa là các điểm gần với ranh giới đa giác), với chi phí là O (log (V) * N * c) .
Khi c càng nhỏ, càng ít điểm sẽ nằm trong cùng một ô lưới có cạnh và do đó càng ngày càng ít sẽ yêu cầu xử lý O (log (V)) tiếp theo. Hành động chống lại điều này là cần phải lưu trữ các ô lưới O (1 / c ^ 2) và dành thời gian O (V / c + 1 / c ^ 2) để quét các đa giác. Do đó sẽ có một kích thước lưới tối ưu c. Sử dụng nó, tổng chi phí tính toán là O (log (V) * N) nhưng hằng ngầm thường là cách nhỏ hơn so với sử dụng các thủ tục đóng hộp, do O (N) tốc độ của pre-sàng lọc.
Cách đây 20 năm, tôi đã thử nghiệm phương pháp này (sử dụng các điểm cách đều nhau trên khắp nước Anh và ngoài khơi và khai thác một mạng lưới tương đối thô với khoảng 400 nghìn tế bào được cung cấp bởi bộ đệm video thời đó) và đạt được hai mức tăng tốc độ so với thuật toán được công bố tốt nhất tôi có thể tìm thấy. Ngay cả khi các đa giác nhỏ và đơn giản (như hình tam giác), bạn hầu như chắc chắn về một thứ tự tăng tốc độ.
Theo kinh nghiệm của tôi, việc tính toán nhanh đến mức toàn bộ hoạt động bị giới hạn bởi tốc độ I / O dữ liệu chứ không phải bởi CPU. Dự đoán rằng I / O có thể là nút cổ chai, bạn sẽ đạt được kết quả nhanh nhất bằng cách lưu trữ các điểm dưới dạng nén nhất có thể để giảm thiểu thời gian đọc dữ liệu. Cũng đưa ra một số suy nghĩ về cách lưu trữ kết quả, để bạn có thể hạn chế ghi đĩa.