En el captulo anterior se han introducido los objetos bsicos y transformaciones geomtricas para grficos por ordenador en bidimensional utilizando los principios de los grficos vectoriales. Como ya se mencion en la introduccin, dibujar objetos geomtricos en una estructura de grficos de trama requiere de algoritmos eficientes. Este captulo ilustra los problemas bsicos y soluciones en el contexto de dibujar lneas y curvas en grficos de trama.
3.1 Las lneas y grficos de pxeles
Dibujar una lnea que une los puntos (x 0, y0) y (x1, y1) dentro de la estructura de los grficos de trama parece ser una tarea muy sencilla. Sin embargo, resultar que un enfoque ingenuo puede conducir a algoritmos ineficientes o incluso a resultados inaceptables. Por razones de simplicidad, se supone que los dos puntos se conecten por la misma lnea en la trama de pxeles. Esto significa que sus coordenadas son dadas por valores enteros. Sin prdida de generalidad se supone que el primer punto no se encuentra bien con respecto al segundo punto. Esto significa que x 0 x1. Si esto no se satisface, los dos puntos simplemente no pueden compartir la lnea que se dibuja. El enfoque ingenuo trazar la lnea correspondiente en el trama de pxeles que paso gradualmente a travs de las x- coordenadas a partir de x0 y terminando en x1 y calcular el correspondiente valor para cada valor x. Dado que el valor de y por lo general no ser un valor entero, debe ser redondeado al valor entero ms cercano a fin de sacar el pxel ms cercano en la trama con los ejes x correspondiente y el valor de y redondeado. Figura 3.1 describe esta estrategia en pseudocdigo. En primer lugar, cabe sealar que el algoritmo producir un error en el caso de que una lnea vertical donde x0 = x1, la cual conduce a un error en la divisin por cero cuando se calcula la pendiente m de la lnea. Por supuesto, este caso especial podra ser fcilmente tratado por separado. Aunque el algoritmo ya no tendr problemas con la divisin por cero este todava no podr dibujar lneas aceptables como puede verse en la fi gura 3.2. La lnea superior en horizontal es tan perfecta como se puede esperar en grficos de trama. La lnea de abajo con una pendiente ligeramente negativa seala tambin correctamente en trminos de grficos de trama, teniendo en cuenta que, al menos en los pxeles momento- Puede extraerse de color negro completo o que se puede dejar en blanco.
Figura 3.1 Pseudocdigo para un algoritmo de lnea de dibujo ingenuo.
Figura 3.2 Lneas resultantes del algoritmo de lnea de dibujo ingenuo.
La lnea ideal que se aproxima a los pxeles dibujados tambin se incluye en la
figura con fines ilustrativos.
Sin embargo, la lnea en la parte inferior izquierda, en la posicin negativa no
se dibuja correctamente, incluso en trminos de la discretizacin necesaria para los grficos de trama. Una falta en el nmero de pxeles se debe a que debe ser elaborado por la representacin de la lnea en los grficos de trama. El problema es causado por el hecho de que el incremento de los valores de x es uno, pero debido a la gran pendiente absoluta de la lnea y el valor de la lnea cambiar por ms de uno. Esto conduce a dejar espacio en la representacin de la lnea en los grficos de trama, ya que los incrementos, o los saltos, en los valores de y son ms grandes que uno. El mismo efecto ocurrir para todas las lneas con un pendiente absoluto mayor que uno. Cuanto mayor es la pendiente de la lnea, mayores sern los vacos en la representacin de pxeles. El intercambio de los papeles de las direcciones x y el eje y para dibujar lneas con una pendiente absoluta mayor que uno resuelve el problema. Esto significa que en lugar de incrementar los valores de x por uno y calcular el valor correspondiente de y, en el que los valores se incrementan y los valores correspondientes de x se calculan para la lnea. Esto tambin resuelve el problema mencionado anteriormente de la divisin por cero para las lneas verticales. Una lnea vertical con la pendiente infinita se convierte en una lnea horizontal con pendiente cero, cuando se intercambian los ejes de coordenadas. Trazar una lnea en una trama de pxeles es una tarea dentro de los grficos por ordenador que tiene que ser llevada a cabo muchas veces incluso para una sola imagen. Por lo tanto, se necesitan algoritmos de dibujo de lneas eficientes para acelerar las imgenes de dibujo. Se podra utilizar el algoritmo de lnea de dibujo ingenuo que describe en figura 3.1 y extenderla por el necesario intercambio de los ejes de coordenadas para lneas con pendiente absoluto mayor que uno. Pero an hay dos opciones en la ltima lnea del pseudocdigo. La primera frmula requiere solamente una sola adicin (suma) para calcular el valor de y de la lnea en el siguiente paso. El segundo paso necesita dos adiciones (sumas) y una multiplicacin. Una multiplicacin exige ms tiempo de clculo que una adicin. Por lo tanto, se debe preferir la primera versin para el clculo del valor de y. La nica desventaja de esta frmula es el peligro de que en la ronda acumule errores. Sin embargo, esto puede despreciarse, ya que el nmero de iteraciones en el bucle est limitado por el nmero de pxeles en las direcciones de los ejes (X) y (Y). As que, incluso en el caso de un monitor de mayor y alta resolucin, el bucle no puede contener ms de unos pocos miles de iteraciones. Debido a
que el redondeo a un nmero entero debe llevarse a cabo al final de todo,
incluso en la ronda el acumulo de error se puede despreciar.
3.2 El algoritmo de punto medio para las lneas
Dibujo de lneas pueden llevarse a cabo de una manera mucho ms rpido que el algoritmo de lnea de dibujo ingenuo de la seccin anterior. El algoritmo de lnea de dibujo ingenuo se basa en la aritmtica de punto flotante para la determinacin de pxel entero redondeado coordina. Desde la aritmtica de enteros es mucho ms rpido que fl punto flotante aritmtica, una considerable aceleracin del algoritmo de dibujo de lnea se podra lograr, si la aritmtica de punto flotante podra evitarse por completo. Un algoritmo de dibujo lineal confiar slo en la aritmtica de enteros se introdujo por JE Bresenham [1]. Este algoritmo se explicar a continuacin. Al examinar la lnea ingenua algoritmo de dibujo en detalle, ya se seal que debe garantizarse que la lnea que se extrae tiene una pendiente en absoluto de lo ms una. Para una recta con pendiente absoluta superior a uno, los roles de los ejes de coordenadas se intercambian para el dibujo, lo que lleva a una recta con pendiente absoluta de menos de uno en la modificacin del sistema de coordenadas. As, en cualquier caso, antes de comenzar a calcular los pxeles reales que representan una lnea, el primer paso es decidir qu eje de coordenadas debe ser considerado como el eje x con el fin de asegurarse de que la lnea tiene una pendiente absoluta de a lo sumo uno. Por lo tanto, se asume por las siguientes consideraciones que una recta con pendiente absoluta de menos de uno hay que sacar. Las consideraciones son incluso restringido al caso que la pendiente es de entre 0 y 1. Para las lneas con una pendiente entre 0 y -1 un algoritmo correspondiente puede ser desarrollado de forma anloga.