miércoles, 26 de septiembre de 2012

Matrices


Matrices

Las matemáticas que hay tras las transformaciones se simplifican gracias a las matrices. Cada una de las transformaciones puede conseguirse multiplicando una matriz que contenga los vértices por una matriz que describa la transformación. Por tanto todas las transformaciones ejecutables con ogl pueden describirse como la multiplicación de dos o más matrices.

El canal de transformaciones

Para poder llevar a cabo todas las transformaciones de, deben modificarse dos matrices: la matriz del Modelador y la matriz de Proyección. OpenGL proporciona muchas funciones de alto nivel que hacen muy sencillo la construcción de matrices para transformaciones. Éstas se aplican sobre la matriz que este activa en ese instante. Para activar una de las dos matrices utilizamos la función glMatrixMode. Hay dos parámetros posibles:

glMatrixMode(GL_PROJECTION);
Activa la matriz de proyección, y
glMatrixMode(GL_MODELVIEW);

Activa la del modelador. Es necesario especificar con que matriz se trabaja, para poder aplicar las transformaciones necesarias en función de lo que se desee hacer.

El camino que va desde los datos “en bruto” de los vértices hasta las coordenadas en pantalla sigue el siguiente camino: Primero, el vértice se convierte en una matriz 1x4 en la que los tres primeros valores son las coordenadas x, y, z. El cuarto número (llamado parámetro w) es un factor de escala, que no se va a usar de momento, usando el valor 1.0. Entonces se multiplica el vértice por la matriz del modelador, para obtener las coordenadas oculares. Éstas se multiplican por la matriz de proyección para conseguir las coordenadas de trabajo. Con esto se eliminan todos los datos que están fuera del volumen de proyección. Estas coordenadas de trabajo se dividen por el parámetro w del vértice, para hacer el escalado relativo. Finalmente, las coordenadas resultantes se mapean en un plano 2D mediante la transformación de la vista.

La matriz del modelador

La matriz del modelador es una matriz 4x4 que representa el sistema de coordenadas transformado que se está usando para colocar y orientar los objetos. Si se multiplica la matriz del vértice (de tamaño 1x4) por ésta se obtiene otra matriz 1x4 con los vértices transformados sobre ese sistema de coordenadas.

OpenGL proporciona funciones de alto nivel para conseguir matrices de translación, rotación y escalado, y además la multiplican por la matriz activa en ese instante, de manera que no hay que preocuparse por ello en absoluto.

Traslación

Imaginemos que se quiere dibujar un cubo con la función de la librería GLUT glutSolidCube, que lleva como parámetro el lado del cubo. Si se escribe el siguiente código:

glutSolidCube(5);

Se obtiene un cubo centrado en el origen (0,0,0) y con el lado de la arista 5. Ahora se quiere mover 10 unidades hacia la derecha (es decir, 10 unidades en el sentido positivo del eje de las x). Para ello se tendría que construir una matriz de transformación y multiplicarla por la matriz del modelador. Ogl nos ofrece la función glTranslate, que crea la matriz de transformación y la multiplica por la matriz que está activa en ese instante (en este caso debería ser la del modelador, GL_MODELVIEW). Entonces el código quedaría de la siguiente manera:

glTranslatef(10.0f, 0.0f, 0.0f);
glutSolidCube(5);

La “f” añadida a la función indica que se usarán flotantes. Los parámetros de glTranslate son las unidades a desplazar en el eje x, y y z, respectivamente. Pueden ser valores negativos, para trasladar en el sentido contrario.

Rotación

Para rotar, tenemos también una función de alto nivel que construye la matriz de transformación y la multiplica por la matriz activa, glRotate. Lleva como parámetros el ángulo a rotar (en grados, sentido horario), y después x, y y z del vector sobre el cual se quiere rotar el objeto. Una rotación simple, sobre el eje y, de 10° sería:
glRotatef(10, 0.0f, 1.0f, 0.0f);

Escalado

Una transformación de escala incrementa el tamaño de nuestro objeto expandiendo todos los vértices a lo largo de los tres ejes por los factores especificados. La función glScale lleva como parámetros la escala en x, y y z, respectivamente. El valor 1.0f es la referencia de la escala, de tal forma que:

