LISTO


Algoritmo de línea de Bresenham

Un algoritmo de línea más efectivo para determinar las posiciones del pixel, creado por Bresenham, halla las coordenadas enteras más próximas a la trayectoria real de la recta utilizando solamente aritmética entera. Las posiciones de los pixeles en la pantalla se representan por las áreas rectangulares situadas entre líneas de una retícula. En cada uno de estos ejemplos, se necesita escoger entre dos alternativas de pixel en cada posición x. Comenzando desde el punto extremo izquierdo de la recta de la figura 3, se necesita determinar si el siguiente punto en la recta se trazará en la posición (11, 10) o bien en (11, 11). En forma análoga, la figura 4 muestra una trayectoria en línea con pendiente negativa. Aquí, se necesita escoger entre los puntos (51, 50) y (51, 49) como la siguiente posición de pixel que se encenderá. El siguiente pixel que se grafique en cada uno de estos ejemplos será aquel cuyo valor de y está más próximo a la posición real de y sobre la recta.

FIGURA 3 FIGURA 4

Una vez más, empezamos con una recta cuya pendiente es positiva y menor que 1. Las posiciones de los pixeles a lo largo de la trayectoria de la línea pueden trazarse después tomando etapas unitarias en la dirección x y determinando el valor de la coordenada y del pixel más cercano a la recta en cada etapa. Para establecer los cálculos que se necesitan en el algoritmo, se considera la situación que se muestra en la figura 5. Esta figura se supone que la posición del pixel (xi, yi) se ha trazado y ahora se necesita decidir cuál es el siguiente pixel que se graficará. Las dos alternativas de la siguiente posición del pixel están en las coordenadas (xi + 1 , yi) y (xi + 1 , yi + l).

FIGURA 5 FIGURA 6

En la figura 6, las diferencias de coordenadas entre el centro de los dos pixeles y la coordenada y de la recta se rotulan d1, y d2. La posición y puede calcularse como

 y = m(xi + l) + b

 

Por lo tanto,

d1 = y - yi

  = m(xi + 1) + b - yi

d2 = (yi + 1) - y

  = yi + 1 - m(xi + 1) - b

  

La diferencia entre estas dos distancias es

d1 - d2 = 2m(xi + 1) - 2yi + 2b -1 (9)

 

Ahora definiremos un parámetro que ofrece una medida de las distancias relativas de dos pixeles de la posición actual sobre una recta dada. De la sustitución de m = dy/dx se puede reescribir la ecuación 9 de manera que comprenda solamente aritmética entera:

pi = dx(d1 - d2) (10)

= 2dy . xi - 2dx . yi + c

  

La constante c tiene el valor 2dy + dx(2b - l) y se podría calcular una sola vez para todos los puntos, pero se observará que la ecuación 10 puede ser revisada a fin de eliminar esta constante. El parámetro pi tiene un valor negativo, si el pixel en la posición yi está más próximo a la recta que el pixel superior. En este caso, se selecciona el pixel inferior; de lo contrario, se elige el píxel superior.

La ecuación 10 se simplifica relacionando parámetros de intervalos sucesivos de x. Por lo tanto, el valor de cada parámetro sucesivo se obtiene a partir del parámetro calculado con anterioridad. Podemos reescribir la ecuación 10 en la forma

pi+1 = 2dy . xi+1 - 2dx . yi+1 + c

 

Restando la ecuación 10 de esta expresión se tiene

pi+1 - pi = 2dy . (xi+1 - xi) - 2dx . (yi+1 - yi)

Pero xi+1 = xi + 1, de modo que

pi+1 = pi + 2dy - 2dx . (yi+1 - yi) (11)

Esta ecuación nos da una manera de calcular el valor de cada parámetro sucesivo a partir del anterior. El primer parámetro, p1, se obtiene de la evaluación de la ecuación 10 con (x1, y1) como punto extremo inicial y m = dy/dx:

p1 = 2dy - dx (12)

Las etapas del algoritmo de Bresenham se resumen en el siguiente algoritmo, para una recta con pendiente positiva menor que 1. Como las constantes 2dy, dx y 2(dy-dx) necesitan ser evaluadas y almacenadas sólo una vez, la aritmética comprende únicamente la adición y la sustracción de enteros.

  


1. Dé como entrada los extremos de la línea. Almacene el punto de extremo izquierdo en (x1, y1). Almacene el extremo derecho en (x2, y2)

2. El primer punto que se seleccionará para desplegarse es el punto extremo izquierdo (x1, y1).

