Вы находитесь на странице: 1из 3

Rellenado de polgonos

Ruiz Gonzlez Juan Carlos


Ingenieria en Sistemas Computacionales Universidad de Guanajuato Email: jc.ruiz.gonzalez@ugto.mx

I.

O BJETIVO

Para algn r, s en [0, 1] Resolviendo lo anterior para r y s se obtiene: r= (Ay Cy)(Dx Cy) (Ax Cy)(Dy Cy) (Bx Ax)(Dy Cy) (By Ay)(Dx Cx) (6)

Implementar un algoritmo de rellenado de polgonos el cual utilice las primitivas de dibujado desarrolladas en el curso. II. J USTIFICACIN

EL conocer la forma de implementar primitivas de pintado computacionalmente es una tarea importante a la hora de desarrollar grcos por computadora, por lo que es conveniente entender a la base algebraica de la que estamos partiendo para esta labor. En el presente reporte se muestran los resultados de la implementacin de un algoritmo para rellenado de guras poligonales. III. M ARCO TERICO

s=

(Ay Cy)(Bx Ax) (Ax Cx)(By Ay) (Bx Ax)(Dy Cy) (By Ay)(Dx Cx)

(7)

Examinando los valores de r y s se puede determinar: si 0 r 1 y 0 s 1 (8)

Para el desarrollo de esta prctica se selecciono un algoritmo de rellenado de reas basado en lo siguiente: 1. Encontrar las intersecciones de la lnea de rastreo con todas las aristas del polgono. 2. Ordenar las intersecciones de forma incremental para coordenadas de x. 3. Llenar los pixeles entre pares de intersecciones que estn en el interior del polgono, usando una regla de no paridad para determinar que un punto esta dentro de una regin: La paridad es originalmente par, y cada vez que se encuentra una interseccin, se invierte la paridad. Se dibuja solo cuando la paridad es non, no se dibuja si es par. Para el calculo de las intersecciones entre la recta de rastreo y las aristas del polgono se hicieron las siguientes consideraciones para calcular intersecciones entre dos rectas: Siendo A, B, C, D vectores de posicin, los segmentos de linea dirigidos, estan dados por: AB = A + r(B A), r en [0, 1] CD = C + s(D C), s en [0, 1] Si AB y CD se intersectan, entonces: A + r(B A) = C + s(D C), o Ax + r(Bx Ax) = Cx + s(Dx Cx) Ay + r(By Ay) = Cy + s(Dy Cy) (3) (4) (5) (1) (2)

Existe interseccin. En caso de que se cumpla la condicin se procede a calcular el punto de interseccin: P = A + r(B A) P x = Ax + r(Bx Ax) P y = Ay + r(By Ay) IV. D ESARROLLO (9) (10) (11)

El programa fue desarrollado en lenguaje C utilizando OpenGL para el manejo de grcos y la librera freeglut para las ventanas. Para simplicar el manejo de los vrtices y de las rectas se decidi implementar dentro de la biblioteca primitives.h una estructura vrtice la cual contiene el valor de x y y y una estructura linea la cual contiene el vrtice inicial y el vrtice nal. Se desarrollo una funcin llamada poligonFill la cual recibe la cantidad de lados del polgono, un puntero con la informacin de las lineas que lo conforman y los valores x mnima, x mxima, y mnima, y mxima los cuales son los puntos extremos del polgono, en esta funcin se realizan las operaciones de deteccin de intersecciones, ordenamiento de vertices encontrados y pintado de las lineas que conforman el rellenado.

Para las intersecciones se crearon dos funciones llamadas intersectRect e intersectPoint, la primera recibe los vrtices de la linea de de escaneo, los vrtices de la linea con la que se comparar y un puntero donde se almacenara el vrtice en caso de que exista punto de interseccin en caso de que exista. La intersectPoint recibe como argumentos los mismos que recibe intersectRect mas un argumento r de tipo otante el cual se calcula en intersectRect. El ordenamiento de los vrtices se realizo mediante un algoritmo del tipo de burbuja (funcin bubbleSort) que aunque no es la forma optima de resolver esta tarea es una opcin rpida de implementar.
Figura 3. Romboide en su escala original

Una vez que se calcularon los vrtices y se ordenaron de manera ascendente con respecto de x, se dibujaron las rectas utilizando la primitiva de recta DrawLine desarrollada en clase. V. R ESULTADOS

A continuacin se muestran tomas de pantalla de polgonos Rellenados con esta primitiva:

Figura 4. Polgono irregular de 5 lados en su escala original

Figura 1. 4 polgonos diferentes escalados en 0.5 en x,y,z

Figura 5. Hexgono en su escala original

VI.

C ONCLUSIONES

Figura 2. Polgono irregular de 9 lados en su escala original

Al implementar este algoritmo de rellenado hubo algunas dicultades debido a que al inicio no entenda a que se refera con regla de no paridad, una vez entendido esto fue mas fcil realizar la implementacin en cdigo. Uno de los problemas encontrados a la hora de la implementacin es que los polgonos muestran una parte no rellenada en el punto

donde se interceptan 2 lineas como es el caso de 2 y 5, esto se debe a que al ordenar los vrtices, el vrtice 1 y el vrtice 2 son iguales al igual que el vrtice 3 y el vrtice 4, lo que provoca que se "dibuje una recta en el mismo punto", al intentar corregir este fallo haciendo que el algoritmo omitiera los vrtices repetidos, me encontr con el problema de que los polgonos irregulares no se dibujan correctamente, por lo que decid mantener esa linea por el momento. R EFERENCIAS
[1] Alfredo Weitzenfeld. Rellenado de Area http://cannes.itam.mx/Alfredo/Espaniol/Cursos/Graca/Relleno.pdf [2] 1.03: How do I nd intersections of 2 2D line segments? http://www.faqs.org/faqs/graphics/algorithms-faq/

Вам также может понравиться