glScalef(1.0f, 1.0f, 1.0f);

No modificaría el objeto en absoluto. Un valor de 2.0f sería el doble, y 0.5f sería la mitad. Por ejemplo, para ensanchar un objeto a lo largo de su eje z, de tal forma que quedase cuatro veces más “alargado” en este eje, sería:
glScalef(1.0f, 1.0f, 4.0f);

La matriz identidad

El “problema” del uso de estas funciones surge cuando se tiene más de un objeto en la escena. Estas funciones tienen efectos acumulativos. Es decir, si se quiere preparar una escena como la de la ilustración:

Con una esfera (de radio 3) centrada en (0, 10, 0) y otra centrada en (10, 0, 0), y se escribe el siguiente código (que es incorrecto):

glTranslatef(0.0f, 10.0f, 0.0f);
glutSolidSphere(3.0f, 8, 8);
glTranslate(10.0f, 0.0f, 0.0f);
glutSolidsphere(3.0f, 8, 8);

En este código, se dibuja primero una esfera en (0, 10, 0) como se quiere. Pero después, se está multiplicando la matriz del modelador (que ya estaba transformada para dibujar la primera esfera) por otra matriz de transformación que desplaza 10 unidades hacia la derecha. Por ello la segunda matriz se dibujaría, en (10, 10 ,0), y no en (10, 0, 0), como se pretendía.

Para solventar este problema se debe reiniciar la matriz del modelador a un estado conocido, en este caso, centrada en el origen de nuestro sistema de coordenadas oculares. Para ello se carga en la matriz del modelador la matriz identidad (una matriz 4x4 llena de ceros excepto en la diagonal, que contiene unos). Esto se consigue gracias a la función glLoadIdentity, que no lleva parámetros. Simplemente carga la matriz identidad en la matriz activa en ese instante. El código correcto para el ejemplo anterior quedaría de la siguiente manera:

glTranslatef(0.0f, 10.0f, 0.0f);
glutSolidSphere(3.0f, 8, 8);
glLoadIdentity();
glTranslate(10.0f, 0.0f, 0.0f);
glutSolidsphere(3.0f, 8, 8);  


La matriz de proyección

La matriz de proyección especifica el tamaño y la forma del volumen de visualización. El volumen de visualización es aquel cuyo contenido es el que se representa en pantalla. Está delimitado por una serie de planos de trabajo. De estos planos, los más importantes son los planos de corte, que son los que nos acotan el volumen de visualización por delante y por detrás. En el plano más cercano a la cámara (znear) es donde se proyecta la escena para luego pasarla a la pantalla. Todo lo que está más adelante del plano de corte más alejado de la cámara (zfar) no se representa.

Proyecciones ortográficas

Una proyección ortográfica es cuadrada en todas sus caras. Esto produce una proyección paralela, útil para aplicaciones de tipo CAD o dibujos arquitectónicos, o también para tomar medidas, ya que las dimensiones de lo que representan no se ven alteradas por la proyección.

Una aproximación menos técnica pero más comprensible de esta proyección es imaginar que se tiene un objeto fabricado con un material deformable, y se aplasta literalmente como una pared. Se obtendría el mismo objeto, pero plano, liso. Pues eso es lo que se vería por pantalla.

Para definir la matriz de proyección ortográfica y multiplicarla por la matriz activa (que debería ser en ese momento la de proyección, GL_PROJECTION), se utiliza la función glOrtho, que se define de la siguiente forma:

glOrtho(limiteIzquierdo, limiteDerecho, limiteAbajo, limiteArriba, znear, zfar)

Siendo todos flotantes. Los valores de znear y zfar no son las posiciones de esos planos en el espacio 3D. Representan la distancia desde el centro de proyección, con valor positivo hacia delante y negativo hacia atrás. Con esto simplemente se acota  lo que será¡ el volumen de visualización (un cubo).

Por ejemplo, la ilustración es un render de un coche con proyección ortográfica, visto desde delante.

El código utilizado para esta proyección ha sido:

glOrtho(-0.5f, 0.5f, -0.5f, 0.5f, 0.01f, 20.0f);

Proyecciones perspectivas