3. Calcule dx = x2 - x1, dy = y2 - y1 y p1 = 2dy - dx. Si p1 = 0, el siguiente punto que se fijará es (x1 + 1, y1). En caso contrario, el siguiente punto es (x1 + 1, y1 + l).

4. Continú eincrementando la coordenada x en pasos unitarios. En la posición xi + 1, la coordenada que se seleccionará, yi+1, es yi o bien yi+1, según pi < 0 o bien pi >= 0. Los cálculos de cada parámetro p dependen del último. Si pi < 0, la forma del siguiente parámetro es

pi+1 = pi + 2dy

Pero si pi >= 0, el siguiente parámetro es

pi+1 = pi + 2(dy-dx)

Por lo tanto, si pi, < 0, la siguiente coordenada y que se seleccionará es yi+1. En caso contrario, seleccione yi+1 + 1. (La coordenada yi+1 se determinó como yi o bien yi+1 por medio del parámetro pi, del paso 3.)

5. Repita os procedimientos del paso 4 hasta que la coordenada x llegue a x2


Un procedimiento para implantar el algoritmo se da en el programa que sigue. Las coordenadas de los puntos extremos de la recta sirven de entrada para este procedimiento a través de los parámetros x1, yl, x2 y y2. La llamada de set_pixel fija la posición en el buffer de estructura para el punto seleccionado.

 

procedure bres_line (xl, yl, x2, y2 : Integer);

var dx, dy, x, y, x_end, p, const1, const2 : lnteger;

begin

dx = abs(x1 - x2);

dy = abs(y1 - y2);

p = 2 dy - dx;

const1 = 2 dy;

const2 = 2 (dy - dx);

{determíne qué punto usar como inicial, cuál como final}

if x1 > x2 then begin

x = x2; y = y2;

x_end = x1

end {if x1 > x2}

else begin

x = x1; y = y1;

x_end = x2

end; {if x1 < = x2}

set_pixel (x, y);

whíle x < x_end do begin

x = x + 1;

if p < 0 then p = p + const1

else begin

y = y + 1;

p = p + const2

end; {else begin}

set_pixel (x, y)

end {while x < x_end}

end; {bres_line}

  

Hasta ahora nos hemos limitado al estudio de rectas con pendiente positiva entre 0 y 1.

Que se debe hacer para ampliar el algoritmo a pendientes positivas mayores que uno?

HASTA AQUI EL PRIMER EJERCICIO

 


Llenado de áreas

Cuando van a aplicarse modelos de sombreado a color a áreas de una escena o gráfica, conviene al usuario poder especificar el área que se llenará. Aunque los modelos de llenado podrían aplicarse a los interiores de los límites de un polígono definido con un comando de líneas, el procesamiento se simplifica si se utiliza un procedimiento aparte para definir el llenado de un área. Este punto de vista permite que un área designada se señale de inmediato como aquella que se desplegará con un interior especificado.

Se preenta el comando siguiente para definir el llenado del área de un polígono (el comando dependerá del lenguaje de programación utilizado):

 fill_area (n, x, y)

