martes, 16 de octubre de 2007

previo 8

1. ¿Qué es una curva/superficie paramétrica?

Sea C Una curva que consiste en todos los pares ordenados (f(t),g(t)), donde f y g son funciones continuas en un intervalo I. Las ecuaciones
x = f(t), y = (t)
Para t en I, se denominan ecuaciones paramétricas de C con parámetro t

Una superficie paramétrica es la imagen de una función o transformación r definida en una región R de un plano uv y que tiene valores en el espacio xyz. La imagen bajo r en cada punto (u,v) en R es el punto del espacio xyz con vector de posición.
r(u,v)= x(u,v), y(u,v), z(u,v)
Dado que una superficie paramétrica es una imagen de una transformación en el espacio, es posible por lo tanto tomar coordenadas cilíndricas y esféricas, para expresar la superficie con otros parámetros distintos a los rectangulares.

2. Describa los resultados aparentes y diferencias entre las familias de curvas:

BEZIER

Se denomina curvas de Bézier a un sistema que se desarrolló hacia los años 1960, para el trazado de dibujos técnicos, en el diseño aeronáutico y de automóviles. Su denominación es en honor a Pierre Bézier, quien ideó un método de descripción matemática de las curvas que se comenzó a utilizar con éxito en los programas de CAD.

La idea de definir geométricamente las formas no es demasiado compleja: un punto del plano puede definirse por coordenadas. Por ejemplo, un punto A tiene unas coordenadas (x1, y1) y a un punto B le corresponde (x2,y2). Para trazar una recta entre ambos basta con conocer su posición.

Si en lugar de unir dos puntos con una recta se unen con una curva, surgen los elementos esenciales de una curva Bézier: los puntos se denominan nodos o puntos de anclaje. La forma de la curva se define por unos puntos invisibles en el dibujo, denominados puntos de control, manejadores o manecillas. En general, para trazar segmentos rectos se hace clic con el útil de dibujo (la pluma), se mueve el ratón y se hace clic en un nuevo punto, y así sucesivamente. Para crear segmentos suaves, curvados, se hace clic y se mantiene apretado el botón mientras se ajusta la forma de la curva. Esta forma puede modificarse posteriormente, moviendo los puntos de control según se desee. Los segmentos rectos pueden conectarse con segmentos curvos.

SPLINE

un spline es una curva definida a trozos mediante polinomios. En los problemas de interpolación, se utiliza a menudo la interpolación mediante splines porque da lugar a resultados similares requiriendo solamente el uso de polinomios de bajo grado a la vez que se evitan las oscilaciones, que en la mayoría de las aplicaciones resultan indeseables, que aparecen al interpolar mediante polinomios de grado elevado.

Para el ajuste de curvas, los splines se utilizan para aproximar formas complicadas. La simplicidad de la representación y la facilidad de cómputo de los splines los hacen populares para la representación de curvas en informática, particularmente en el terreno de los gráficos por ordenador.

NURBS

Los NURBS (Non-Uniform Rational B-Splines) son entes matemáticos que definen exactamente una curva o superfice a partir de varios puntos de control, no necesariamente pertenecientes a la trayectoria, y unos pesos asociados a los mismos.
Cuanto mayor sea la complejidad de la curva, mayor será el número de puntos de control que deberá especificarse, pero, en todo caso, el número de puntos generados será menor que el necesario utilizando la aproximación tradicional por tramos rectos.

Curvas Nurbs
Son una herramienta importante para trabajar en 3D. Pueden ser una forma simple de modelar una superficie o un avanzado control para la animación, se definen por puntos de control, que controlan la forma de la curva. También consta de otros tipos de punto como los editables, que indica el principio o final de un segmento, y rectas que unen los puntos de control en una curva.

La geometría de la curva se define por: grados, puntos de control, nodos y regla de calculo.

Superficies Nurbs
Tienen los principios de las curvas nurbs, y se aplican igual, sin embargo una diferencia entre curvas y superficies es que las curvas se sometena una sola direccion y la superficie es bidireccional, estas bidireccion tiene un origen llamado normal, que determina la parte frontal o trasera de la misma.

3. Ventajas y desventajas de usar curvas/superficies paramétricas contra modelos de alta y baja densidad de polígonos.

El trazado de curvas y superficies paramétricas es más fácil de calcular y por ende se necesita de menos recursos y el trazado es más rápido. Una desventaja de esto es que a diferencia de los modelos con polígonos (mayormente los de alta densidad) el trazado de la recta es más precisa ya que se podría suponer que con los polígonos la distancia de los lados de los polígonos tiende a cero.

4. ¿Qué familias de curvas/superficies paramétricas están implementadas en OpenGL?

Splines, B-Splines y NURBS

5. ¿Cómo escribimos código que las defina y dibuje? dé dos ejemplos para cada tipo de curva/superficie.

//CURVA DE BEZIER
#include
#include
#include
#include
GLfloat ctrlpoints[4][3] = {
{ -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0},
{2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}};
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
}
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
/* The following code displays the control points as dots. */
glPointSize(5.0);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < 4; i++)
glVertex3fv(&ctrlpoints[i][0]);
glEnd();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h,
5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

//SUPERFICIE DE BEZIER
#include
#include
#include
#include
GLfloat ctrlpoints[4][4][3] = {
{{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0},
{0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
{{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0},
{0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}},
{{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0},
{0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}},
{{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},
{0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};
void display(void)
{
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix ();
glRotatef(85.0, 1.0, 1.0, 1.0);
for (j = 0; j <= 8; j++) {
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
}
glPopMatrix ();
glFlush();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
}

void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h,
5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

No hay comentarios: