Regla par-impar

algoritmo de geometría computacional From Wikipedia, the free encyclopedia

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."

Diagrama que muestra cómo se rellena una curva (arriba) según dos reglas: la regla de pares e impares (izquierda) y la regla de curvatura distinta de cero (derecha). La cuestión es relevante en informática para los gráficos bidimensionales.

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

Python

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

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

Enlaces externos

Related Articles

Wikiwand AI