Una proyección en perspectiva reduce y estira los objetos más alejados del observador. Es importante saber que las medidas de la proyección de un objeto no tienen por qué coincidir con las del objeto real, ya que han sido deformadas.

El volumen de visualización creado por una perspectiva se llama frustum. Un frustum es una sección piramidal, vista desde la parte afilada hasta la base.

Se puede definir esta proyección utilizando la función glFrustum. Pero existe otra función de la librería GLU llamada gluPerspective que hace el proceso más sencillo. Se define de la siguiente forma:

Void gluPerspective(angulo, aspecto, znear, zfar);

Los parámetros de gluPerspective son flotantes y definen las características mostradas en la ilustración, el ángulo para el campo de visión en sentido vertical, el aspecto que es la relación entre la altura (h) y la anchura (w) y las distancias znear y zfar de los planos que acotan el fustrum al observador. Los valores de znear y zfar no son las posiciones de esos planos en el espacio 3D, representan la distancia desde el centro de proyección, con valor positivo hacia delante y negativo hacia atrás.
La ilustración muestra la escena del coche de la sección anterior, esta vez con una proyección en perspectiva:

El código utilizado para definir la proyección ha sido:

gluPerspective(45.0f,(GLfloat)(width/height),0.01f,100.0f);

Se usan 45° de ángulo, la relación entre el ancho y alto de la pantalla (width y height son el ancho y alto actual de la ventana) y las distancias a los planos de corte znear y zfar son 0.01 y 100 respectivamente.

martes, 25 de septiembre de 2012

Transformaciones geometricas

Hay que tener claro que no es lo mismo mover el objeto que mover la cámara. Si se mueve la cámara 3 unidades para atrás y se mueve el objeto 3 unidades para adelante la visión que se produce es la misma pero la escena ya no es la misma.
   
Las definiciones de las funciones son:

void glTranslate{fd}(TYPE x, TYPE y, TYPE z);
Multiplica la matriz actual por una matriz de traslación que mueve el objeto.s


void glRotate{fd}(TYPE angle,TYPE x, TYPE y, TYPE z);
Multiplica la matriz actual por una matriz de rotación que rota el objeto en la dirección de las agujas del reloj sobre el radio de origen en el punto x,y,z.



void glScale{fd}(TYPE x, TYPE y, TYPE z);
Multiplica la matriz actual por una matriz que cambia el tamaño del objeto a lo largo de los ejes. Las coordenadas x, y, z de cada objeto es multiplicada por los parámetros x, y, z.

lunes, 24 de septiembre de 2012

Proyeccion en OpenGL

Es  necesario activar la matriz e inicializarla mediante las órdenes OpenGL:

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

La proyección define el volumen del espacio que va a utilizarse para formar la imagen; en el caso de la proyección perspectiva este volumen es una pirámide truncada o frustum. Por lo tanto, en esta proyección se produce un efecto tamaño - distancia y es la proyección más usada en animación por ordenador o simulación visual, donde se requiere un alto grado de realismo. El frustum de visualización se define en OpenGL de la forma siguiente:

void glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,

GLdouble near, GLdouble far)

Dónde los parámetros left, right, bottom, top, near y far definen el frustum tal y como se muestra en la figura siguiente:

Tal y como se muestra en la figura, el frustum no tiene porqué ser simétrico respecto al eje Z, ya que es posible utilizar valores distintos para left y right, o para bottom y top.

La especificación de una proyección perspectiva mediante glFrustum puede resultar complicada debido a que la forma de definición no resulta intuitiva. En lugar de esta orden, podemos utilizar la rutina de la librería de utilidades de OpenGL gluPerspective. Esta rutina permite especificar el volumen de la vista de forma diferente, utilizando el ángulo de visión sobre el plano XZ (fovy) y el ratio de la anchura respecto a la altura (aspect). Mediante estos parámetros es posible determinar el volumen de la vista, tal y como se muestra en la figura siguiente: 
Esta forma de definir la proyección resulta más intuitiva. La sintaxis de la rutina gluPerspective es la siguiente:

void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far)

Cuando utilicemos la rutina gluPerspective tendremos que tomar precauciones con respecto a los valores de fovy y near. Una mala elección de dichos valores puede producir deformaciones en la imagen similares a las aberraciones ópticas habituales en las lentes fotográficas (v.g. efecto “ojo de pez”).

