miércoles, 13 de noviembre de 2013

Algoritmos

1. ALGORITMO DDA PARA GENERACIÓN DE LÍNEAS
ANALIZADOR DIFERENCIAL DIGITAL
El Algoritmo DDA es un algoritmo de línea de conversión de rastreo que se basa en el cálculo ya sea en el incremento de X o en el incremento de Y. La finalidad de este algoritmo es determinar los valores enteros correspondientes más próximos a la trayectoria de la línea para la otra coordenada.
Como todos saben Open GL es una herramienta que nos facilita mucho la generación de gráficos por computadora. Aquí aplicamos conocimientos matemáticos, usando Open GL para generar rectas, circunferencias, elipses, etc.
Es un algoritmo preciso para la generación de líneas de rastreo que convierte mediante rastreo las líneas al utilizar solo cálculos incrementales con enteros que se pueden adaptar para desplegar circunferencias y curvas. Los ejes verticales muestran las posiciones de rastreo y los ejes horizontales identifican columnas de pixel.
CÓDIGO:
void DDA(int x0,int y0,int xFin,int yFin)
{
int dx = xFin - x0, dy = yFin - y0, steps, k;
float xIncremento, yIncremento;
float x = x0, y = y0;
if (fabs (dx) > fabs (dy))steps = fabs (dx);
/* |m|<1>elsesteps = fabs (dy);
/* |m|>=1 */xIncremento=float(dx)/float (steps);
yIncremento = float (dy) / float (steps);
setPixel (round (x), round (y));
for (k = 0; k <>; k++)
{
x += xIncremento;y += yIncremento;setPixel (round (x), round (y));
}
}


ALGORITMO DE BRESENHAM PARA TRAZAR LÍNEAS
El algoritmo de Bresenham es un algoritmo creado para dibujar rectas en los dispositivos de gráficos rasterizados, como por ejemplo un monitor de ordenador, que determina qué pixeles se rellenarán, en función de la inclinación del ángulo de la recta a dibujar.
El algoritmo sería el siguiente:
Si 0<|m|<1
  *Se capturan los extremos de la línea y se almacena el extremo izquierdo en (x0,y0).
  *Se carga (x0,y0) en el bufer de estructura (se traza el primer punto)
  *Se calculan las constantes Δx,Δy, 2Δy y 2Δy-Δx y se obtiene el valor inicial para el
    parametro de decisión p0=2Δy-Δx.
  Para j=0 mientras j<Δx
  *En cada xk a lo largo de la línea, que inicia en k=0 se efectúa la prueba siguiente:
      Si pk<0
          *Trazamos (xk+1,yk).
          *Asignamos pk+1= pk+2Δy.
      Sino
          *Trazamos (xk+1,yk+1).
          *Asignamos pk+1= pk+2Δy-2Δx.
  Fin Para
Si |m|>1
   *Recorremos la dirección en pasos unitarios y calculamos los valores sucesivos de x que se aproximen más a la trayectoria de la línea.





Algoritmo de Bresenham para trazar circunferencias
Una circunferencia se define como un conjunto de puntos que se encuentran, en su totalidad, a una distancia determinada r de una posición central.
Es posible reducir el cálculo al considerar la simetría de las circunferencias, la forma de la circunferencia es similar entre cuadrantes y simétrica entre octantes.
Para aplicar el método del punto medio, definimos una función de circunferencia como:
pk = fcircunferencia(x,y)= x2 + y2 − r2fcircunferencia(x,y)<0 si (x,y) está dentro de la frontera de la circunferencia.
fcircunferencia(x,y)=0 si (x,y) está en la frontera de la circunferencia.
fcircunferencia(x,y)>0 si (x,y) está fuera de la frontera de la circunferencia.
Los parámetros de decisión sucesivos se obtienen al utilizar cálculos incrementales.
El algoritmo será el siguiente:
 *Se capturan el radio r y el centro de la circunferencia (xc, yc).
 *Se obtiene el primer punto de la circunferencia centrada en origen (xc, yc) como (0, r).
 *Se calcula el valor inicial del parámetro de decisión como p0=5/4 - r.
 Para k=0 hasta x>=y incrementa k
    Si pk < 0
       *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk).
       *pk+1=pk+2xk+1+1.
    Sino
        *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk-1).
       *pk+1=pk+2xk+1+1-2yk+1.
    //Donde 2xk+1=2xk+2  y  2yk+1=2yk-2




CÓDIGO:

void Bres(int x0,int y0,int xFin,int yFin)
{
int dx = fabs(xFin - x0),dy = fabs(yFin - y0);
int p = 2 * dy - dx;
int dosDy = 2 * dy,dosDyMenosDx = 2 * (dy - dx);int x, y;
/* Determinamos que punto usamos como inicio. */
if (x0 > xFin) {x = xFin;y = yFin;
xFin = x0;
}
Else
 {
x = x0;
y = y0;
}
setPixel (x, y);
while
 (x <>x++;
if (p <>p += dosDy;
else
 {
y++;
p += dosDyMenosDx;
}
setPixel (x, y);
}
}


No hay comentarios.:

Publicar un comentario