Está en la página 1de 14

UNIVERSIDAD NACIONAL DE SAN MARTN

FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA

Algoritmos de Trazado de lneas, Rectas Horizontales y Verticales


DOCENTE : Ing. Carlos Franois Hidalgo Retegui.

ASIGNATURA

: Computacin Grfica

SEMESTRE ACADEMICO

: Ciclo 2010- I

ALUMNO

: Antony Armas Snchez

Tarapoto, junio 2013

INTRODUCCION

Desde los primeros aos de la computacin grafica, se vio la necesidad de poder recrear imgenes de la vida real por medio del computador. Pero se tuvo muchos inconvenientes, para poder superar estos inconvenientes se necesito de la utilizacin de las matemticas ms especficamente de la geometra bsica tambin conocida como Primitivas Graficas; dentro de la geometra bsica se encuentran las siguientes figuras: el punto, la recta y las cnicas. Existen varios mtodos para desarrollar lneas pero uno de los mejores mtodos es el algoritmo de lnea de Bresenham, es un algoritmo preciso y efectivo para la generacin de lneas de rastreo, convierte mediante rastreo las lneas al utilizar solo clculos incrementales con enteros que se pueden adaptar para desplegar rectas, circunferencias y otras curvas. Bresenham mediante su algoritmo nos evita el uso del redondeo, utilizando la aritmtica entera en lugar de aritmtica en coma flotante.

LNEAS
El trazo de lneas se efecta mediante el clculo de posiciones intermedias a lo largo de la trayectoria de la lnea entre dos posiciones extremas especficas. Un dispositivo de salida se dirige para llenar estas posiciones entre los extremos. Cuando se tienen dispositivos anlogos, como un trazado vectorial a base de pluma o un despliegue de rastreo aleatorio, se puede trazar una lnea recta de manera tenue de un extremo al otro. Se generan voltajes de deflexin horizontal y vertical linealmente variables que son proporcionales a los cambios requeridos en las direcciones de x y y para reducir la lnea de tenue. Los dispositivos digitales despliegan un segmento de lnea al trazar puntos discretos entre los dos extremos. Las posiciones de coordenadas discretas a lo largo de la trayectoria de la lnea se calculan a partir de la ecuacin de la lnea. Para un despliegue de video de rastreo, el color (intensidad) de la lnea se carga entonces en el bfer de estructura en las coordenadas de pxel correspondientes. A continuacin, al leer el bfer de estructura en las coordenadas el controlador de video traza los pixeles de la pantalla. Las posiciones en la pantalla se expresan como valores enteros de modo que las posiciones trazadas slo puedan aproximarse a las posiciones de lnea reales entre dos extremos especficos. Por ejemplo, una posicin de lnea calculada de (10.48, 20.51) se convertir a la posicin de pxel (10.21). Este redondeo de valores de coordenadas a enteros provoca que las lneas se desplieguen con una apariencia de escalones (los peldaos).

Algoritmos para el Trazo de Lneas


La ecuacin de interseccin de la pendiente cartesiana de una lnea recta es (1) y=mx+b Donde m representa la pendiente de la lnea y b la interseccin de y. Dado que los dos extremos de un segmento de lnea se especifica en las posiciones (x1, y1) y (x2, y2), se puede determinar valores para la pendiente y la interseccin de y en b con los siguientes clculos: (2) m = (y2 - y1)/(x2 - x1) (3) b = y1 - m x1 Para cualquier x dentro del intervalo Dx a lo largo de una lnea, se puede calcular el intervalo correspondiente a Dy de y a partir de la ecuacin (2) como (4) Dy = m Dx. De modo similar se puede obtener el intervalo Dx de x correspondiente a un Dy especfica como: (5) Dx = Dy / m Si | m | < 1, la lnea es mas horizontal que vertical. Segn tiende a cero m, la lnea tiende a ser horizontal. Si | m | > 1, la lnea es mas vertical que horizontal. Segn tiende a infinito m, la lnea tiende a ser vertical. El siguiente paso es efectuar un muestreo de la lnea a puntos discretos correspondiente a los pixeles ms cercanos.

