Trazo de lineas rectas

Algoritmo DDA para generacion de lineas.

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 P1(Xinicial, Yinicial)
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 <dos.h>
#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