Es un algoritmo que se basa en el calculo y la evaluacion de un DeltaX(X) y un DeltaY(Y). Por medio de las siguientes ecuaciones:
DeltaX = DeltaY / m
DeltaY = m * DeltaX
Se efectua un muestreo de la linea en intervalos unitarios en una coordenada y se determinan los valores enteros correspondientes mas proximos a la trayectoria de la linea para la siguiente coordenada.
Se aceptan como datos de entradas las dos posiciones de los pixeles correspondientes a los extremos de la linea p1(Xinicial, Yinicial) y p2(Xfinal, Yfinal). Las diferencias horizontal y vertical entre las posiciones de los extemos dados, se asigna las variables DeltaX y DeltaY respectivamente. La diferencia con la mayor magnitud determina el valor del parametro Pasos. Se procede a determinar la compensacion necesaria (incremento), para generar la posicion del pixel siguiente a lo largo de la trayectoria de la linea. Luego, se ilumina la posicion en la pantalla y se repite este proceso ciclico, hasta obtener la linea deseada.
Pseudocodigo.
Leer Coordenadas P2(Xfinal,Yfinal)
Asignar a DeltaX la diferencia de Xfinal - Xinicial
Asignar a DeltaY la diferencia de Yfinal - Yinicial
Si ABS( DeltaX) > ABS(DeltaY)
Asignar a Pasos el ABS(DeltaX)
De lo contrario
Asignar a Pasos el ABS(DeltaY)
Asignar a Xincremento el resultado de DeltaX / Pasos
Asignar a Yincremento el resultado de DeltaY / Pasos
Asignar a X el valor de Xinicial
Asignar a Y el valor de Yinicial
Iluminar pixel en coordenada X,Y
Desde k=1 hasta Pasos
Asignar a X la suma de X + Xincremento
Asignar a Y la suma de Y + Yincremento
Iluminar pixel en Coodenada X,Y
Fin de Algoritmo(DDA)
Ejemplo.
#include <stdio.h>
#include <graphics.h>
#include <math.h>
void DDA (int x1,int y1,int x2,int y2)
{
float ax,ay,x,y,luz;
int i;
if(abs(x2-x1)>=abs(y2-y1))
luz=abs(x2-x1);
else
luz=abs(y2-y1);
ax=(x2-x1)/luz;
ay=(y2-y1)/luz;
x=(float)x1;
y=(float)y1;
i=1;
while(i<=luz)
{
putpixel((319+floor(x)),(239-floor(y)),9);
x=x+ax;
y=y+ay;
i=i+1;
}
}
No hay comentarios:
Publicar un comentario