Tengo un objeto System.Windows.Shapes.Polygon, cuyo diseño está determinado completamente por una serie de puntos. Necesito determinar si este polígono se intersecta a sí mismo; es decir, si alguno de los lados del polígono se cruza con cualquiera de los otros lados en un punto que no es un vértice. ¿Hay una forma fácil/rápida de calcular esto?Compruebe si el polígono se autointercala
Respuesta
fácil, lento, bajo consumo de memoria: compara cada segmento contra todos los demás y comprobar si hay intersecciones. Complejidad O (n).
ligeramente más rápido, huella de memoria medio (modificado versión de arriba): almacenar bordes en "cubos" espaciales, a continuación, realizar por encima de algoritmo en función de cada cubo. Complejidad O (n/m) para m cucharones (suponiendo una distribución uniforme).
rápido & huella de memoria alta: usar una función hash espacial para dividir bordes en cubos. Verificar colisiones. Complejidad O (n).
Fast & baja huella de memoria: utilizar un algoritmo de barrido de línea, tal como el descrito here (o here). complejidad O (n log n)
El último es mi favorito, ya que tiene buena velocidad - balance de la memoria, especialmente la Bentley-Ottmann algorithm. La implementación tampoco es muy complicada.
Compruebe si se cruza un par de segmentos de línea no contiguos.
Todos deben cruzarse en los vértices; la pregunta entonces se convierte en lo que es la manera más rápida de verificar una intersección sin vértice entre un conjunto arbitrario de segmentos de línea. – GWLlosa
Buen punto, editado para comprobar si los segmentos no contiguos se cruzan. No creo que haya un método incorporado, tendrás que escribir un método. Comience por obtener Polygon.Points –
¿No quiere decir ** abrir ** segmentos de línea? Nunca he oído hablar de segmentos de línea no contiguos. –
En aras de la exhaustividad agrego otro algoritmo a esta discusión.
Asumiendo que el lector conoce los cuadros delimitadores alineados con el eje (Google sí no) Puede ser muy eficiente encontrar rápidamente pares de bordes que tienen el conflicto entre ellos de AABB usando el "Algoritmo de barrido y poda". (buscalo en Google). Las rutinas de intersección son llamadas en estos pares.
La ventaja aquí es que incluso puede cruzarse con un borde no recto (círculos y splines) y el enfoque es más general aunque casi igual de eficiente.
- 1. Comprobar si polígono se encuentra dentro de un polígono
- 2. Compruebe si se admite el elemento html
- 3. Compruebe si se escanea un archivo PDF
- 4. Compruebe si la salida se redirige
- 5. compruebe si se completa la descarga
- 6. Argparse: compruebe si se han pasado argumentos
- 7. Compruebe si se admite el esquema de URL en javascript
- 8. Compruebe si el archivo javascript se ha cargado
- 9. c linux compruebe si el archivo se actualiza/cambia/modifica?
- 10. compruebe si el objeto se crea o no en delphi
- 11. Compruebe si existe tabla
- 12. Hibernar: compruebe si existe el objeto
- 13. NSMutableArray compruebe si el objeto ya existe
- 14. Compruebe si el cursor tiene resultados
- 15. Compruebe si el valor es nulo
- 16. Postgresql: compruebe si existe el esquema
- 17. Compruebe si el tipo es hashable
- 18. Compruebe si el valor existe en dataTable?
- 19. Compruebe si la propiedad tiene el atributo
- 20. Javascript: compruebe si el elemento ha cambiado
- 21. Compruebe si existe evento en el elemento
- 22. Compruebe si el archivo existe en ksh
- 23. Compruebe si el archivo ya está abierto
- 24. C compruebe si el archivo existe
- 25. Boost PropertyTree: compruebe si existe el niño
- 26. Compruebe si existe el método jQuery
- 27. compruebe si el archivo existe en php
- 28. Compruebe si el valor es un número
- 29. ¿Cómo detectar si un polígono tiene autointersecciones?
- 30. Detectar si CGPoint dentro del polígono
Estoy tratando de entender el último algoritmo mientras hablamos; particularmente, tengo problemas para rastrear el significado/propósito de la estructura T. – GWLlosa
* T * es una estructura que contiene los segmentos de línea que cruzan la línea de barrido * L *. La estructura más eficiente sería un árbol de búsqueda binario (ver también el [algoritmo de Bentley-Ottmann] (http://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm)). –
Agregué otro [vínculo donde el algoritmo Bentley-Ottmann] (http://softsurfer.com/Archive/algorithm_0108/algorithm_0108.htm) se describe con ilustraciones. –