INSTITUTO TECNOLÓGICO SUPERIOR DE LIBRES
Organismo Público Descentralizado del Gobierno del Estado de Puebla
ING. EN SISTEMAS COMPUTACIONALES
GRAFICACIÓN
“EJECUCIÓN DEL ALGORITMO DDA”
DOCENTE
LIC. DIANA MARICELA GONZÁLEZ DELGADO
PRESENTA:
HERNÁNDEZ JACINTO MARCO ANTONIO
LARIOS VÁZQUEZ EDGAR
LIBRES, PUEBLA, 11 DE FEBRERO 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.
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.
CODIGO DE EJEMPLOS DE TRAZO DE LINEAS PUNTEADAS DE LA
LIBRERÍA OPENGL EN C#
using System;
using System.Collections.Generic;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;
//REALIZADO POR MARCO ANTONIO HERNANDEZ JACINTO Y EDGAR LARIOS
namespace Graficos2
{
class Program
{
static double x1, y1, x2, y2;
static void Main(string[] args)
{
Console.WriteLine(".........LINEAS CON EL ALGORITMO
DDA");
Console.WriteLine("INTRODUSCA EL VALOR DE.... X1");
x1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA EL VALOR DE.... Y1");
y1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA EL VALOR DE.... X2");
x2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA 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("LINEAS");
//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.400F, 0.400F, 0.400F);
Gl.glLoadIdentity();//''muy importante;
///componentes necesarios
Gl.glPointSize(6.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);
}
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 += .3
;
if (constanteP < 0)
constanteP += 2 * deltay;
else
{
y += .3;
constanteP += 2 * (deltay - deltax);
}
Gl.glVertex2d(x, y);
}
Gl.glEnd();
}
//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 += .09;
if (constanteP < 0)
constanteP += 2 * deltay;
else
{
y += .09;
constanteP += 2 * (deltay - deltax);
}
Gl.glVertex2d(x, y);
}
Gl.glEnd();
}
}
}
CODIGO DE EJEMPLOS DE TRAZO DE LINEAS CON GROSOR DE LA
LIBRERÍA OPENGL EN C#
using System;
using System.Collections.Generic;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;
//REALIZADO POR MARCO ANTONIO HERNANDEZ JACINTO Y EDGAR LARIOS
namespace Graficos2
{
class Program
{
static double x1, y1, x2, y2;
static void Main(string[] args)
{
Console.WriteLine(".........LINEAS CON EL ALGORITMO
DDA");
Console.WriteLine("INTRODUSCA EL VALOR DE.... X1");
x1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA EL VALOR DE.... Y1");
y1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA EL VALOR DE.... X2");
x2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("INTRODUSCA 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("LINEA GROSOR");
//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.1F, 0.1F, 0.1F);
// Gl.glLineWidth( 0.34);
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);
}
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();
}
//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();
}
}
}
FUENTES DE INFOTRMACIÓN
1. http://disi.unal.edu.co/grupos/remixlab/index.php?option=com_
content&view=article&id=4&Itemid=12&lang=es
2. http://opengl.blogspot.es/
Sitios de trabajo
3. http://issuu.com