El área que se llenará está dentro del límite o frontera definido por la serie de n segmentos de línea conectados de (x[1], y[1]) a (x[n], y[n]) y de regreso a (x[1], y[1]

La implantación del comando fill_area de un paquete de gráficas depende del tipo de llenado que se use para desplegar el área. Un usuario podría desear que el área quedara en blanco o bien se llenara con un color sólido o algún patrón. Cuando el interior del área se deja en blanco, fill_area simplemente produce el perfil de la frontera o límite.


 

Algoritmos de generación de circunferencias

Como la circunferencia es una componente común de muchos tipos de imágenes y gráficas, los procedimientos para generar circunferencias (y elipses) se incluyen a menudo en paquetes de gráficas. Los parámetros básicos que definen una circunferencia son las coordenadas del centro (xc, yc) y el radio r (fig. 12). Podemos expresar la ecuación de una circunferencia en varias formas, mediante parámetros de coordenadas Cartesianas o polares. La figura 13 muestra la relación existente entre los parámetros Cartesianos y los polares.

FIGURA 12 FIGURA 13


 

Ecuacíones de circunferencias

 Una forma estándar de la ecuación de la circunferencia es el teorema de Pitágoras:

  

(x - xc)2 + (y - yc)2 = r2 (16)

Esta ecuación podría usarse para trazar una circunferencia recorriendo el eje x enJ

pasos unitarios de xc - r a xc + r y calculando los valores de y correspondientes en cada posición como

y = yc +- (r2 - (x - xc)2)1/2 (17)

 Obviamente, este punto de vista implica una tarea de cálculo considerable en cada etapa y el espaciamiento entre las posiciones de los pixeles trazados no es uniforme, como se muestra en la figura 14. Podríamos ajustar el espaciamiento intercambiando x y y (probando valores de y y calculando valores de x) siempre que el valor absoluto de la pendiente de la circunferencia se hiciera mayor que 1. Pero esto agrega cálculos y la verificación del algoritmo.

Una manera de eliminar el espaciamiento desigual asociado con la ecuación 17 consiste en calcular puntos situados en la frontera circular mediante el uso de coordenadas polares. Si se expresa la ecuación de la circunferencia en forma polar paramétrica se obtiene el par de ecuaciones

  

x = xc + r . cos teta

y = yc + r . sen teta (18)

  

Cuando un despliegue se genera con estas ecuaciones mediante el uso de un valor angular fijo de teta, se traza una circunferencia con puntos igualmente espaciados a lo largo de la circunferencia. El tamaño de la etapa seleccionado de teta depende de la aplicación. Para generar circunferencias con un sistema de rastreo con rastreador, se puede fijar el tamaño de la etapa en 1/r y calcular posiciones de pixeles con muy poco espacio entre ellas. Este tamaño de etapa nos da pixeles que están separados aproximadamente una unidad.

Pueden mejorarse estos métodos aprovechando la simetría de las circunferencias. Un punto dado de la circunferencia puede trazarse en otros puntos de la circunferencia intercambiando coordenadas y alterando el signo de los valores coordenados. Como se ilustra en la figura 15, un punto en la posición (x, y) en un sector octavo de una circunferencia puede utilizarse para graficar los otros siete puntos que se muestran. Mediante el uso de este enfoque, podrían generarse todas las posiciones de pixeles alrededor de una circunferencia de un despliegue con rastreador calculando solamente los puntos dentro del sector de x = 0 a x = y.

La determinación de las posiciones de pixeles a lo largo de una circunferencia mediante el uso de la ecuación 17 o 18 requiere una cantidad considerable de tiempo de cómputo. El enfoque del teorema de Pitágoras implica multiplicaciones y extracción de raíces cuadradas, mientras que las ecuaciones paramétricas contienen cálculos trigonométricos y multiplicaciones. Podemos depurar la eficiencia de la generación de circunferencias aplicando un método que reduce los cálculos lo más posible a aritmética entera.

FIGURA 14 FIGURA 15


 

Algorítmo de circunferencia de Bresenham

Como sucede en el algoritmo de generación de líneas, las posiciones enteras a lo largo de una trayectoria circular pueden obtenerse determinando cuál de los dos pixeles está más próximo a la circunferencia en cada etapa. Para simplificar los enunciados del algoritmo, primero se considera una circunferencia con centro en el origen coordenada (xc = 0 y yc = 0). También se calculan los puntos de un octavo de segmento de una circunferencia suponiendo que se obtendrán los puntos restantes por simetría para almacenarse en un rastreador. (Un sistema de rastreo al azar con un generador de vectores podría ampliar los cálculos a través de un cielo completo.) Se toman etapas unitarias en el sentido x, comenzando desde x = 0 y terminando cuando x = y. La coordenada inicial de nuestro algoritmo es por tanto (0, r).

En la figura 16 se muestra la situación en alguna etapa arbitraria del algoritmo. Se supone que la posición(xi, yi) se ha determinado como más próxima a la trayectoria de la circunferencia. La siguiente posición es por tanto (Xi + 1, yi) o bien (xi + 1, yi - l).

Según la ecuación 16, el valor real de y en la trayectoria de la circunferencia se determina como

 

y2 = r2 - (xi + 1)2

 

 La figura 17 ilustra la relación entre y y los valores coordenadas enteros, yi y yi - 1. Una medida de la diferencia en las posiciones coordenadas puede definirse en términos del cuadrado de los valores de y como

 

d1 = yi2 - y2

    = yi2 - r2 + (xi + 1)2 (19)

  y

d2 = y2 - (yi - 1)2

    = r2 - (xi + 1)2 - (yi - 1)2 (20)

FIGURA 16 FIGURA 17

 Ahora se crea un parámetro para determinar la siguiente posición coordenada como la diferencia entre d1 y d2:

  

pi = d1 - d2

= 2(xi + 1)2 + yi2 + (yi - 1)2 - 2r2 (21)

Si pi es negativa, se selecciona el pixel en la posición yi. De lo contrario, se selecciona el pixel situado en la localidad yi - 1.

FIGURA 18 FIGURA 20

La prueba de la selección del siguiente pixel se cumple si la trayectoria real pasa sobre yi o bien debajo de yi - 1, como se muestra en la figura 18. En el primer caso, la figura 18(a), se tiene d1 < 0, d2 > 0 y pi < 0, de manera que el punto en yi sería el seleccionado. En el segundo caso, la figura 18 (b), d1 > 0 y d2 < 0. Ahora pi > 0 y el punto en yi - l es el que se selecciona.

Una forma recursiva del parámetro p se obtiene evaluando pi + 1, en términos de pi:

pi+1= 2[(xi + 1) +1]2 + yi+12 + (yi+1 - 1)2 - 2r2

Esta expresión puede escribirse en términos de la ecuación 21 como

pi+1 = pi + 4xi + 6 + 2(yi+12 - yi2) - 2(yi+1 - yi) (22)

La posición y, yi+1 es la misma que yi o bien la misma que yi - 1, según el valor de pi. Comenzando desde p1, el algoritmo determina cada parámetro p sucesivo desde o a partir del anterior. Se obtiene p1 haciendo (x1 y1) = (0, r) en la ecuación 21:

p1 = 3 - 2r (23)

El siguiente algoritmo resume las etapas que se llevan para calcular coordenadas enteras lo más próximas a la circunferencia definida. Para generalizar el algoritmo de manera que pueda trazarse una circunferencia con posición central arbitraria, simplemente se agrega xc a cada valor sucesivo de x y se agrega yc a cada valor calculado de y.

Aunque se requiere una multiplicación en el cálculo de cada parámetro, el multiplicador es una potencia de 2, de modo que la multiplicación puede implantarse como una operación de cambio lógica. Todas las otras operaciones son simplemente adiciones o sustracciones enteras. El procedimiento que sigue es un código de este algoritmo de circunferencia. La entrada para el procedimiento son las coordenadas del centro y del radio de la circunferencia. El procedimiento carga el arreglo del buffer de estructura con puntos situados en la circunferencia por medio de llamadas de la operación set_pixel.

  

 

 1. Seleccione la primera posición para el despliegue como

(x1, y1) = (0, r)

2. Calcule el primer parámetro como

p1 = 3 - 2r

Si p1 < 0, la siguiente posición es (x1 + 1, y1). De lo contrario, la siguiente posición es (x1 + l, Y1 - 1).

3. Continúe por incrementar la coordenada x en pasos unitarios y calcule cada parámetro sucesivo p a partir del anterior. Si para el parámetro anterior se halló que p, < 0, entonces

pi+1 = pi + 4xi + 6.

En caso contrario (para pi >= 0),

pi+1 = pi + 4(xi - yi) + 10.

Por lo tanto, si pi+1 < 0, el siguiente punto seleccionado es (xi + 2, yi+1). De lo contrario, el siguiente punto es (xi + 2, yi+1 - l). La coordenada y es yi+1 = yi, si pi < 0 o bien yi+1 = yi - 1, si pi >= 0.

4. Repita los procedimientos del paso 3 hasta que las coordenadas x y y sean iguales.


procedure bres_circle (x_center, y_center, radius : :Integer);

var

p, x, y : integer;

procedure plot_circle_points;

begin

set_pixel (x_center + x, y_center + y);

set_pixel (x_center - x, y_center + y);

set_pixel (x_center + x, y_center - y);

set_pixel (x_center - x, y_center - y);

set_pixel (x_center + y, y_center + x);

set_pixel (x_center - y, y_center + x);

set_pixel (x_center + y, y_center - x);

set_pixel (x_center - y, y_center - x)

end; {plot_circle_points}

 

begin {bres_circle}

x = 0;

y = radius;

p = 3 - 2 * radius;

while x < y do begin

plot_circle_points;

if p < 0 then p := p + 4 * x + 6

else begin

p = p + 4*(x - y) + 10;

y = y - 1

end; {if p not < 0}

x = x + 1

end; {while x < y}

:if x = y then plot_circle_points

end; {brescircle}

 

HASTA AQUI EL SEGUNDO EJERCICIO


Elipses

 Un algoritmo de trazo de circunferencias puede ampliarse para dibujar circunferencias o elipses. En la figura 20 se muestra una orientación de una elipse,

con r1 que marca el eje semimayor y r2 corno el eje semimenor.