martes, 12 de noviembre de 2013

Actividad #12 Investigar -Lineas


Actividad #12 Investigar -Lineas

Investigar :
  • Algoritmo DDA para generación de líneas
  • Algoritmo de Bresenham para trazar líneas

Actividad: Buscar Programas que utilizen los algoritmos anteriores y opengl, ejecutelos y capture las pantallas, examine el código para entenderlo.

  • Algoritmo DDA para generación de líneas
El Algoritmo DDA es un algoritmo de línea de conversión de rastreo que se basa en el cálculo ya sea en el incremento de X o en el incremento de Y. La finalidad de este algoritmo es determinar los valores enteros correspondientes más próximos a la trayectoria de la línea para la otra coordenada.

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
}


Código DDA en c#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tao.OpenGl;
using Tao.FreeGlut;
using System.Runtime.InteropServices;
namespace AlgoritmoDDA
{
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();
}
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
}
}
}




  • Algoritmo de Bresenham para trazar líneas
El algoritmo de Bresenham es un algoritmo creado para dibujar rectas en los dispositivos de gráficos rasterizados, como por ejemplo un monitor de ordenador, que determina qué pixeles se rellenarán, en función de la inclinación del ángulo de la recta a dibujar.
Algoritmo Bresenham:
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();
}


Código en c#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tao.OpenGl;
using Tao.FreeGlut;
using System.Runtime.InteropServices;

namespace AlgoritmoDDA
{
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();//funciones propias de opengl
Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
Glut.glutInitWindowSize(640, 480);//creamos una ventana
Glut.glutCreateWindow("**************Bresenham**************");//colocamos titulo a la ventana
//termina inicializacion de componentes tao opengl, llamamos a la funcion Bresen
Glut.glutDisplayFunc(Bresen);
Glut.glutMainLoop();
}

public static void Bresen()
{
//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.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(1.0f, 0.111f, 1.0f);//sirve para el color de los pixeles
BresenDibujar(x1, y1, x2, y2);//llama a la funcion bresenDibujar
}
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();
}
}
}



Fuente:

http://opengl.blogspot.es/tags/algoritmo/
http://opengl.blogspot.es/1235266620/
http://www.dcases.com/68/c-y-opengl-parte-i-inicializacion-de-opengl/