1. Algoritmo Bsico El algoritmo bsico sera utilizar la ecuacin anterior para calcular y en termino de x (o viceversa). Esto sera bastante lento ya que requerira siempre una multiplicacin ms una suma: y=mx+b Los siguientes algoritmos mostrarn como se pueden hacer ms eficientes estos clculos utilizando algoritmos ms elaborados.

1.1 Algoritmo de Lnea DDA El analizador diferenciador digital (DDA - Digital Differential Analyzer) es un algoritmo de conversin de rastreo que se basa en el calculo ya sea de Dy o Dx por medio de las ecuaciones (4) o (5). Se efecta un muestreo de la lnea en intervalos unitarios en una coordenada y se determina los valores enteros correspondientes mas prximos a la trayectoria de la lnea para la otra coordenada. Tomemos una lnea con pendiente positiva, si la pendiente | m |<=1, se hace el muestreo en x en intervalos unitarios (Dx = 1 y Dy = m dado que m = Dy / Dx) y se calcula cada valor sucesivo de y como: (6) yk+1 = yk+ m El subndice toma valores enteros a partir de 1 y aumenta a razn de 1 hasta alcanzar el valor final. Ya que m puede ser cualquier numero real entre 0 y 1, los valores calculados de y deben redondearse al entero mas cercano. Para lneas con una pendiente | m | > 1, se revierten las funciones de x y y, o sea, se realiza un muestreo de y en intervalos unitarios (Dy = 1 y Dx = 1/m dado que m = Dy / Dx) y se calcula cada valor sucesivo de x como: (7) xk+1 = xk+ 1/m Las ecuaciones (6) y (7) se basan en la suposicin de que las lneas deben procesarse del extremo izquierdo al derecho. Si este procesamiento se revierte, entonces Dx o Dy serian -1, y yk+1 = yk - m o xk+1 = xk - 1/m El procedimiento completo de dibujo seria el siguiente: void Line(Display* display, Window win, GC gc, int x0, int y0, int x1, int y1) { float x, y, xs, ys; int dx, dy, steps; dx = x1 - x0; dy = y1 - y0; /* se asigna el punto de donde se comenzara a dibujar la lnea */ x = x0; y = y0;

/* verificar si la pendiente es mayor de x o y, para luego asignarla a steps */ if (abs(dx) > abs(dy)) steps = abs(dx); else steps = abs(dy); /* se divide por la pendiente mayor, para dar xs o ys igual a 1 (o -1) */ if (steps == 0) { XDrawPoint(display,win,gc,round(x),round(y)); fprintf(stderr,this line is a point); return; } xs = dx/steps; ys = dy/steps; /* se cicla uno a la vez hasta llegar al nmero de steps mximo */ for (i = 0; i <= steps; i++) { XDrawPoint(display,win,gc,round(x),round(y)); /* round(x) x+0.5 */ x = x + xs; y = y + ys; } }

->

El problema con este algoritmo es que se debe redondear nmeros flotantes a enteros y hacer operaciones sobre nmeros flotantes, lo cual toma tiempo. Para lneas largas, la acumulacin de errores de redondeo en adiciones sucesivas del incremento de punto flotante pueden provocar que las posiciones del pixel calculadas se desven de la trayectoria real de la lnea. Se puede mejorar el desempeo del algoritmo al separar los incrementos m y 1/m en partes enteras y fraccionarias, de forma que todos los clculos se reduzcan a operaciones de enteros.

1.2 Algoritmos de Lnea Bresenham Bsico Un algoritmo preciso y efectivo para la generacin de lneas de rastreo, desarrollado por Bresenham (1965), convierte mediante rastreo las lneas utilizando solo clculos incrementales con enteros que se pueden adaptar para desplegar tambin curvas. El algoritmo busca cual de dos pixeles es el que esta mas cerca segn la trayectoria de la lnea. Consideremos el proceso de conversin para lneas con pendiente positiva 0 < m < 1. Las posiciones de pixel a lo largo

