stringtranslate.com

Punto en el polígono

Un ejemplo de un polígono simple

En geometría computacional , el problema de punto en polígono ( PIP ) pregunta si un punto dado en el plano se encuentra dentro, fuera o en el límite de un polígono . Es un caso especial de problemas de ubicación de puntos y encuentra aplicaciones en áreas que tratan con el procesamiento de datos geométricos, como gráficos por computadora , visión por computadora , sistemas de información geográfica (GIS), planificación de movimiento y diseño asistido por computadora (CAD).

Una descripción temprana del problema en gráficos de computadora muestra dos enfoques comunes ( lanzamiento de rayos y suma de ángulos) en uso ya en 1974. [1]

Un intento de los veteranos de los gráficos por ordenador de rastrear la historia del problema y algunos trucos para su solución se puede encontrar en un número de Ray Tracing News . [2]

Algoritmo de proyección de rayos

Número de intersecciones de un rayo que pasa desde el exterior del polígono hasta un punto cualquiera: si es impar, indica que el punto se encuentra dentro del polígono; si es par, indica que el punto se encuentra fuera del polígono. Esta prueba también funciona en tres dimensiones.

Una forma sencilla de averiguar si el punto está dentro o fuera de un polígono simple es comprobar cuántas veces un rayo , que parte del punto y sigue una dirección fija, interseca los bordes del polígono. Si el punto está fuera del polígono, el rayo intersecará su borde un número par de veces. Si el punto está dentro del polígono, intersecará el borde un número impar de veces. El estado de un punto en el borde del polígono depende de los detalles del algoritmo de intersección de rayos.

Este algoritmo también se conoce a veces como algoritmo de número de cruce o algoritmo de regla par-impar , y se conocía ya en 1962. [3] El algoritmo se basa en una simple observación de que si un punto se mueve a lo largo de un rayo desde el infinito hasta el punto de sonda y si cruza el límite de un polígono, posiblemente varias veces, entonces va alternativamente desde el exterior al interior, luego desde el interior al exterior, etc. Como resultado, después de cada dos "cruces de frontera", el punto en movimiento va hacia afuera. Esta observación puede demostrarse matemáticamente utilizando el teorema de la curva de Jordan .

Precisión limitada

Si se implementa en una computadora con aritmética de precisión finita , los resultados pueden ser incorrectos si el punto se encuentra muy cerca de ese límite, debido a errores de redondeo. Para algunas aplicaciones, como los videojuegos u otros productos de entretenimiento, esto no es una gran preocupación ya que a menudo priorizan la velocidad sobre la precisión. Sin embargo, para un programa de computadora formalmente correcto , uno tendría que introducir una tolerancia numérica ε y probar en línea si P (el punto) se encuentra dentro de ε de L (la línea), en cuyo caso el algoritmo debería detenerse e informar " P se encuentra muy cerca del límite".

La mayoría de las implementaciones del algoritmo de proyección de rayos comprueban consecutivamente las intersecciones de un rayo con todos los lados del polígono uno por uno. En este caso, se debe abordar el siguiente problema. Si el rayo pasa exactamente por un vértice de un polígono, entonces intersectará 2 segmentos en sus puntos finales. Si bien está bien para el caso del vértice superior en el ejemplo o el vértice entre el cruce de 4 y 5, el caso del vértice más a la derecha (en el ejemplo) requiere que contemos una intersección para que el algoritmo funcione correctamente. Surge un problema similar con los segmentos horizontales que caen sobre el rayo. El problema se resuelve de la siguiente manera: si el punto de intersección es un vértice de un lado del polígono probado, entonces la intersección cuenta solo si el otro vértice del lado se encuentra debajo del rayo. Esto es efectivamente equivalente a considerar que los vértices del rayo se encuentran ligeramente por encima del rayo.

Una vez más, el caso del rayo que pasa por un vértice puede plantear problemas numéricos en aritmética de precisión finita : para dos lados adyacentes al mismo vértice, el cálculo directo de la intersección con un rayo puede no dar el vértice en ambos casos. Si el polígono se especifica por sus vértices, entonces este problema se elimina comprobando las coordenadas y del rayo y los extremos del lado del polígono probado antes del cálculo real de la intersección. En otros casos, cuando los lados del polígono se calculan a partir de otros tipos de datos, se deben aplicar otros trucos para la robustez numérica del algoritmo.

Algoritmo de número de bobinado

Otra técnica utilizada para comprobar si un punto está dentro de un polígono es calcular el número de vueltas del punto dado con respecto al polígono. Si el número de vueltas no es cero, el punto se encuentra dentro del polígono. Este algoritmo también se conoce a veces como el algoritmo de la regla de no cero .

Para comprobar si un punto dado se encuentra dentro o fuera de un polígono:

  1. Dibuja una línea horizontal a la derecha de cada punto y extiéndela hasta el infinito.
  2. Cuente el número de veces que la línea se interseca con los bordes del polígono.
  3. Un punto está dentro del polígono si el número de intersecciones es impar o si el punto se encuentra en un borde del polígono. Si ninguna de las condiciones es verdadera, entonces el punto se encuentra fuera. [4]

Una forma de calcular el número de vueltas es sumar los ángulos subtendidos por cada lado del polígono. [5] Sin embargo, esto implica costosas funciones trigonométricas inversas , lo que generalmente hace que este algoritmo sea ineficiente en términos de rendimiento (más lento) en comparación con el algoritmo de proyección de rayos. Afortunadamente, no es necesario calcular estas funciones trigonométricas inversas. Dado que el resultado, la suma de todos los ángulos, puede sumar 0 o (o múltiplos de ) solamente, es suficiente rastrear a través de qué cuadrantes se enrolla el polígono, [6] mientras gira alrededor del punto de prueba, lo que hace que el algoritmo del número de vueltas sea comparable en velocidad al conteo de los cruces de límites.

