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
“EJECUCIÓN DEL ALGORITMO DDA” MATERIA: GRAFICACIÓN
PRESENTAN: CRISOSTOMO HERNANDEZ GUADALUPE
ORTEGA MÉNDEZ JOAQUINA
LIBRES, PUEBLA, FEBRERO DE 2012.
1.- Fundamento teórico del algoritmo DDA. La computación grafica en 2D corresponde al conjunto de técnicas que tienen como objeto la generación de modelos esto se da mediante modelos geométricos bidimensionales. De esta manera estas técnicas son empleadas en interfaces graficas de usuario. Los gráficos vectoriales y de rasterización conforman las principales categorías de computación grafica en 2D. [1] Algoritmo DDA para el trazo de líneas. La ecuación de la inserción de la pendiente cartesiana de una línea es: (1) y = m x + b Donde: m = Pendiente de la línea. b = Inserción de y. Dado que los extremos de un segmento de línea se especifica en las posiciones (x1, y1) (x2, y2), se pueden determinar los valores para la pendiente y la inserción de y en b con los siguientes cálculos: (2) m = (y2 – y1) / (x2 – x1) (3) b = y1 – m x1 Para cualquier x dentro del intervalo ∆x a lo largo de una línea, se puede calcular el intervalo correspondiente a ∆y a partir de la ecuación (2) como: (4) ∆y = m ∆x De modo similar se puede obtener el intervalo ∆x de x correspondientemente a una ∆y específica como: (5) ∆x = ∆y / m Si │m│<1, la línea es mas horizontal que vertical. Según tiende a cero m, la línea tiende a ser más horizontal. Si │m│>1, la línea es mas horizontal que vertical. Según tiende a infinito a m, la línea tiende a ser vertical. El siguiente paso es efectuar un muestreo de la línea de puntos discretos correspondientes a los pixeles más cercanos. 2.- Codificación y ejecución del algoritmo de codificación DDA. [2] using System; using System.Collections.Generic;
using using using using
System.Linq; System.Text; Tao.FreeGlut; Tao.OpenGl;
namespace Lineas { 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 le 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(6.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(9.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);
} //Ahora crearemos la funcion ddaDibujar la que llevara el codigo del algoritmo DDA 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.- Modificaciones correspondientes para el trazo de lĂneas de los siguientes tipos: a) Aumento de grosor. using using using using using
System; System.Collections.Generic; System.Text; Tao.FreeGlut; Tao.OpenGl;
namespace Graficos2 { 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()); //inicializar todo esto para tao opengl Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB); Glut.glutInitWindowSize(640, 480); Glut.glutCreateWindow("Bresenham"); //termina inicializacion de componentes tao opengl Glut.glutDisplayFunc(Bresen); Glut.glutMainLoop(); } public static void Bresen() { //componentes necesarios Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glColor3f(0.6F, 0.6F, 0.6F); Gl.glLoadIdentity();//''muy importante; ///componentes necesarios Gl.glPointSize(5.0f);//medida de los puntos Gl.glBegin(Gl.GL_POINTS); //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();
Gl.glPointSize(10.0f); Gl.glColor3f(1.0f, 0.111f, 1.0f); BresenDibujar(x1, y1, x2, y2); BresenDibujar2(x1, y1, x2, y2); } public static void BresenDibujar(double x1, double y1, double x2, double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = y2, x = 0, y = 0; double deltax, deltay, constanteP, ultimo; deltax = Math.Abs(xfinal - xinicial); deltay = Math.Abs(yfinal - yinicial); constanteP = 2 * deltay - deltax; if (xinicial > xfinal) { x = xfinal; y = yfinal; ultimo = xinicial; } else { x = xinicial; y = yinicial; ultimo = xfinal; } Gl.glBegin(Gl.GL_POINTS); //Gl.glColor3f(1f, 1.0f, .5f); Gl.glVertex2d(x, y); while (x < ultimo) { x += .01; if (constanteP < 0) constanteP += 2 * deltay; else { y += .01; constanteP += 2 * (deltay - deltax); } Gl.glVertex2d(x, y); } Gl.glEnd(); } //aumento de grosor public static void BresenDibujar2(double x1, double y1, double x2, double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = y2, x = 0, y = 0; double deltax, deltay, constanteP, ultimo; deltax = Math.Abs(xfinal - xinicial); deltay = Math.Abs(yfinal - yinicial); constanteP = 2 * deltay - deltax; if (xinicial > xfinal) { x = xfinal; y = yfinal+0.04; ultimo = xinicial; } else
{ x = xinicial; y = yinicial+0.04; ultimo = xfinal; } Gl.glBegin(Gl.GL_POINTS); //Gl.glColor3f(0.6f, 0.6f, 0.6f);//djhfklsdj Gl.glVertex2d(x, y); while (x < ultimo) { x += .01; if (constanteP < 0) constanteP += 2 * deltay; else { y += .01; constanteP += 2 * (deltay - deltax); } Gl.glVertex2d(x, y); } Gl.glEnd(); } } }
b) LĂnea punteada.
using using using using using
System; System.Collections.Generic; System.Text; Tao.FreeGlut; Tao.OpenGl;
namespace Graficos2 { 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()); //inicializar todo esto para tao opengl Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB); Glut.glutInitWindowSize(640, 480); Glut.glutCreateWindow("Bresenham"); //termina inicializacion de componentes tao opengl Glut.glutDisplayFunc(Bresen); Glut.glutMainLoop(); } public static void Bresen() { //componentes necesarios Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glColor3f(0.6F, 0.6F, 0.6F); Gl.glLoadIdentity();//''muy importante; ///componentes necesarios Gl.glPointSize(5.0f);//medida de los puntos //Gl.glColor3f(0.0f, 1.0f, 0.0f); //BresenDibujar (.1, .1, 1, 1); //Gl.glColor3f(1.0f, 0.0f, 1.0f); //BresenDibujar(.3, .1, .6, .6); ////Gl.glColor3f(1.0f, 0.111f, 1.0f); //BresenDibujar(-1, -1, .5, 1); Gl.glBegin(Gl.GL_POINTS); //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(); Gl.glPointSize(10.0f); Gl.glColor3f(1.0f, 0.111f, 1.0f); BresenDibujar(x1, y1, x2, y2); BresenDibujar2(x1, y1, x2, y2);
x2, y2,
x2, y2,
} //linea punteada 1 public static void BresenDibujar(double x1, double y1, double double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = x = 0, y = 0; double deltax, deltay, constanteP, ultimo; deltax = Math.Abs(xfinal - xinicial); deltay = Math.Abs(yfinal - yinicial); constanteP = 2 * deltay - deltax; if (xinicial > xfinal) { x = xfinal; y = yfinal; ultimo = xinicial; } else { x = xinicial; y = yinicial; ultimo = xfinal; } Gl.glBegin(Gl.GL_POINTS); //Gl.glColor3f(1f, 1.0f, .5f); Gl.glVertex2d(x, y); while (x < ultimo) { x += .3 ; if (constanteP < 0) constanteP += 2 * deltay; else { y += .3; constanteP += 2 * (deltay - deltax); } Gl.glVertex2d(x, y); } Gl.glEnd(); } //linea punteada 2 public static void BresenDibujar2(double x1, double y1, double double y2) { double xinicial = x1, yinicial = y1, xfinal = x2, yfinal = x = 0, y = 0; double deltax, deltay, constanteP, ultimo; deltax = Math.Abs(xfinal - xinicial); deltay = Math.Abs(yfinal - yinicial); constanteP = 2 * deltay - deltax; if (xinicial > xfinal)
{ x = xfinal; y = yfinal + 0.04; ultimo = xinicial; } else { x = xinicial; y = yinicial + 0.04; ultimo = xfinal; } Gl.glBegin(Gl.GL_POINTS); //Gl.glColor3f(0.6f, 0.6f, 0.6f);//djhfklsdj Gl.glVertex2d(x, y); while (x < ultimo) { x += .09; if (constanteP < 0) constanteP += 2 * deltay; else { y += .09; constanteP += 2 * (deltay - deltax); } Gl.glVertex2d(x, y); } Gl.glEnd(); } } }
Bibliografía 1.- Ing. En Sistemas Computacionales Jesús Hernández León. Correo electrónico: jesusamigable@gmail.com Publicado el 26/02/2009 http://opengl.blogspot.es/ [1] 2.- Gráficos por Computadora con OpenGl, Tercera Edición, Autor. Donald Hearn, M. Pauline Baker, Indiana University – Perdue University, Editorial Pearson Prentice Hall [2]
3.- Fundamentos de algoritmo: http://disi.unal.edu.co/grupos/remixlab/index.php?option=com_content&view=article&id =4&Itemid=12&lang=es [3] 4.- Algoritmo de trazo de líneas: http://cannes.itam.mx/Alfredo/Espaniol/Cursos/Grafica/Linea.pdf
[4]