Jika "tercepat" termasuk jumlah waktu Anda yang dihabiskan, solusinya akan tergantung pada perangkat lunak apa yang Anda sukai dan dapat digunakan dengan cepat. Pernyataan berikut secara konsekuen fokus pada ide-ide untuk mencapai waktu komputasi tercepat yang mungkin .
Jika Anda menggunakan program kalengan, hampir pasti yang terbaik yang dapat Anda lakukan adalah pra-proses poligon untuk mengatur struktur data point-in-poligon, seperti pohon KD atau quadtree, yang kinerjanya biasanya O (log (V) ) * (N + V)) di mana V adalah jumlah total simpul dalam poligon dan N adalah jumlah titik, karena struktur data akan mengambil setidaknya O (log (V) * V) upaya untuk membuat dan kemudian akan harus diperiksa untuk setiap titik dengan biaya per-titik O (log (V)).
Anda dapat melakukan jauh lebih baik dengan terlebih dahulu memasang grid pada poligon, mengeksploitasi asumsi tidak ada tumpang tindih. Setiap sel grid seluruhnya dalam interior poligon (termasuk interior "poligon universal"), dalam hal ini label sel dengan id poligon, atau mengandung satu atau lebih ujung poligon. Biaya rasterisasi ini, sama dengan jumlah sel kisi yang dirujuk saat meraster semua tepi, adalah O (V / c) di mana c adalah ukuran sel, tetapi konstanta tersirat dalam notasi O besar kecil.
(Satu keindahan dari pendekatan ini adalah bahwa Anda dapat mengeksploitasi rutin grafis standar. Misalnya, jika Anda memiliki sistem yang (a) akan menggambar poligon pada layar virtual menggunakan (b) warna yang berbeda untuk setiap poligon dan (c) memungkinkan Anda membaca warna piksel yang ingin Anda tangani, Anda membuatnya.)
Dengan kisi-kisi ini di tempat, pra-layar poin dengan menghitung sel yang mengandung setiap titik (operasi O (1) yang hanya membutuhkan beberapa jam). Kecuali jika titik-titik dikelompokkan di sekitar batas-batas poligon, ini biasanya hanya menyisakan sekitar O (c) poin dengan hasil yang ambigu. Karenanya, total biaya untuk membangun grid dan pra-penyaringan adalah O (V / c + 1 / c ^ 2) + O (N). Anda harus menggunakan beberapa metode lain (seperti yang direkomendasikan sejauh ini) untuk memproses poin yang tersisa (yaitu yang dekat dengan batas poligon), dengan biaya O (log (V) * N * c) .
Ketika c semakin kecil, semakin sedikit poin yang akan berada dalam sel grid yang sama dengan edge dan oleh karena itu semakin sedikit akan membutuhkan pemrosesan O (log (V)) berikutnya. Bertindak melawan ini adalah kebutuhan untuk menyimpan O (1 / c ^ 2) sel kisi dan untuk menghabiskan O (V / c + 1 / c ^ 2) waktu rasterisasi poligon. Oleh karena itu akan ada ukuran grid yang optimal c. Dengan menggunakannya, total biaya komputasi adalah O (log (V) * N) tetapi konstanta implisit biasanya jauh lebih kecil daripada menggunakan prosedur kalengan, karena kecepatan O (N) dari pra-penyaringan.
20 tahun yang lalu saya menguji pendekatan ini (menggunakan titik-titik yang berjarak seragam di seluruh Inggris dan lepas pantai dan mengeksploitasi jaringan yang relatif kasar sekitar 400 ribu sel yang ditawarkan oleh penyangga video saat itu) dan memperoleh dua pesanan percepatan magnitudo dibandingkan dengan algoritma terbaik yang diterbitkan yang saya bisa Temukan. Bahkan ketika poligon kecil dan sederhana (seperti segitiga), Anda benar-benar yakin akan urutan peningkatan kecepatan.
Dalam pengalaman saya, perhitungannya sangat cepat sehingga seluruh operasi dibatasi oleh kecepatan data I / O, bukan oleh CPU. Mengantisipasi bahwa I / O mungkin menjadi penghambat, Anda akan mencapai hasil yang paling cepat dengan menyimpan poin dalam format terkompresi mungkin untuk meminimalkan waktu membaca data. Juga pertimbangkan bagaimana hasil harus disimpan, sehingga Anda dapat membatasi penulisan disk.