Visualización del algoritmo de número de vueltas de Dan Sunday . Un número de vueltas de 0 significa que el punto está fuera del polígono; otros valores indican que el punto está dentro del polígono.

En 2001, Dan Sunday desarrolló un algoritmo mejorado para calcular el número de vueltas. [7] No utiliza ángulos en los cálculos ni trigonometría y funciona exactamente igual que los algoritmos de proyección de rayos descritos anteriormente. El algoritmo de Sunday funciona considerando un rayo horizontal infinito proyectado desde el punto que se está comprobando. Siempre que ese rayo cruza una arista del polígono, se utiliza el algoritmo de cruce de aristas de Juan Pineda (1988) [8] para determinar cómo afectará el cruce al número de vueltas. Como lo describe Sunday, si la arista cruza el rayo que va "hacia arriba", el número de vueltas se incrementa; si cruza el rayo "hacia abajo", el número se decrementa. El algoritmo de Sunday da la respuesta correcta para polígonos no simples, mientras que el algoritmo de cruce de límites falla en este caso. [7]

Implementaciones

SVG

En SVG se utilizan métodos similares para definir una forma de rellenar con color diversas formas (como trazados, polilíneas, polígonos, textos, etc.). [9] El algoritmo de relleno está influenciado por el atributo 'fill-rule'. El valor puede ser o nonzero. evenoddPor ejemplo, en un pentagrama , hay un "agujero" central (fondo visible) con evenodd, y ninguno con nonzeroel atributo . [10]

Para polígonos simples , los algoritmos darán el mismo resultado. Sin embargo, para polígonos complejos , los algoritmos pueden dar resultados diferentes para puntos en las regiones donde el polígono se interseca a sí mismo, donde el polígono no tiene un interior y exterior claramente definidos. Una solución que utiliza la regla par-impar es transformar polígonos (complejos) en polígonos más simples que sean equivalentes a pares-impares antes de la verificación de intersección. [11] Sin embargo, esto es computacionalmente costoso. Es menos costoso utilizar el algoritmo de número de bobinado rápido distinto de cero, que da el resultado correcto incluso cuando el polígono se superpone a sí mismo.

Consultas de puntos en polígonos

El problema del punto en un polígono puede considerarse en el contexto general de una consulta geométrica repetida : dado un solo polígono y una secuencia de puntos de consulta, encontrar rápidamente las respuestas para cada punto de consulta. Claramente, se puede utilizar cualquiera de los enfoques generales para la ubicación de puntos planos . Existen soluciones más simples para algunos polígonos especiales.

Casos especiales

Son posibles algoritmos más simples para polígonos monótonos , polígonos en forma de estrella , polígonos convexos y triángulos .

El caso del triángulo se puede resolver fácilmente mediante el uso de un sistema de coordenadas baricéntrico , una ecuación paramétrica o un producto escalar . [12] El método del producto escalar se extiende naturalmente a cualquier polígono convexo.

Referencias

  1. ^ Ivan Sutherland et al., "Una caracterización de diez algoritmos de superficie oculta", 1974, ACM Computing Surveys vol. 6 núm. 1.
  2. ^ "Punto en polígono, una vez más..." Archivado el 24 de mayo de 2018 en Wayback Machine , Ray Tracing News , vol. 3 núm. 4, 1 de octubre de 1990.
  3. ^ Shimrat, M., "Algoritmo 112: Posición del punto en relación con el polígono" 1962, Comunicaciones de la ACM Volumen 5 Número 8, agosto de 1962. https://dl.acm.org/doi/10.1145/368637.368653
  4. ^ "¿Cómo comprobar si un punto dado se encuentra dentro o fuera de un polígono?". GeeksforGeeks . 2013-07-11 . Consultado el 2024-08-23 .
  5. ^ Hormann, K.; Agathos, A. (2001). "El problema del punto en el polígono para polígonos arbitrarios". Computational Geometry . 20 (3): 131. doi : 10.1016/S0925-7721(01)00012-8 .
  6. ^ Weiler, Kevin (1994), "Una prueba incremental de puntos angulares en polígonos", en Heckbert, Paul S. (ed.), Graphics Gems IV, San Diego, CA, EE. UU.: Academic Press Professional, Inc., págs. 16-23, ISBN 0-12-336155-9
  7. ^ ab Sunday, Dan (2001). «Inclusión de un punto en un polígono». Archivado desde el original el 26 de enero de 2013.
  8. ^ Pineda, Juan (agosto de 1988). Un algoritmo paralelo para rasterización de polígonos (PDF) . SIGGRAPH '88. Gráficos por computadora . Vol. 22, núm. 4. Atlanta . Consultado el 8 de agosto de 2021 .
  9. ^ "Pintura: relleno, trazo, colores y servidores de pintura – SVG Tiny 1.2". www.w3.org . Consultado el 24 de julio de 2021 .
  10. ^ "Pintura: relleno, trazo, colores y servidores de pintura – SVG Tiny 1.2". www.w3.org . Consultado el 24 de julio de 2021 .
  11. ^ Michael Galetzka, Patrick Glauner (2017). Un algoritmo par-impar simple y correcto para el problema de punto en polígono para polígonos complejos . Actas de la 12.ª Conferencia conjunta internacional sobre teoría y aplicaciones de visión artificial, imágenes y gráficos por ordenador (VISIGRAPP 2017), volumen 1: GRAPP.
  12. ^ Prueba del punto exacto en el triángulo " ...los métodos más famosos para resolverlo "

Véase también