Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 1 mensaje ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo
Avatar de Usuario

Registrado: Mié Mar 01, 2006 12:00 am
Mensajes: 1

Nota Publicado: Mié Mar 01, 2006 3:25 pm 
Arriba  
Un saludo a todos, deseo porfavor me ayuden en lo siguiente:
Deseo realizar la superficie de bezier en opengl, el problema es que deseo incluir en mi programa la rutina que genera todos los puntos de mi superficie y asi desplegarlo en el espacio 3d de opengl, por mas que intento no puedo puesto que incluyo en mi programa la rutina base y no asi la funcion para que realice la superficie,para compilar el prog. uso mingw32OGL.
el programa es el siguiente(con aslgunas explicaciones)
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#define ANCHO 400
#define ALTO 400
#define ORIGENX 100 /*coordenada X del origen de laq ventana, esquina superio izquierda*/
#define ORIGENY 100
/*PARAMETROS INCIALES DEL PROGRAMA*/


struct Punto{
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat w;
};
struct Punto p;
struct Punto g[10][10];

int comb(int n ,int k )
{
int j ,a;

a = 1;
for(j = k + 1;j<=n ;j++)
{ a = a * j;
}
for( j = 1 ;j<= n - k;j++)
{a = a / j;
}
return a;
}

float Bernstein(int k,int n ,double u )
{
int j;
float v;
v = comb(n, k);
for (j = 1;j<= k;j++)
{v = v * u;
}
for (j = 1 ;j<= n - k;j++)
{ v = v * (1 - u);
}
return v;
}

void llena_ptos_ctrl()
{
GLint i,j ;
srand(1);
for (i = 0 ;i<= 10;i++)
{ for( j = 0 ;j<= 10;j++)
{
g[i][j].x = i;
g[i][j].y = j;
g[i][j].z = rand();
}

}
}


void graf_punto()
{
glColor3f(0.0,0.0,1.0);
glVertex3f(p.x,p.y,p.z);
glVertex3f(2.0,1.0,3.0);


}

void bezier(int pasos ,int pts_ctrol)
{
int i, pi,j, pj;
double u ,bu ,v ,bv ;



for (pj = 0 ;pj<= pasos;pj++)
{ v = pj / pasos;
for( pi = 0;pi<=pasos;pi++)
{
u = pi / pasos;
p.x = 0;
p.y = 0;
p.z = 0;
for (j = 0; j<= pts_ctrol;j++)
{ bv = Bernstein(j, pts_ctrol, v);
for (i = 0 ;i<= pts_ctrol;i++)
{ bu = Bernstein(i, pts_ctrol, u) * bv;
p.x = p.x + g[i][ j].x * bu;
p.y = p.y + g[i][ j].y * bu;
p.z = p.z + g[i][ j].z * bu;
}
}

graf_punto();
}

}

}






void inicio(void)
{
glMatrixMode(GL_PROJECTION); /*ACTIVAMOS LA MATRIZ DE PROYECCION*/
glLoadIdentity();/*reseteamos esta con la matriz identidad*/
glOrtho(0,ANCHO,0,ALTO,-10,10); /*PLANO DE PROYECCION IGUAL A LA VENTANA DE VISUALIZACION
VOLUMEN DE VISUALIZACION DESDE Z=-10 HASTA Z=10*/
glMatrixMode(GL_MODELVIEW); /*ACTIVAMOS LA MATRIZ DE MODELADO /VISIONADO*/
glLoadIdentity();/*LA RESETEAMOS*/
/*nos trasladamos al centro de nuestra ventana donde siempre dibujaremos el poligono.
nos mantenemos en el plano Z=5 que se encuentra dentro del volumen de visualizacion*/
glTranslatef((GLfloat)ANCHO/2,(GLfloat)ALTO/2,50);
glClearColor(0.0,0.0,0.0,0.0);/*color de fondo para la ventana de visualizacion, negro*/
}

/*opengl llamara a esta rutina cada vez que tenga que dibujar de nuevo dado que rellenara
el poligono de color y cada vertice es de un color diferente, open gl rellenara el interior
con una interpolacion de los colores de los 4 verticces. los hace automaticamente*/

void dibujar(void)
{ glClear(GL_COLOR_BUFFER_BIT); /*limpiamos el frame buffer con el color de clear en este caso negro*/
//glPolygonMode(GL_FRONT,GL_FILL);/*queremos que se dibujen las caras frontales de los poligonos y con relleno de color.*/
llena_ptos_ctrl();
glBegin(GL_POINTS);
bezier(40,10);
glEnd();
glFlush();
}
/*Main del programa*/
int main(int argc,char **argv)
{
glutInit(&argc,argv);/*primera llamada siempre en opengl, por si usaramos la linea de comandos*/
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/*activamos buffer simple y colores del tipo RGB*/
glutInitWindowSize(ANCHO,ALTO); /*definimos una ventana de medidas ancho y alto como ventana de visualizacion*/
glutInitWindowPosition(ORIGENX,ORIGENY);/*Posicionamiento la esquina superior izquierda de la ventana en el punto definido */
glutCreateWindow("El cuadrado de HENRY");/*creamos literalmente la ventana y le adjudicamos el nombre que tendra en la barra de titulo*/
inicio();/*INICIALIZAMOS EL SISTEMA*/
/*hacemos saber a opengl que cada vez que sea necesario dibujar de nuevo por ejemplo la primera vez o al redimensionar
la ventana con el raton o en caso de provocar un redibujado por programa debe llamar a la funcion
funcion dibujar*/
glutDisplayFunc(dibujar);
/*aqui espera el programa mientras nada ocurra, es un loop infinito que se vera turbado
por las sucesivas veces que sea necesario redibujar*/
glutMainLoop();

return 0; /*obligatorio para el ANSI C*/
}


//---------------------------------------------------------------------------------

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 1 mensaje ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO