Si "más rápido" incluye la cantidad de su tiempo que se gasta, la solución dependerá de lo que el software que se sienta cómodo y se puede utilizar de manera expedita. En consecuencia, las siguientes observaciones se centran en ideas para lograr los tiempos informáticos más rápidos posibles .
Si usa un programa enlatado, casi seguramente lo mejor que puede hacer es preprocesar los polígonos para configurar una estructura de datos de punto en el polígono, como un árbol KD o un árbol cuádruple, cuyo rendimiento generalmente será O (log (V ) * (N + V)) donde V es el número total de vértices en los polígonos y N es el número de puntos, porque la estructura de datos tomará al menos un esfuerzo de O (log (V) * V) para crear y luego tiene que sondearse para cada punto a un costo por punto O (log (V)).
Puede hacerlo sustancialmente mejor primero cuadriculando los polígonos, explotando el supuesto de que no hay superposiciones. Cada celda de la cuadrícula está completamente en el interior de un polígono (incluido el interior del "polígono universal"), en cuyo caso etiquete la celda con la identificación del polígono, o bien contiene uno o más bordes de polígono. El costo de esta rasterización, igual al número de celdas de la cuadrícula referenciadas mientras rasteriza todos los bordes, es O (V / c) donde c es el tamaño de una celda, pero la constante implícita en la notación O grande es pequeña.
(Una ventaja de este enfoque es que puede explotar las rutinas gráficas estándar. Por ejemplo, si tiene un sistema que (a) dibujará los polígonos en una pantalla virtual usando (b) un color distinto para cada polígono y (c) permite Si lees el color de cualquier píxel que quieras abordar, lo tienes hecho).
Con esta cuadrícula en su lugar, realice una prueba previa de los puntos calculando la celda que contiene cada punto (una operación O (1) que requiere solo unos pocos relojes). A menos que los puntos se agrupen alrededor de los límites del polígono, esto generalmente dejará solo unos puntos O (c) con resultados ambiguos. Por lo tanto, el costo total de construir la cuadrícula y la selección previa es O (V / c + 1 / c ^ 2) + O (N). Debe usar algún otro método (como cualquiera de los recomendados hasta ahora) para procesar los puntos restantes (es decir, aquellos que están cerca de los límites de los polígonos), a un costo de O (log (V) * N * c) .
A medida que c se hace más pequeña, cada vez habrá menos puntos en la misma celda de la cuadrícula con un borde y, por lo tanto, cada vez se requerirá menos procesamiento O (log (V)). Actuar contra esto es la necesidad de almacenar celdas de cuadrícula O (1 / c ^ 2) y gastar tiempo O (V / c + 1 / c ^ 2) rasterizando los polígonos. Por lo tanto, habrá un tamaño de cuadrícula óptimo c. Al usarlo, el costo computacional total es O (log (V) * N) pero la constante implícita es típicamente mucho más pequeña que el uso de los procedimientos enlatados, debido a la velocidad O (N) de la preselección.
Hace 20 años probé este enfoque (usando puntos espaciados uniformemente en toda Inglaterra y en alta mar y explotando una cuadrícula relativamente cruda de alrededor de 400K celdas ofrecidas por las memorias intermedias de video de la época) y obtuve dos órdenes de aceleración de magnitud en comparación con el algoritmo mejor publicado que pude encontrar. Incluso cuando los polígonos son pequeños y simples (como los triángulos), está prácticamente seguro de un orden de aceleración de magnitud.
En mi experiencia, el cálculo fue tan rápido que toda la operación estuvo limitada por las velocidades de E / S de datos, no por la CPU. Anticipando que I / O podría ser el cuello de botella, lograría los resultados más rápidos almacenando los puntos en un formato tan comprimido como sea posible para minimizar los tiempos de lectura de datos. También piense cómo deben almacenarse los resultados, de modo que pueda limitar las escrituras en disco.