ALGORITMO BRESENHAM
#include "stdafx.h"
#define BLACK 0
#include <GL/glut.h>
#include <stdio.h>
void draw_pixel(int ix, int iy, int value)
{
glBegin(GL_POINTS);
glVertex2i( ix, iy);
glEnd();
}
void bres(int x1,int y1,int x2,int y2){ //algoritmo Bresenham
int dx, dy, i, e;
int incx, incy, inc1, inc2;
int x,y;
dx = x2 - x1;
dy = y2 - y1;
if(dx < 0) dx = -dx;
if(dy < 0) dy = -dy;
incx = 1;
if(x2 < x1) incx = -1;
incy = 1;
if(y2 < y1) incy = -1;
x=x1;
y=y1;
if(dx > dy) {
draw_pixel(x,y, BLACK);
e = 2*dy - dx;
inc1 = 2*( dy -dx);
inc2 = 2*dy;
for(i = 0; i < dx; i++)
{
if(e >= 0){
y += incy;
e += inc1;
} else
e += inc2;
x += incx;
draw_pixel(x,y, BLACK);
}
}
else {
draw_pixel(x,y, BLACK);
e = 2*dx - dy;
inc1 = 2*( dx - dy);
inc2 = 2*dx;
for(i = 0; i < dy; i++){
if(e >= 0) {
x += incx;
e += inc1;
}
else e += inc2;
y += incy;
draw_pixel(x,y, BLACK);
}
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
bres(200, 200, 100, 100);
glFlush();
}
void myinit()
{
glClearColor(1.0, 1.0, 1.0, 1.0);//color
glColor3f(0.5, 0.3, 0.2);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 300.0, 0.0, 300.0);
}
void main(int argc, char** argv)
{ // Inicializacion GLUT estándar
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400); //tamaño ventana
glutInitWindowPosition(0,0); /* coloca la ventana de despliegue en esq. sup. izq */
glutCreateWindow("Algoritmo Bresenham"); //titulo
glutDisplayFunc(display); //se llama al metodo Display
myinit(); //estableciendo tributoas
glutMainLoop();//ciclo de evento
}
ALGORITMO DDA
#include
"stdafx.h"
#include
"stdafx.h"
#include
<GL/glut.h>
#include
<stdlib.h>
#include
<math.h>
typedef struct {
float x, y;
}
Punto;
Punto vertices[2];
int numPuntos;
int
screen[640][480];
void inicializar
(void);
void
redimensiona (int alto, int ancho);
void dibuja
(void);
void teclado
(unsigned char key, int cx, int cy);
void raton (int
boton, int estado, int cx, int cy);
void
ddaAlgorithm(int, int, int, int);
void
limpiaScreen();
int
my_round(float);
int main(int
argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE |
GLUT_RGB);
glutInitWindowSize (640, 480);
glutInitWindowPosition (100, 105);
glutCreateWindow ("Algoitmo
DDA");
inicializar();
glutDisplayFunc(dibuja);
glutReshapeFunc(redimensiona);
glutKeyboardFunc(teclado);
glutMouseFunc(raton);
glutMainLoop();
return 0;
}
void inicializar
() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
numPuntos = 0;
}
void redimensiona (int ancho, int alto) {
glViewport(0, 0, ancho, alto);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (double)ancho, 0.0,
(double)alto);
}
void teclado
(unsigned char key, int cx, int cy) {
switch (key) {
case 27:
exit(0);
break;
default: break;
}
glutPostRedisplay();
}
void raton (int
boton, int estado, int cx, int cy) {
if (boton == GLUT_LEFT_BUTTON &&
estado == GLUT_DOWN) {
if (numPuntos
== 2) {
numPuntos
= 0;
}
vertices[numPuntos].x
= cx;
vertices[numPuntos].y
= 480 - cy;
numPuntos++;
}
glutPostRedisplay();
}
void dibuja
(void) {
int i, j;
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
limpiaScreen();
if (numPuntos == 2) {
ddaAlgorithm((int)vertices[0].x,
(int)vertices[0].y, (int)vertices[1].x, (int)vertices[1].y);
}
glPointSize(1.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
for(i = 0; i < 640; i++) {
for(j = 0; j < 480; j++)
{
if (screen[i][j]) {
glVertex2i(i,
j);
}
}
}
glEnd();
glPointSize(4.0);
glColor3f(1.0, 1.0, 0.0);glBegin(GL_POINTS);
for (i = 0; i < numPuntos; i++) {
glVertex2f(vertices[i].x, vertices[i].y);
}
glEnd();
glFlush();
}
void
ddaAlgorithm(int x0, int y0, int x1, int y1) {
int longitudX, longitudY, longitud, i;float Dx, Dy, x, y;
longitudX = x1 - x0;
longitudY = y1 - y0;
longitud = (abs(longitudX) > abs(longitudY)) ? abs(longitudX) : abs(longitudY);
Dx = (float) longitudX / (float) longitud;
Dy = (float) longitudY / (float) longitud;
x = x0;
y = y0;
for(i = 0; i <= longitud; i++) {
screen[my_round(x)][my_round(y)] =
1;
x += Dx;
y
+= Dy;
}
}
void limpiaScreen() {
int i, j;for (i = 0; i < 640; i++) {
for (j = 0; j < 480; j++) {
screen[i][j] = 0;
}
}
}
int my_round (float n) {
return floor(n + 0.5);
}


No hay comentarios:
Publicar un comentario