algoritmo dda
DESCRIPTION
Es un algoritmo de digitalización de líneasTRANSCRIPT
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
PRESENTAN:
LEAL NIETO MARIBEL
RIVERO LÓPEZ PILAR
LIBRES, PUEBLA, DICIEMBRE 2011
ALGORITMO DDA
El algoritmo DDA (Análisis Diferencial Digital) es un algoritmo de digitalización de
líneas basado en circular Sy o Sx utilizando ecuaciones, las líneas se muestran en
intervalos unitarios según las coordenadas y los correspondientes valores enteros
más aproximados al trayecto lineal se calcula para la otra coordenada, es un
método para el cálculo de posiciones de pixeles más rápido que implementar
directamente.
Instalación de librerías
Colocar las librerías en Windows/System como se muestra en la siguiente figura
1.1
Figura 1.1
Crear nuevo proyecto en Visual Studio 2008 en consola como se muestra en la
Figura 1.2
Figuras 1.2
Se abrió el proyecto para el desarrollo del código como se muestra en la Figura
1.3
Figura 1.3
Se agregaron las referencias dentro del proyecto como se muestra en la Figura
1.4
Figura 1.4
Figura 1.5
CODIFICACION Y EJECUCIÓN ALGORITMO DDA
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()); //inicializar para Tao.Opengl Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB); Glut.glutInitWindowSize(640, 480);// creamos ventana Glut.glutCreateWindow("*************DDA***************"); //termina inicializacion de componentes tao opengl Glut.glutDisplayFunc(Bresen); Glut.glutMainLoop(); public static void Bresen() { //comp necesarios Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Gl.glColor3f(0.6F, 0.6F, 0.6F); Gl.glLoadIdentity(); Gl.glPointSize(2.0f); Gl.glBegin(Gl.GL_POINTS); // se dibuja 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(5.0f); Gl.glColor3f(1.0f, 0.111f, 1.0f); BresenDibujar(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 += .1; if (constanteP < 0) constanteP +=2 * deltay; else { y += .1; constanteP += 2 * (deltay - deltax); } Gl.glVertex2d(x, y);
} Gl.glEnd(); } } }
Línea punteada
using System;
using System.Collections.Generic;
using System.Text;
using Tao.FreeGlut;
using 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("LIENESA PUNTEADA ");
//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.0F, 0.0F, 1.0F);
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 += .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();
}
}
}
Ejecución de línea punteada
Grosor de linea
using System;
using System.Collections.Generic;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;
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("ALGOTITMO DDA");
//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.0F, 0.0F, 1.0F);
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();
}
//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();
}
}
}
REFERENCIA
Graficación por computadora con OpenGL 3ra edición editorial Donald hearn m.
Pauline Baker indiana university- purdue university
http://gilberto2112.brinkster.net/programaconkarel/Version_Anterior/GraficosPorCo
mputadoraYOPENGL.pdf