de la trayectoria de una lnea se determinan al efectuar un muestreo de x en intervalos unitarios. Si se inicia desde el extremo izquierdo (x0,y0) de una lnea determinada, se pasa a cada columna sucesiva y se traza el pixel cuyo valor de y se aproxima mas a la trayectoria de la lnea de rastreo. Si suponemos que se debe desplegar el pixel en (xk,yk), a continuacin se necesita decidir que pixel se debe desplegar en la columna xk+1. Las alternativas son los pixeles (xk+1,yk), y (xk+1,yk+1). Al realizar el muestreo en la posicin xk+1 designamos la separacin de pixeles verticales de la trayectoria de la lnea matemtica como d1 y d2. La coordenada de y en la lnea matemtica en la posicin de la columna de pixel xk+1 se calcula como (10) y = m (xk + 1) + b Entonces: d1 = y - yk = m (xk + 1) + b - yk y d2 = (yk + 1) - y = yk + 1 - m (xk + 1) - b La diferencia entre estas dos separaciones es (11) d1 - d2 = 2 m (xk + 1) - 2 yk + 2 b -1 Un parmetro de decisin pk para el paso k en el algoritmo de lnea se puede obtener al reordenar la ecuacin anterior, de modo que implique solo clculos de enteros. Esto se logra sustituyendo m = Dy / Dx donde Dx y Dy son las separaciones horizontal y vertical de las posiciones de los extremos de la lnea y al definir: (12) pk = Dx (d1 - d2) = Dx (2 Dy / Dx (xk + 1) - 2 yk + 2 b - 1) = 2 Dy xk - 2 Dx yk + 2 Dy + 2 b Dx Dx = 2 Dy xk - 2 Dx yk + c El signo de pk es el mismo que el de d1 - d2 puesto que Dx > 0 en el ejemplo. El parmetro c es un constante, donde c = 2 Dy + 2 b Dx - Dx, que es independiente del pixel. Si el pixel yk esta mas cerca de la trayectoria de la lnea que el pixel yk + 1 (es decir d1 < d2), entonces el parmetro de decisin pk es negativo. En ese caso, trazamos el pixel inferior; de otro mode, trazamos el pixel superior.

Los cambios de coordenadas a lo largo de la lnea ocurren en pasos unitarios ya sea en la direccin de x o en la de y. Por tanto, es posible obtener los valores de parmetros de decisin sucesivos al utilizar clculos incrementales en enteros. En el paso k + 1, el parmetro de decisin se evala con base en la ecuacin anterior como pk+1 = 2 Dy xk+1 - 2 Dx yk+1 + c Al sustraer la ecuacin (12) de la anterior obtenemos pk+1 - pk = 2 Dy (xk+1 - xk) - 2 Dx( yk+1 - yk) Pero xk+1 = xk + 1, de manera que (13) pk+1 = pk + 2 Dy - 2 Dx( yk+1 - yk) Donde el termino yk+1 - yk es 0 o 1, dependiendo del signo del parmetro p. Este clculo recurso de los parmetros de decisin se realiza en cada posicin entera de x, empezando en el extremo izquierdo de las coordenadas de la lnea. El primer parmetro p0 se evala a partir de la ecuacin (12) en la posicin del pixel inicial (x0,y0), sustituyendo con b = y0 - m x0 y m = Dy / Dx. p0 = Dx (2 Dy / Dx(x0 + 1) - 2 y0 + 2 (y0 - (Dy / Dx) x0) - 1) = 2 Dy x0 + 2 Dy 2 Dx y0 + 2 Dx y0 - 2 Dy x0 - Dx Donde se obtiene la siguiente ecuacin: (14) p0 = 2 Dy - Dx En resumen, los pasos son: 1. Se capturan los dos extremos de la lnea y se almacena el extremo izquierdo en (x0,y0). 2. Se carga (x0,y0) en el bufer de estructura, o sea, se traza el primer punto. 3. Se calculan las constantes Dy, Dx, 2Dy, 2Dy-2Dx, y se obtiene el valor inicial para el parmetro de decisin como p0 = 2 Dy - Dx. 4. En cada xk a lo largo de la lnea, que inicia en k = 0, se efecta la prueba siguiente: si pk < 0, el siguiente punto que se debe trazar es (xk+1,yk) y pk +1 = pk + 2 Dy. De otro modo, el siguiente punto en trazarse es

