"En hızlı" miktarını içeriyorsa da harcanan zaman, çözüm için uygun olan hangi yazılım bağlıdır ve süratle kullanabilirsiniz. Aşağıdaki açıklamalar sonuç olarak mümkün olan en hızlı bilgi işlem sürelerine ulaşmak için fikirlere odaklanmaktadır .
Hazır bir program kullanırsanız, neredeyse kesinlikle yapabileceğiniz en iyi şey, performansı tipik olarak O (log (V (log (V)) olacak bir KD ağacı veya dörtlü gibi bir çokgen noktası veri yapısı oluşturmak için çokgenleri önceden işlemektir. ) * (N + V)) burada V, çokgenlerdeki toplam köşe sayısıdır ve N nokta sayısıdır, çünkü veri yapısı oluşturmak için en az O (log (V) * V) çaba alacak ve sonra her nokta için bir nokta başına maliyet O (log (V)) ile problanmalıdır.
İlk olarak çokgenleri ızgaralayarak, çakışma olmaması varsayımından yararlanarak önemli ölçüde daha iyi yapabilirsiniz. Her ızgara hücresi tamamen bir poligonun iç kısmındadır ("evrensel çokgenin" iç kısmı dahil), bu durumda hücreyi çokgenin kimliğiyle etiketleyin veya başka bir veya daha fazla çokgen kenarı içerir. Bu rasterleştirmenin maliyeti, tüm kenarları rasterleştirilirken atıfta bulunulan ızgara hücresi sayısına eşittir, buradaki c, bir hücrenin büyüklüğüdür, ancak big-O notasyonundaki örtük sabit küçüktür.
(Bu yaklaşımın bir güzelliği, standart grafik rutinlerinden yararlanabilmenizdir. Örneğin, (a) çokgenleri sanal bir ekrana (b) her bir çokgen için farklı bir renk kullanarak çizecek ve (c) hitap etmeyi düşündüğünüz herhangi bir pikselin rengini okursanız, hazırladınız.
Bu ızgara yerinde olduğunda, her bir noktayı (yalnızca birkaç saat gerektiren bir O (1) işlemi) içeren hücreyi hesaplayarak noktaları önceden tarayın. Noktalar çokgen sınırlarının etrafında kümelenmedikçe, bu genellikle belirsiz sonuçlarla sadece yaklaşık O (c) noktaları bırakacaktır. Şebeke inşa etme ve ön elemenin toplam maliyeti O (V / c + 1 / c ^ 2) + O (N) 'dir. Kalan noktaları (yani, çokgen sınırlarına yakın olanları) işlemek için O (log (V) * N * c) maliyetiyle başka bir yöntem (şimdiye kadar önerilenlerden herhangi biri gibi) kullanmanız gerekir. .
C küçüldükçe, daha az ve daha az nokta bir kenar ile aynı ızgara hücresinde olacaktır ve bu nedenle daha az ve daha az sonraki O (log (V)) işlemeyi gerektirecektir. Buna karşı hareket etmek, O (1 / c ^ 2) ızgara hücrelerini saklamak ve O (V / c + 1 / c ^ 2) zamanlarını çokgenleri rasterleştirmek için harcamaktır. Bu nedenle en uygun ızgara boyutu c olacaktır. Bunu kullanarak, toplam hesaplama maliyeti O (log (V) * K) 'dir, ancak kapalı sabit tipik bir şekilde bağlı ön-eleme O (K) hızı için, konserve prosedürler kullanılarak daha küçük.
20 yıl önce bu yaklaşımı test ettim (İngiltere ve açık denizde eşit aralıklı noktalar kullanarak ve zamanın video tamponları tarafından sunulan yaklaşık 400K hücreden oluşan nispeten ham bir ızgaradan yararlanarak) ve en iyi yayınlanan algoritmaya kıyasla iki büyüklükte hız artışı elde ettim. bulabilirsiniz. Çokgenler küçük ve basit olsa bile (üçgenler gibi), büyüklükte bir hızlanma emrinden neredeyse emin olabilirsiniz.
Deneyimlerime göre, hesaplama o kadar hızlıydı ki, tüm işlem CPU tarafından değil, veri I / O hızlarıyla sınırlıydı. G / Ç'nin bir darboğaz olacağını tahmin ederek, veri okuma sürelerini en aza indirmek için noktaları mümkün olduğunca sıkıştırılmış bir formatta depolayarak en hızlı sonuçları elde edersiniz. Ayrıca, disk yazmalarını sınırlayabilmeniz için sonuçların nasıl saklanması gerektiği konusunda biraz düşünün.