Una solución es dividir el polígono cóncavo en segmentos convexos y luego usar el enlace de cobbal.
Como realmente tiene dos problemas fundamentales diferentes, ¿ha considerado otras alternativas al problema de la prueba de aciertos, como usar un árbol BSP? Puede acelerar aún más colocando una grilla sobre el poli y construyendo un árbol BSP para cada cuadrícula. ¿O un árbol kd con un borde como máximo en cada hoja?
Editar: Voy a ellaborate en el kd-árbol (por aburrimiento, aunque podría ser de alguna utilidad a nadie):
KD-árboles tienen las siguientes propiedades:
- Son binarios
- Cada nodo no hoja divide el espacio a lo largo de un plano perpendicular a un eje, un lado por niño. P.ej. la raíz divide el espacio en x < x0 yx> = x0
- Los niveles de los árboles se dividen en diferentes ejes, p. ej. nivel 0 (root) divide perpendicular a X, nivel 1 -> Y, etc.
Para utilizar esta para el polígono golpeó detección, construir el árbol como sigue:
- Escoja un vértice para dividir a lo largo. (Preferiblemente en algún lugar cerca del medio para un árbol equilibrado).
- Dividir otros vértices en dos conjuntos, uno para cada lado de la división. El vértice anterior no entra en ninguno de los conjuntos.
- Coloque los bordes en los juegos también. Cualquier borde que interseca la línea divisoria entra en ambos conjuntos.
- Construya hijos recursivamente de los grupos anteriores.
Si el vértice dividido se elige de forma adecuada, el árbol debe tener una profundidad próxima al registro (N), donde N es el número de vértices. Cada nodo de hoja tendrá como máximo un borde que lo atraviesa. Para hacer la detección de aciertos:
- Encuentra la hoja en la que cae el punto.
- Si hay un borde en la hoja, compárelo. De lo contrario, debería ser obvio si el punto está dentro o fuera (guarde esta información en dichas hojas al construir el árbol).
¿Considera que una prueba de "punto en polígono" es pesada? La mayoría de las veces es solo una prueba "mayor que" y/o "menor que" de todos los puntos de los que está compuesto el polígono, y solo en algunos casos una prueba de intersección de líneas. O...? –
No estoy seguro de lo que quiere decir ... Estoy utilizando la prueba de cruce par impar para una línea media (después de comprobar el rectángulo delimitador, por supuesto). Eso termina probando muchos lados, y si el polígono tiene muchos lados, es bastante lento. –
Coud usted enlace a algunos conjuntos de datos, esto suena como algo que podría ser divertido de probar. –