
La regla par-impar es un algoritmo implementado en software de gráficos vectoriales, [ 1 ] como el lenguaje PostScript y Scalable Vector Graphics (SVG), que determina cómo se rellenará una forma gráfica con más de un contorno cerrado. A diferencia del algoritmo de regla de no cero , este algoritmo coloreará y dejará sin colorear alternativamente las formas definidas por rutas cerradas anidadas, independientemente de su sinuosidad.
El SVG define la regla par-impar diciendo:
Esta regla determina si un punto del lienzo está dentro de un contorno trazando un rayo desde ese punto hasta el infinito en cualquier dirección y contando la cantidad de segmentos de la figura dada que el rayo atraviesa. Si este número es impar, el punto está dentro; si es par, el punto está fuera.
Esta regla puede observarse en muchos programas de gráficos vectoriales (como Freehand o Illustrator ), donde el cruce de un contorno consigo mismo provoca que las formas se rellenen de maneras extrañas.
En una curva simple, la regla par-impar se reduce a un algoritmo de decisión para el problema del punto en el polígono .
El estándar de gráficos vectoriales SVG puede configurarse para usar la regla par-impar al dibujar polígonos, aunque por defecto usa la regla de no cero . [ 2 ]
Implementación
A continuación se muestra un ejemplo parcial de implementación en Python , [ 3 ] utilizando un rayo a la derecha del punto que se está comprobando:
def is_point_in_path ( x : int , y : int , poly : list [ tuple [ int , int ]]) -> bool : """Determina si el punto está en la ruta, esquina o límite del polígono Argumentos: x -- Las coordenadas x del punto. y -- Las coordenadas y del punto. poly -- una lista de tuplas [(x, y), (x, y), ...] Devuelve: Verdadero si el punto está en la ruta o es una esquina o en el límite""" c = Falso para i en rango ( len ( poly )): ax , ay = poly [ i ] bx , by = poly [ i - 1 ] si ( x == ax ) y ( y == ay ): # el punto es una esquina devolver Verdadero si ( ay > y ) != ( by > y ): pendiente = ( x - ax ) * ( by - ay ) - ( bx - ax ) * ( y - ay ) si pendiente == 0 : # el punto está en el límite devolver Verdadero si ( pendiente < 0 ) != ( by < ay ): c = no c devolver cVéase también
Referencias
Enlaces externos
- Definición de reglas de relleno en SVG
- Algoritmos de gráficos por computadora
- Paridad (matemáticas)
- Esbozos de programación informática