(xk+1,yk+1) y

pk +1 = pk + 2 Dy - 2Dx.

5. Se repite el paso 4 otras Dx veces. Ejemplo Para ilustrar el algoritmo, utilicemos la lnea con extremos (20,10) y (30,18). Esta lnea tiene una pendiente de 0.8, con Dx = 10, Dy = 8 El parmetro de decisin inicial tiene el valor p0 = 2 Dy - Dx = 6 y los incrementos para calcular parmetros de decisin sucesivos son 2Dy = 16, 2Dy - 2Dx = -4 Trazamos el punto inicial (x0,y0) = (20,10) y determinamos las posiciones de pixel sucesivos a lo largo de la trayectoria de la lnea a partir del parmetro de decisin como

Un trazo de pixeles se genera a lo largo de la trayectoria de esta lnea. En la siguiente rutina, se presenta una implementacin del trazo de lneas de Bresenham para pendiente en el rango 0 < | m | < 1, con trazo de izquierda a derecha en el caso de m positivo y de derecha a izquierda en el caso de m negativo. void LineBres(Display* display, Window win, GC gc, int x0, int y0, int x1, int y1) { int x, y, dx, dy, xend, p, incE, incNE; dx = abs(x1 - x0); dy = abs(y1 - y0); p = 2*dy - dx; incE = 2*dy; incNE = 2*(dy-dx); /* determinar que punto usar para empezar, cual para terminar */ if (x0 > x1) { x = x1;

y = y1; xend = x0; } else { x = x0; y = y0; xend = x1; } /* se cicla hasta llegar al extremo de la lnea */ while (x <= xend) { XDrawPoint(display,win,gc,x,y); x = x + 1; if (p < 0) p = p + incE else { y = y + 1; p = p + incNE; } } } El algoritmo de Bresenham se generaliza para lneas con una pendiente arbitraria al considerar la simetra entre los diversos octantes y cuadrantes del plano de xy. Para una lnea con una pendiente m > 1, intercambiamos las funciones de las direcciones de x y y, o sea, pasamos a lo largo de y en pasos unitarios y calculamos los valores sucesivos de x que se aproximan mas a la trayectoria de la lnea. Asimismo, podemos revisar el programa para trazar pixels iniciando desde cualquier extremo. Si la posicin inicial para una lnea con una pendiente positiva es el extremo derecho, tanto x como y disminuyen conforme pasamos de derecha a izquierda. Con el fin de asegurarnos de que los mismos pixeles se tracen sin que importe el extremo en que se comienza, se seleccionara el pixel superior (o inferior) cuando se pase exactamente en el medio (d1 = d2). En el caso de pendientes negativas, los procedimientos son similares excepto que ahora, una coordenada decrece conforme la otra aumenta. Por ultimo, es posible manejar los casos especiales por separado. Las lneas horizontales (Dy = 0), las lneas verticales (Dx = 0) y las diagonales | Dy | = | Dx | se pueden cargar en forma directa sin procesarlas mediante el algoritmo para el trazo de lneas.