Otra forma de definir la manera en que una cámara sintética observa una escena es mediante dos posiciones en el espacio: la del punto de interés o punto al que la cámara está enfocando, y la del punto de vista o punto dónde se encuentra situada la cámara. Esta forma de definir la transformación de la vista es la que utiliza la orden de la librería de utilidades de OpenGL gluLookAt. La sintaxis de la orden es la siguiente:

gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,

GLdouble centerx, GLdouble centery, GLdouble centerz,

GLdouble upx, GLdouble upy, GLdouble upz);

Donde los parámetros eyex, eyey, eyez indican la posición del punto de vista; centerx, centery, centerz especifican el punto de interés y upx, upy, upz la dirección tomada como “arriba”, o inclinación de la cámara

La proyección ortográfica define un volumen de la vista cuya geometría es la de un paralelepípedo rectangular (o informalmente, una “caja”). A diferencia de la proyección perspectiva, la distancia de un objeto a la cámara no influye en el tamaño final del mismo en la imagen. Este tipo de proyecciones son comunes en aplicaciones de diseño asistido por ordenador, ya que las medidas sobre la imagen son proporcionales a las reales de acuerdo a un determinado factor de escala. Entre las proyecciones ortográficas más comunes en este tipo de sistemas cabe destacar la proyección ortográfica (planta, alzado y perfil) y la proyección isométrica. La caja de visualización se define en OpenGL de la forma siguiente:

void glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,

GLdouble near, GLdouble far)

Dónde los parámetros left, right, bottom, top, near y far definen la caja tal y como se muestra en la figura siguiente:
 

jueves, 13 de septiembre de 2012

Generacion de lineas rectas


LINEA

Es el medio gráfico fundamental para representar las formas que nos rodean y las ideas, creando un lenguaje que no necesita palabras. Es el elemento visual más importante del dibujo. Tiene la facultad de transmitir sensaciones ya sea por su forma o por su disposición, solas o agrupadas.

 Líneas rectas: Expresan robustez y rigidez
 Líneas curvas: Sugiere movimiento, vitalidad, suavidad, delicadeza.
 Líneas horizontales: Expresan calma, reposo, tranquilidad, peso, estabilidad. Hacen las   cosas más anchas y extensas.
 Líneas verticales: Nos transmiten fuerza, orden, equilibrio, movimiento ascendente o descendente, elegancia, espiritualidad. Producen el fenómeno visual de alargar las cosas.
 Líneas oblicuas: Expresan inestabilidad, acción, caída, caos, desorden, confusión, sensación de profundidad y alejamiento.
 Líneas quebradas: Producen el efecto de incertidumbre,  indecisión. Una sensación similar a la ro-tura, la fragmentación.
 Líneas radiales o concurrentes: Sugieren luminosidad, explosión, asombro, dispersión, profundidad.

ALGORITMO DDA PARA GENERACION DE RECTAS

Este Algoritmo sirve para Generar Una Línea Recta, y Para eso Hace Uso de La pendiente Y de los Incrementos en X, Y.
Como todos saben Open GL es una herramienta que nos facilita mucho la generación de gráficos por computadora. Aquí aplicamos conocimientos matemáticos, usando Open GL para generar rectas, circunferencias, elipses, etc. El Algoritmo DDA es un algoritmo de línea de conversión de rastreo que se basa en el cálculo ya sea en el incremento de X o en el incremento de Y. La finalidad de este algoritmo es determinar los valores enteros correspondientes más próximos a la trayectoria de la línea para la otra coordenada.

