Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Taller06CGrafica2016 2
Taller06CGrafica2016 2
Laboratorio 06
Curva 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.
El conocimiento requerido para realizar esta prctica es de haber asimilado los conceptos bsicos
de C/C++ y OpenGL.
1. Curva de Bzier
2. Definicin
3. Programa ejemplo con OpenGL
4. Ejercicios propuestos
5. Referencias
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
() = , ()
=0
!
Donde: , = (1 )
!()!
= ( , ) ; = 0,1, ,
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);
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;
{
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;
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):
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
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