Algoritmo DDA

Post on 24-Mar-2016

242 views 1 download

description

Algoritmo DDA

Transcript of Algoritmo DDA

S.E.P. D.G.E.S.T. D.I.T.D.

INSTITUTO TECNOLÓGICO SUPERIOR DE LIBRES

Organismo Público Descentralizado del Gobierno del Estado de Puebla

INGENIERÍA EN SISTEMAS COMPUTACIONALES

“GRAFICACIÓN”

ACTIVIDAD 3 OPENGL

PRESENTA:

BONILLA VÁSQUEZ RICARDO ANTONIO

FLORES GONZÁLEZ ANDRES

LIBRES, PUEBLA, FEBRERO 2012

1.- Explicación del algoritmo

Es un algoritmo que se basa en el cálculo y la evaluación de un DeltaX (X) y un DeltaY(Y) . Por medio de las siguientes ecuaciones:

DeltaX = DeltaY / m

DeltaY = m * DeltaX

Se efectúa un muestreo de la línea en intervalos unitarios en una coordenada y se determinan los valores enteros correspondientes más próximos a la trayectoria de la línea para la siguiente coordenada.

Se aceptan como datos de entradas las dos posiciones de los pixeles correspondientes a los extremos de la línea P1(Xinicial,Yinicial) y P2(Xfinal,Yfinal). Las diferencias horizontal y vertical entre las posiciones de los extremos dados, se asignan a las varialbles DeltaX y DeltaY respectivamente. La diferencia con la mayor magnitud determina el valor del parámetro Pasos. Se procede a determinar la compensación necesaria (incremento), para generar la posición del pixel siguiente a lo largo de la trayectoria de la línea. Luego, se ilumina la posición en la pantalla. Y se repite este proceso cíclico Pasos Veces, hasta obtener la línea deseada.

Pseucodigo

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) [1]

2.- Descargar la librería de clases The tao framework, buscan en la carpeta lib el archivo llamado freeglut.dll, lo copiar y pegar en C:\widows\system. Hecho todo esto, crear un nuevo proyecto en c# de consola y agregan las referencias hacia los archivos Tao.FreeGlut.dll y Tao.OpenGl.dll que se encuentran en la carpeta "taoframework-2.1. [2]

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Tao.FreeGlut; using Tao.OpenGl; namespace ConsoleApplication1 { class Program { static double x1, y1, x2, y2; static void Main( string [] args) { Console .WriteLine( "introduzca el valor de X1" ); x1 = Convert .ToDouble( Console .ReadLine()); Console .WriteLine( "introduzca el valor de Y1" ); y1 = Convert .ToDouble( Console .ReadLine()); Console .WriteLine( "introduzca el valor de X2" ); x2 = Convert .ToDouble( Console .ReadLine()); Console .WriteLine( "introduzca el valor de Y2" ); y2 = Convert .ToDouble( Console .ReadLine()); Glut .glutInit(); //funciones propias de opengl Glut .glutInitDisplayMode( Glut .GLUT_SINGLE | Glut .GLUT_RGB); Glut .glutInitWindowSize(640, 480); //creamos una ventana Glut .glutCreateWindow( "-------------Algoritmo DDA---------------" ); //colocamos titulo a la ventana //llamamos a la funcion dda Glut .glutDisplayFunc(dda); Glut .glutMainLoop(); } //Creamos la funcion llamada dda de tipo static y l e agregamos el siguiente codigo public static void dda() { //componentes necesarios de opengl Gl .glClear( Gl .GL_COLOR_BUFFER_BIT); //limpia el buffer de la pantall Gl .glColor3f(0.6F, 0.6F, 0.6F); //poner color a los pixeles Gl .glLoadIdentity(); //''muy importante; Gl .glPointSize(2.0f); //medida de los puntos Gl .glBegin( Gl .GL_POINTS); //funcion para dibujar puntos //dibujando el plano float z = -1, w = 1, c = 0; for ( int i = 0; i < 200; i++) { Gl .glColor3f(w, c, z); Gl .glVertex2d(z, 0); Gl .glVertex2d(0, w); z += .01f; w -= .01f; c += .1f; } Gl .glEnd(); //termina funcion para dibujar puntos /// pasamos las Gl .glPointSize(5.0f); //sirve para el tamaño de los pixeles

Gl .glColor3f(0.6f, 1.0f, 0.6f); //sirve para el color de los pixeles ddaDibujar(x1, y1, x2, y2); } public static void ddaDibujar( double x1, double y1, double x2, double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = y2, x, y; double deltax, deltay, xincremento, yincremento; double pasos; deltax = xfinal - xinicial; deltay = yfinal - yinicial; if ( Math .Abs(deltax) > Math .Abs(deltay)) pasos = Math .Abs(deltax); else pasos = Math .Abs(deltay); xincremento = (deltax / pasos) / 10; yincremento = (deltay / pasos) / 10; x = xinicial; y = yinicial; Gl .glBegin( Gl .GL_POINTS); Gl .glVertex2d(x, y); //funcion que pinta un pixel en las coordenadas especificadas for ( double k = .1; k <= pasos; k += .1) { x = (x + xincremento); y = (y + yincremento); Gl .glVertex2d(x, y); } Gl .glEnd(); //termina dda } } }

3.- grosor de la línea

Agregamos una linea de codigo en el for en la parte del codigo donde pintamos o dibujamos la linea public static void ddaDibujar( double x1, double y1, double x2, double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = y2, x, y; double deltax, deltay, xincremento, yincremento; double pasos; deltax = xfinal - xinicial; deltay = yfinal - yinicial; if ( Math .Abs(deltax) > Math .Abs(deltay)) pasos = Math .Abs(deltax); else pasos = Math .Abs(deltay); xincremento = (deltax / pasos) / 10; yincremento = (deltay / pasos) / 10; x = xinicial; y = yinicial; Gl .glBegin( Gl .GL_POINTS); Gl .glVertex2d(x, y); //funcion que pinta un pixel en las coordenadas especificadas for ( double k = .1; k <= pasos; k += .1) { x = (x + xincremento); y = (y + yincremento); Gl .glVertex2d(x, y); “Gl.glVertex2d(x +.01, y - .01);” } Gl .glEnd(); //termina dda }

b) linea punteada

Donde pinta la lina cambiar en xincremento y yincre mento el valor de 10 por 5.

public static void ddaDibujar( double x1, double y1, double x2, double y2) { pasos = Math .Abs(deltay); xincremento = (deltax / pasos) / 5; yincremento = (deltay / pasos) / 5; }

Ejemplo 1.- ingresamos números de inicio negativos -5 y final 0.

Ejemplo 2.- Coordenadas inicio (0,.5) y final (.5,.5)

Ejemplo 3.- Coordenadas inicio (-5,5) y final (5,-5)

Bibliografía

1.- http://www.nosolounix.com/2010/04/algoritmo-dda-dibujar-linea.html

2.- http://opengl.blogspot.es/