void DDA(int x0,int y0,int xFin,int yFin){
int dx = xFin - x0, dy = yFin - y0, steps, k;
float xIncremento, yIncremento;
float x = x0, y = y0;
if (fabs (dx) > fabs (dy))
steps = fabs (dx); /* |m|<1>
else
steps = fabs (dy); /* |m|>=1 */
xIncremento=float(dx)/float (steps);
yIncrement = float (dy) / float (steps);
setPixel (round (x), round (y));
for (k = 0; k <>{
x += xIncremento;
y += yIncremento;
setPixel (round (x), round (y));
}

}

ALGORITMO DE BRESENHAM PARA TRAZAR LÍNEAS

El algoritmo de Bresenham es un algoritmo creado para dibujar rectas en los dispositivos de gráficos rasterizados, como por ejemplo un monitor de ordenador, que determina qué pixeles se rellenarán, en función de la inclinación del ángulo de la recta a dibujar. El algoritmo de Bresenham sirve para trazar una línea entre dos puntos.

void Bres(int x0,int y0,int xFin,int yFin){
int dx = fabs(xFin - x0),
dy = fabs(yFin - y0);
int p = 2 * dy - dx;
int dosDy = 2 * dy,
dosDyMenosDx = 2 * (dy - dx);
int x, y;
if (x0 > xFin) {
x = xFin;
y = yFin;
xFin = x0;
}
else {
x = x0;
y = y0;
}
setPixel (x, y);
while (x <>
x++;
if (p <>
p += dosDy;
else {
y++;
p += dosDyMenosDx;
}

setPixel (x, y);

}

}

CIRCUNFERENCIA

Se conoce como circunferencia a la línea cerrada de formato curva y apariencia plana en la cual los puntos resultan equidistantes del punto central que se localiza en el mismo plano. Esta distancia que separa al conjunto de puntos y al área central se conoce como radio, mientras que el segmento de recta que compone un par de radios alineados recibe el nombre de diámetro.

ALGORITMO DE BRESENHAM PARA TRAZAR CIRCUNFERENCIAS

Los dos procedimientos planteados en esta sección utilizan demasiadas operaciones, sobre todo de aritmética de punto flotante, cuando deseamos trazar cientos de círculos, comenzamos a pensar en que debemos encontrar una forma más eficiente de hacerlo.

Estamos de acuerdo en que si somos capaces de trazar el circulo en el origen, moverlo de manera en que su centro quede ubicado en (xc; yc) implica simplemente sumar xc a todas las coordenadas x y sumar yc a todas

Resumen Capitulo 2


TRANSFORMACIONES GEOMÉTRICAS
El estudiante conocerá y aplicará las principales transformaciones geométricas sobre objetos en 2D y 3D.

TRANSFORMACIONES BIDIMENSIONALES
Se aplica una traslación en un objeto para cambiar su posición a lo largo de la trayectoria de una línea recta de una dirección de coordenadas a otra.
La traslación es una transformación de cuerpo rígido que mueve objetos sin deformarlos.
Los polígonos se trasladan al sumar el vector de traslación a la posición de coordenadas de cada vértice y se vuelve a generar el polígono utilizando un nuevo conjunto de coordenadas y vértices y las especificaciones actuales de los atributos.

ROTACIÓN
Se aplica una rotación bidimensional en un objeto al cambiar su posición a lo largo de la trayectoria de una circunferencia en el plano de x y. para generar una rotación, especificamos un ángulo de rotación θ y la posición (xr, yr) del punto de rotación (o punto pivote) en torno al cual se gira el objeto.
Los valores positivos para el ángulo de rotación definen rotaciones en sentido opuesto a las manecillas del reloj alrededor del punto pivote y los valores negativos giran los objetos en la dirección del reloj.

ESCALACION
Una transformación de escalación altera el tamaño de un objeto. Se puede realizar esta operación para polígonos al multiplicar los valores de coordenadas de cada vértice por los factores de escalación para producir las coordenadas transformadas.
Podemos controlar la localización de unos objetos escalado al seleccionar una posición llamada punto fijo, que debe permanecer sin cambios después de la transformación de escalación.

COORDENADAS HOMOGÉNEAS Y REPRESENTACIÓN MATRICIAL
En las aplicaciones de diseño y de creación de imágenes, realizamos traslaciones, rotaciones y escalaciones para ajustar los componentes de la imagen en sus posiciones apropiadas. En este tema consideramos cómo se pueden volver a formular las representaciones de la matriz de modo que se pueden procesar de manera eficiente esas secuencias de transformación.
Es posible expresar cada una de las transformaciones básicas en la forma de matriz general con las posiciones de coordenadas P y P’ representadas como columnas de vector.
Como escalación seguida por rotación y luego traslación, debemos calcular las coordenadas transformadas un paso a la vez. Primero, se escalan las posiciones de coordenadas, después se giran estas coordenadas escaladas y por último se trasladan las coordenadas giradas.
Un planteamiento más eficiente combinaría las transformaciones de manera que se obtengan las coordenadas finales directamente a partir de las coordenadas iniciales para eliminar el cálculo de coordenadas intermedias.
Para transformaciones geométricas bidimensionales, seleccionamos el parámetro homogéneo h como cualquier valor no cero. Así, existe un número finito de representaciones homogéneas equivalentes para cada punto de coordenadas (x, y).
Una opción conveniente consiste en sólo establecer h = 1. Entonces, se representa cada posición bidimensional con las coordenadas homogéneas (x, y, 1).
Las representaciones de matriz o representaciones matriciales son métodos estándar para implementar transformaciones en sistemas de gráficas. En muchos sistemas, las funciones de rotación y escalación producen transformaciones con respecto del origen de las coordenadas.

COMPOSICION DE TRASFORMACIONES BIDIMENSIONALES
Con las representaciones de matriz del tema anterior, podemos establecer una matriz para cualquier secuencia de transformaciones como una matriz de transformación compuesta al calcular el producto de la matriz de las transformaciones individuales. La creación de productos de matrices de transformación a menudo se conoce como concatenación o composición de matrices.

ROTACIÓN PUNTO PIVOTE GENERAL
Con un paquete gráfico que sólo ofrezca una función de rotación para girar objetos con respecto del origen de las coordenadas, podemos generar casi cualquier punto pivote seleccionado (xr, yr) al realizar la siguiente secuencia de operaciones de traslación-rotación-traslación:
1. Traslade el objeto de modo que se mueva la posición del punto pivote al origen de las coordenadas.
2. Gire el objeto con respecto del origen de las coordenadas.
3. Traslade el objeto de manera que se regrese el punto pivote a su posición original.

ESCALACION DEL PUNTO FIJO GENERAL
1. Traslade el objeto de modo que el punto fijo coincida con el origen de las coordenadas.2.
2. Escale el objeto con respecto del origen de las coordenadas
3. Utilice la traslación inversa del paso 1 para regresar el objeto a su posición original.

TRANSFORMACIÓN VENTANA AEREA DE VISTA
Algunos paquetes gráficos permiten que el programador especifique coordenadas de primitivas de salida en un sistema de coordenadas de mundo de punto flotante, usando las unidades que sean relevantes para el programa de aplicación: angstroms, micras, metros, millas, años luz, etcétera. Se emplea el término de mundo porque el programa de aplicación representa un mundo que se crea o presenta interactivamente para el usuario:
Como las primitivas de salida se expresan en coordenadas de mundo, hay que indicar al paquete de subrutinas gráficas cómo establecer la correspondencia entre las coordenadas de mundo y las coordenadas de pantalla (usaremos el término específico coordenadas de pantalla para relacionar este análisis específicamente con SRGP, pero podrían usarse dispositivos de impresión, en cuyo caso sería más apropiado el término coordenadas de dispositivo).
El modificador de coordenadas de mundo se emplea con ventana para subrayar que no se trata de una ventana de administrador de ventanas, un concepto distinto y más reciente que por desgracia tiene el mismo nombre. Este modificador se omitirá cuando no exista ninguna ambigüedad con respecto al tipo de ventana que se trate.
Un administrador de ventanas podría establecer la correspondencia entre el lienzo 0 de SRGP y una ventana menor que la pantalla completa; en este caso no siempre estará visible todo el lienzo ni toda el área de vista.
La ventana, especificada por sus vértices inferior izquierdo y superior derecho, se traslada primero al origen de las coordenadas de mundo. Después se escala el tamaño de la ventana para que sea igual al tamaño del área de vista. Por último se usa una traslación para colocar un área de vista.

TRANSFORMACIONES DE COMPOSICIÓN GENERAL Y DE EFICIENCIA COMPUTACIONAL
Una transformación bidimensional general, que representa una combinación de traslaciones, rotaciones y escalaciones se puede expresar como Los cuatro elementos rs ij son los términos multiplicativos de rotación -escalación en la transformación que implican sólo ángulos de rotación y factores de escalación. Los elementos trs x y trs  y son los términos de traslación que contienen combinaciones de distancias de traslación, coordenadas de punto pivote y de punto fijo, así como de ángulos de rotación y parámetros de escalación.
Dado que los cálculos de la rotación requieren evaluaciones trigonométricas y varias multiplicaciones para cada punto que se transforma, la eficiencia computacional puede tornarse una consideración importante en las transformaciones de rotación. En animaciones y otras aplicaciones que implican muchas transformaciones repetidas y ángulos de rotación pequeños, podemos utilizar aproximaciones y cálculos repetitivos para reducir los cálculos en las ecuaciones de transformación compuesta.
Cuando el ángulo de rotación es pequeño, se pueden sustituir las funciones trigonométricas con valores de aproximación con base en los primeros términos de sus expansiones de series de potencia.

REPRESENTACION MATRICIAL DE TRANSFORMACIONES TRIDIMENSIONALES
Así como las transformaciones bidimensionales se pueden representar con matrices de3 X 3 usando coordenadas homogéneas, las transformaciones tridimensionales se pueden representar con matrices de 4 X 4, siempre y cuando usemos representaciones de coordenadas homogéneas de los puntos en el espacio tridimensional.
La transformación de un punto a esta forma se denomina homogeneización, igual que antes. Además los puntos cuya coordenada W es cero se llaman puntos en el infinito. También existe una interpretación geométrica. Cada punto en el espacio tridimensional se representa con una línea que pasa por el origen en el espacio de cuatro dimensiones, y las representaciones homogeneizadas de estos puntos forman un sub-espacio tridimensional de un espacio de cuatro dimensiones definido por la ecuación W = 1.

COMPOSICION DE TRANSFORMACIONES TRIDIMENCIONALES
Las transformaciones geométricas básicas son la traslación, la rotación y la escalación. La traslación mueve un objeto con una trayectoria en línea recta de una posición a otra. La rotación mueve un objeto de una posición a otra a lo largo de una trayectoria circular sobre un eje de rotación específico. Para aplicaciones bidimensionales, la trayectoria de rotación se encuentra en el plano xy sobre un eje que es paralelo al eje z.
Las transformaciones de cambio de escala cambian las dimensiones de un objeto con respecto a una posición fija. Podemos expresar las transformaciones bidimensionales como operadores de matrices de 3 por 3 y las transformaciones tridimensionales como operadores de matrices de 4 por4, de tal forma que esas secuencias de transformaciones pueden concatenarse dentro de una matriz compuesta. En general, podemos representar tanto transformaciones bidimensionales como tridimensionales con matrices de 4 por 4.

Presentacion-Explicacion

https://docs.google.com/open?id=0BwxVDKMoql9wdUpXQlZNRXR6c1E

<iframe src="https://docs.google.com/file/d/0BwxVDKMoql9wdUpXQlZNRXR6c1E/preview" width="640" height="480"></iframe>

Glosario


Coordenadas homogéneas

Son un instrumento usado para describir un punto en el espacio proyectivo. Fueron introducidas por el matemático alemán August Ferdinand Möbius en el año 1837.
También pueden usarse como un sistema alternativo de coordenadas para trabajar en el espacio euclídeo, pues éste puede verse como un subconjunto del espacio proyectivo. De ese modo, las coordenadas homogéneas son ampliamente usadas en infografía para la representación de escenas en tres dimensiones. Su notación en forma matricial se emplea en bibliotecas de programación gráfica en 3D como OpenGL y Direct3D.

Pila

Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.

Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.

Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo.
Las pilas suelen emplearse en los siguientes contextos:
  • Evaluación de expresiones en notación postfija (notación polaca inversa).
  • Reconocedores sintácticos de lenguajes independientes del contexto
  • Implementación de recursividad.

martes, 4 de septiembre de 2012

Fractales

•GDI.- Graphics Device Interface, es uno de los tres componentes o subsistemas de la interfaz de usuario de Microsoft Windows. Trabaja junto con el núcleo y la API de Windows. Esta Interfaz de programación de aplicaciones se encarga del control gráfico de los dispositivos de salida como los monitores o las impresoras.










Triangulo de Sierpinski

Triangulo de Sierpinski

Prisma Triangular





Cubo
Toroide
Cubo de colores