|
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*/
}
//---------------------------------------------------------------------------------
|