Ventajas El clculo del valor en una iteracin del bucle es incremental con respecto al valor en la iteracin anterior, pero adems. Evita el uso del redondeo. Sobre todo, hace uso de aritmtica entera en lugar de aritmtica en coma flotante. Ejemplo Para ilustrar el algoritmo, utilicemos la lnea con extremos (20,10) y (30,18). Esta lnea tiene una pendiente de 0.8, con Dx = 10, Dy = 8 El parmetro de decisin inicial tiene el valor p0 = 2 Dy - Dx = 6 y los incrementos para calcular parmetros de decisin sucesivos son 2Dy = 16, 2Dy - 2Dx = -4 Trazamos el punto inicial (x0,y0) = (20,10) y determinamos las posiciones de pixel sucesivos a lo largo de la trayectoria de la lnea a partir del parmetro de decisin como k pk (xk+1,yk+1)

El programa se muestra a continuacin (solo para 0<|m|<1): void LineMidPoint(Display* display, Window win, GC gc, int x0, int y0, int x1, int y1) { int x, y, dx, dy, xend, p, incE, incNE; dx = x1 - x0; dy = y1 - y0; p = 2*dy - dx; incE = 2*dy; incNE = 2*(dy-dx); /* determinar que punto usar para empezar, cual para terminar */ if (x0 > x1) {

x = x1; y = y1; xend = x0; } else { x = x0; y = y0; xend = x1; } /* se cicla hasta llegar al extremo de la lnea */ while (x <= xend) { XDrawPoint(display,win,gc,x,y); x = x + 1; if (p <= 0) p = p + incE; else { y = y + 1; p = p + incNE; } } } Es importante que el trazo partiendo de cualquiera de ambos extremos contenga exactamente los mismos pixeles. El nico lugar donde la seleccin de pixel depende de la direccin de la lnea es cuando pasa exactamente por el medio, y la variable de decision es cero; de izquierda a derecha se escoge E. Por simetra al ir de la derecha a la izquierda se esperara escoger W cuando p=0, pero eso escogera un pixel una unidad hacia arriba en y relativo al escogido al pixel escogido de izquierda a derecha. Por lo tanto se necesita escoger SW cuando p=0 para el trazo de derecha a izquierda. Ajustes similares se deben hacer para lneas en otras pendientes. La solucin alternativa de intercambiar los extremos de la lnea para que el trazo siempre proceda en la misma direccin no trabaja cuando se usan estilos de lnea. Si el algoritmo siempre pone a los extremos en orden cannico, el patrn ira de izquierda a derecha para un segmento, y de derecha a izquierda para otro adjunto, como funcin de la pendiente de la segunda lnea; esto creara una discontinuidad inesperada en el vrtice compartido.

TRAZADO DE RECTAS Para trazar rectas en el computador se debe tomar a la pantalla de una computadora como un sistema de plano cartesiano en donde se realizara la representacin de la recta. Se necesitara el clculo de posiciones intermedias en la trayectoria que se recorre para dos posiciones en el espacio en este caso la pantalla del computador. Tambin es necesario saber o tener el conocimiento de la ecuacin de la recta y las propiedades que esta tiene. Recta verticales Las rectas verticales son aquellas rectas que son paralelas al eje Y es decir que los puntos de las coordenadas X0 ( inicio) y Xf (final) son iguales solo estn influenciadas por el rango de Y0 (inicio)y Yf(final), adems que no contiene pendiente, miremos la imagen para ser mas especficos.

Rectas horizontales Las rectas horizontales son aquellas rectas paralelas al eje X es decir que Y0(inicio) y Yf (final) son iguales, y solo estn definidas por Xo (inicio) y Xf(final), tampoco cuentan con pendiente.

Importancia de la rectas 1.-La recta es un elemento bsico de grficos y es uno de los ms usados. 2.-La recta crea la separacin en un grafico o denota los lmites de un grafico. 3.-La unin de rectas genera un trazo, los trazos generan volumen a los dibujos. 4.-Repetion de rectas prximas genera planos y texturas.

También podría gustarte