Está en la página 1de 6

Universidad Nacional Mayor de San Marcos

Facultad de Ingeniera de Sistemas e Informtica


E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

Laboratorio 06

Curva de Bzier

Modelado con curvas de Bzier

Objetivo: El objetivo de esta prctica, es que el alumno pueda efectuar la construccin de la curva de
Bzier; posteriormente, puede emplear las herramientas anteriores para una mejor manipulacin de
esta curva, como por ejemplo la lectura de los puntos de control por pantalla y el empleo de listas de
visualizacin.

Duracin de la Prctica: 2 Horas.

Lugar de realizacin: Laboratorio de cmputo.

El conocimiento requerido para realizar esta prctica es de haber asimilado los conceptos bsicos
de C/C++ y OpenGL.

El desarrollo tendr la siguiente estructura de temas:

1. Curva de Bzier
2. Definicin
3. Programa ejemplo con OpenGL
4. Ejercicios propuestos
5. Referencias

Mg. Johnny R. Avendao Q. Pag. No. 1


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

1. CURVA DE BZIER (http://es.wikipedia.org/wiki/Curva_de_Bzier)

Se denomina curvas de Bzier a un sistema que se desarroll hacia los aos 1960, para el trazado de
dibujos tcnicos, en el diseo aeronutico y de automviles. Su denominacin es en honor a Bzier,
quien ide un mtodo de descripcin matemtica de las curvas que se comenz a utilizar con xito en
los programas de CAD.

Las curvas de Bzier fueron publicadas, por primera vez en 1962 por el ingeniero de origen francs
Pierre Bzier, que las us posteriormente, con profusin, en el diseo de las diferentes partes de los
cuerpos de un automvil, en sus aos de trabajo en la Renault. Por otra parte, tambin fueron
desarrolladas por Paul de Casteljau usando el algoritmo que lleva su nombre, el cual se trata de un
mtodo numricamente estable para evaluar las curvas de Bzier.

Posteriormente, los inventores del PostScript, lenguaje que permiti el desarrollo de sistemas de
impresin de alta calidad desde el ordenador, introdujeron en ese cdigo el mtodo de Bzier para la
generacin del cdigo de las curvas y los trazados. El lenguaje PostScript sigue emplendose
ampliamente y se ha convertido en un estndar de calidad universal; por ello, los programas de diseo
vectorial como Adobe Illustrator, el extinto Macromedia FreeHand, Corel Draw, tres de los ms
importantes programas de dibujo vectorial y otros como Inkscape, denominan como "bzier" a algunas
de sus herramientas de dibujo, y se habla de "Trazados Bzier", "pluma Bzier", "lpiz Bzier", etc. Su
facilidad de uso la ha estandarizado en el diseo grfico, extendindose tambin a programas de
animacin vectorial como Adobe Flash, y retoque fotogrfico (bitmap) como Photoshop y Gimp, donde
se usa para crear formas cerradas o selecciones.

2. DEFINICIN

La curva de Bzier se define como:


() = , ()
=0

!
Donde: , = (1 )
!()!

y los puntos de control (en 2 dimensiones):

= ( , ) ; = 0,1, ,

3. PROGRAMA EJEMPLO CON OPENGL (referencial)

El siguiente cdigo debe servir de referencia para posteriores actividades previa modificaciones:

#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>
#include<conio.h>
#include <math.h>
void dibujarEjes(void);
void init(void);
void display(void);
void reshape(int,int);
void keyboard(unsigned char, int, int);

void graficaCurvaBezier(void);
float CoeficienteNewton(int,int);
float factorial(int);
float CurvaBezier(float,int);
void graficaPuntosBezier(void);

Mg. Johnny R. Avendao Q. Pag. No. 2


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

float dim=400;
float pcontrol[7][2]={{-10.0,0.0},{-10.0,10.0},{10.0,10.0},{10.0,0.0},{10.0,-10.0},{0.0,-0.0},{0,0}};
int N=7,paso=0;

int main(int argc, char** argv)


{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(dim,dim);
glutInitWindowPosition(100,100);
glutCreateWindow("Grafico de una curva de Bezier 2D");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
/********************/
void dibujarEjes(void)
{
glBegin(GL_LINES);
glVertex2f(-20,0);
glVertex2f(20,0);
glVertex2f(0,-20);
glVertex2f(0,20);
glEnd();
}
/********************/
void init(void)
{
// parametros: rojo, amarillo y azul, el cuarto es el parametro alpha
// color de fondo
glClearColor(0.0,0.5,0.5,.0);
glShadeModel(GL_FLAT);
}
/********************/
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
// salva el estado actual de la matriz
glPushMatrix();
glColor3f(1.0,0.0,0.0);
dibujarEjes();
glColor3f(0.0,0.0,1.0);
if (paso==1)
{
glPointSize(5);
graficaPuntosBezier();
glPointSize(1);
glColor3f(0.0,1.0,0.0);
graficaCurvaBezier();
}
glPopMatrix();
// reecupera el estado del matriz
glFlush();
}
/********************/
void keyboard(unsigned char key, int x, int y)

Mg. Johnny R. Avendao Q. Pag. No. 3


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

{
switch (key)
{
case 'b': paso=1;
// se grafica la curva de Bezier
glutPostRedisplay();
break;
case 'n': paso=0;
// No se grafica la curva de Bezier
glutPostRedisplay();
break;
case 27: exit(0);
break;
}
}
/********************/
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-20.0,20.0,-20.0,20,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/********************/
void graficaPuntosBezier(void)
{
float x,y;
glBegin(GL_POINTS);
for(int i=0;i<N;i++)
{
x=pcontrol[i][0];
y=pcontrol[i][1];
glVertex2f(x,y);
}
glEnd();
}
/********************/
void graficaCurvaBezier(void)
{
float x,y;
glBegin(GL_LINE_STRIP);
for(float u=0.0;u<=1;u+=0.01)
{
x=CurvaBezier(u,0);
y=CurvaBezier(u,1);
glVertex2f(x,y);
}
glEnd();
}
/********************/
float CoeficienteNewton(int n,int k)
{
return factorial(n)/(factorial(k)*factorial(n-k));
}
/********************/
float factorial(int n)
{
float p=1;

Mg. Johnny R. Avendao Q. Pag. No. 4


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

for(int i=1;i<=n;i++)
p=p*(float)i;
return p;
}
/********************/
float CurvaBezier(float u,int coordenada)
{
float suma=0.0;
for(int i=0;i<N;i++)
{
suma=suma+pcontrol[i][coordenada]*CoeficienteNewton(N-1,i)*pow(u,N-1-
i)*pow(1.0-u,i);
}
return suma;
}
/********************/

4. EJERCICIOS PROPUESTOS

Ejercicio 01:

Modifique su programa empleando mens jerrquicos para una mejor interaccin y claridad del
algoritmo, adems de incorporar el zoom y las rotaciones deseadas.

Ejercicio 02:

Implemente el algoritmo de Casteljau para el diseo de la curva de Bzier, el cul viene definida
recursivamente como:

, = ( ) , + ,+ ; = , , . , ; = , , ,

Emplee esta versin y otra haciendo uso de un arreglo matricial, para comparar el tiempo de respuesta
en el renderizado (optativo):

Mg. Johnny R. Avendao Q. Pag. No. 5


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Curva de Bzier

Ejercicio 03:

Modifique su programa para graficar la Curva de Bzier en 3 dimensiones, los puntos de control
pueden ser representados por pequeas esferas slidas.

Ejercicio 04:

Modifique su programa de tal manera que se puedan ingresar los puntos de control de
directamente sobre la ventana grfica (slo en 2 dimensiones), posteriormente deber poder cambiar
de posicin cualquiera de ellas, redibujndose la curva de forma automtica.

Ejercicio 05:

Considere su aplicacin anterior y realice las consideraciones del caso para el empleo de mens
jerrquicos en todas las acciones del caso.

5. REFERENCIAS

1. Principles and Practice (Second Edition). Foley J. D., A.van Dam, S.K.Feiner and J.F. Hughes
Computer Graphics. Addison-Wesley. 1990

2. OpenGL Superbible. R. Wright and M. Sweet. Waite Group, Inc 1996

3. The OpenGL Utility Toolkit (GLUT) Programming Interface (API Version 3). Mark J. Kilgard,
Silicon Graphics, Inc 1996

4. The OpenGL Graphics System: A Specification (Version 1.2). Mark segal & Kurt Akeley. Silicon
Graphics, Inc 1998

5. Wikipedia, la enciclopedia libre. (enlace) http://es.wikipedia.org/wiki/

Mg. Johnny R. Avendao Q. Pag. No. 6

También podría gustarte