Regla par-impar

algoritmo de geometría computacional

La regla par-impar (Even-Odd Rule) es un algoritmo implementado en software gráfico basado en vectores[1]​ como el lenguaje PostScript y los Gráficos Vectoriales Redimensionables (del inglés Scalable Vector Graphics) o SVG, que determina como se llena una forma gráfica con más de un contorno cerrado. La especificación de SVG dice: "Esta regla determina la "Interioridad" de un punto sobre un lienzo mediante la elaboración de una Semi-recta desde ese punto hacia el infinito en cualquier dirección y contando el número de veces que atraviesa un segmento trazado. Si el número es impar, el punto está dentro; si es par, el punto esta fuera."

Esta regla se puede ver, en efecto, en muchos programas gráficos vectoriales (como FreeHand o Illustrator), donde cruzar una línea en sí misma causa formas a llenar de extrañas maneras.

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.

Implementación

editar

Python

editar

Debajo un ejemplo de una implementación básica en Python:[2]

def EstaenRuta(x, y, poly):
        '''
        x, y -- x e y coordenadas del punto
        poly -- una lista de tuplas [(x, y), (x, y), ...]
        '''
        num = len(poly)
        j = num - 1
        c = False
        for i in range(num):
                if  ((poly[i][1] > y) != (poly[j][1] > y)) and \
                        (x < (poly[j][0] - poly[i][0]) * (y - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]):
                    c = not c
                j = i
        return c

Matlab

editar

Debajo una implementación del algoritmo en Matlab:

function p=EstaenPoligono(x,y,pol),
% x,y coordenadas del punto
% pol matriz con los puntos [[x,y];[x,y];....]
format long
n = length(pol);
j = n;
p = false;
for i=1:n,
    v = [pol(i,:);pol(j,:)];
    ymax = max(v(:,2));
    ymin = min(v(:,2));
    inter =((pol(j,1)-pol(i,1))*(y-pol(i,2))/(pol(j,2)-pol(i,2))+pol(i,1)); 
    if ((ymax > y) & (ymin < y)) & (x < inter),
        p = ~p;
    end
end
end

Referencias

editar
  1. J. D. Foley, A. van Dam, S. K. Feiner, and J. F. Hughes. Computer Graphics: Principles and Practice. The Systems Programming Series. Addison-Wesley, Reading, 2nd edition, 1990.
  2. «Copia archivada». Archivado desde el original el 21 de diciembre de 2014. Consultado el 28 de diciembre de 2014. 

Enlaces externos

editar