Algoritmo DDA

9
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

description

Algoritmo DDA

Transcript of Algoritmo DDA

Page 1: 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

Page 2: Algoritmo DDA

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.

Page 3: Algoritmo DDA

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]

Page 4: Algoritmo DDA

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

Page 5: Algoritmo DDA

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 } } }

Page 6: Algoritmo 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 }

Page 7: Algoritmo 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; }

Page 8: Algoritmo DDA

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)

Page 9: Algoritmo DDA

Bibliografía

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

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