Algoritmo DDA
-
Upload
andyfg-flog -
Category
Documents
-
view
242 -
download
1
description
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/