lunes, 24 de septiembre de 2012

viewport


Definición de viewport 

Las Viewport son regiones independientes que permiten cargar archivos y manejar los detalles de este libremente es decir definir escalas, grillas, tipos de archivos, tamaños y ubicación para cada una de ellas. Cada estilo de ploteo puede contener una o más viewport, por ejemplo en un mismo ploteo se pueden imprimir la topografía del proyecto, una fotografía satelital y un perfil de interés, todo concentrado en una misma hoja.
Viewport en opengl

Volviendo a la analogía con la cámara fotográfica, la transformación del viewport se correspondería con el proceso en que se decide el tamaño final de la fotografía revelada. Definiremos un viewport como la porción de la ventana de la aplicación en la que se mostrará la imagen. El hecho de que el viewport sea una porción de una ventana implica que el encargado de crearlo y manejarlo será el sistema gestor de ventanas sobre el que se ejecute la aplicación (X-11, Windows, etc.) y no OpenGL.

 Por defecto, al crear una ventana se inicializa un viewport que ocupa toda el área gráfica disponible. Es posible cambiar este valor mediante la rutina OpenGL:

 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
 

El ratio del viewport (width / height) debería ser normalmente equivalente al definido en la proyección utilizada. Existen aplicaciones en las que se divide la ventana en distintos viewports para mostrar una vista distinta en cada uno de ellos (aplicaciones de diseño asistido por ordenador). Si queremos mantener la ventana de proyección y el viewport proporcionales, será necesario detectar los eventos de ventana (fundamentalmente el cambio de tamaño) y redefinir la proyección y el viewport de forma adecuada.

 
Ejecucion  del programa

Resumen


OPERACIONES CON MATRICES: DIBUJANDO EL CAMINO

La transformación de las coordenadas se realiza internamente en OpenGL a partir de las

matrices de transformación y de las coordenadas de modelado del objeto. Sin embargo, para representar el rastro que dibuja la tortuga al desplazarse, se realizará explícitamente la transformación de la coordenada en la que se encuentra la tortuga. De esta forma se actúa directamente en la matriz de transformación.

LA PILA DE MATRICES

En la función display() se encuentran las llamadas a dos funciones de matrices que

todavía no han sido comentadas. Se trata de glPushMatrix() y glPopMatrix(). Para

comprender su funcionamiento, primero se va a experimentar que es lo que ocurre cuando no

están dichas llamadas. Para ello se comentan en la función display() ambas llamadas:

void display(void) {

...

// glPushMatrix();

...

glTranslatef(0.0, 0.0, .5);

...

// glPopMatrix();

glutSwapBuffers();

}

Para solucionar este problema OpenGL dispone de unos stacks o pilas de matrices, que

permiten almacenar y recuperar una matriz anterior. Aunque OpenGL dispone de pilas para las matrices GL_MODELVIEW y GL_PROJECTION, sólo se suele utilizar la pila de GL_MODELVIEW.

La función glPopMatrix() elimina la matriz superior, quedando en la parte superior de

la pila la matriz que estaba en el momento de llamar a la función glPushMatrix().

 

DIBUJANDO UN RASTRO

Una característica de Logo es que la tortuga al avanzar va dibujando el camino por el
que ha pasado. Hasta ahora la aplicación va transformando las coordenadas del objeto para situarlo en la nueva posición según las instrucciones introducidas pero no muestra la ruta seguida.
Para mostrar la ruta es necesario almacenar los puntos por los que pasa la tortuga. El
rastro consistirá en una línea que una estos puntos.

Necesitaremos realizar tres operaciones: calcular la coordendas donde se encuentra la
tortuga, almacenar dicha coordenada y dibujar el rastro.
Para almacenar los puntos se utiliza una variable para indicar el número de puntos y tres
vectores para las coordenadas x, y, z.

int np = 0;

float px [10000];

float py [10000];

float pz [10000];

Para calcular las coordenadas de la tortuga es necesario conocer la matriz de
transformación de modelado.
Para operar con la matriz mModel, se cargará en la pila de matrices de
GL_MODELVIEW despues de realizar un PushMatrix(), de modo que no altere la matriz
actual. En la función main() se inicializa esta matriz con el código:

glMatrixMode(GL_MODELVIEW);

glPushMatrix();

glLoadIdentity();

glGetDoublev (GL_MODELVIEW_MATRIX, mModel);

glPopMatrix();

En este código se realizan las siguientes operaciones: . se indica primeramente sobre que matriz se van a realizar las opereraciones con.
glMatrixMode(); . se crea una nueva matriz con glPushMatrix(); . se carga la matriz identidad con glLoadIdentity(); . se almacena la matriz superior de la pila en el vector mModel con la fucnión.
glGetDoublev(); . y finalmente se elimina la matriz superior de la pila con glPopMatrix() para dejar la que estaba antes de este proceso.

 

domingo, 23 de septiembre de 2012

investigacion

Proyección en perspectiva
La característica principal de la proyección en perspectiva es que cuanto más alejado está un objeto de la cámara, más pequeño aparece en la imagen final. Esto ocurre porque el volumen de visión para una proyección en perspectiva es un tronco de pirámide (una pirámide truncada a la cual se ha cortado el pico por un plano paralelo a la base). Los objetos que están dentro del volumen de visión son proyectados hacia la cúspide de la pirámide, donde estaría situada la cámara o punto de vista. Los objetos más cercanos al punto de vista aparecen más grandes porque ocupan proporcionalmente una cantidad mayor del volumen de visión que aquellos que están más alejados.
Para definir un volumen de visión de este tipo y por lo tanto crear una matriz de
transformación de proyección en perspectiva se utiliza la rutina gluPerspective() de la “Utility Library” y que se especifica a continuación:
void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ).


Proyección Ortogonal
Con una proyección ortogonal, el volumen de visión es un paralelepípedo, o más informalmente, una caja. A diferencia de la proyección en perspectiva, el tamaño del volumen de visión no cambia desde una cara a la otra, por lo que la distancia desde la cámara no afecta a lo grande que aparezca un objeto.
Para definir un volumen de visión de este tipo y por lo tanto crear una matriz de
transformación de proyección ortogonal se utiliza la rutina glOrtho(), perteneciente a la librería básica de OpenGL, y que se especifica a continuación:
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far ).


Transformaciones geométricas en OpenGL.
OpenGL proporciona funciones para controlar la traslación, rotación y escalado. Estas tranformaciones se representan como matrices 4x4 ordenadas como vectores columna, tal y como se muestra en la siguiente figura:

Recuerda que en C, el primer elemento de un array tiene subíndice 0.
La familia de funciones que implementan las transformaciones es:

void glTranslate{fd}(TIPO x, TIPO y, TIPO z);
    void glTranslatef(float x, float y, float z);
    void glTranslated(double x, dluble y, double z);
void glRotate{fd}(TIPO angulo_en_grados, TIPO x, TIPO y, TIPO z);
void glScale{fd}(TIPO sx, TIPO sy, TIPO sz);

 


Observa que la traslación modifica el último vector columna, miestras que el escalado y las rotaciones comparten los elementos de la submatriz 3x3 superior izquierda.


Has de tener en cuenta que las tranformaciones no son conmutativas entre sí, es decir, el resultado no es el mismo si sobre un objeto efectúas una rotación y luego una traslación, que si efectúas primero una traslación y luego una rotación. Es más, en general las rotaciones tampoco son conmutativas entre si. El orden de aplicación de las transformaciones es muy importante.


Otro detalle que has de tener muy en cuenta es el orden de aplicación de las transformaciones en OpenGL. Observa el siguiente fragmento de código:

glTranslatef(1.0f, 1.0f, 1.0f);
glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
glScalef(2.0f, 2.0f, 2.0f);
objeto();


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.
glRotatef(10, 0.0f, 1.0f, 0.0f);
TRASLADAR
Para trasladar un objeto de nuestra escena lo haremos mediante la función glTranslatef(x,y,z).
Por ejemplo si queremos desplazar un objeto en el eje de la x 100 unidades, escribiremos:
glTranslatedf(100,0,0)
y ahora dibujaríamos el o los objetos que queremos que se aplique este traslado.

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.
glScalef(1.0f, 1.0f, 1.0f);
glScalef(1.0f, 1.0f, 4.0f);
PILA DE MATRICES

A veces nos interesa guardar el estado de las transformaciones por lo que utilizar la matriz de identidad no nos sirve, para este caso opengl tiene las pilas de matrices, funcionan igual que una pila, para ello tenemos las funciones glPushMatrix que pone en la pila y glPopMatrix que la quita de la pila, por lo tanto si nosotros aplicamos una transformación a toda la escena y luego a un objeto queremos aplicarle otra lo podemos poner en la pila luego quitarlo de la pila y asi mantenemos la transformación inicial.

En el ejemplo que os podéis descargar si pulsáis el botón ‘sin pila’ deja de usar las funciones glPushMatrix y glPopMatrix. Entonces veréis como el cubo de la izquierda se le acumulan las 4 transformaciones y se mueve de diferente forma que utilizando la pila. Si volvéis a pulsar el botón para que use la pila lo que hace es aplicar  3 transformaciones la que esta fuera de la pila y las 2 que tiene en concreto dentro de la pila del segundo cubo

La pila de transformaciones.
Para poder almacenar transformaciones parciales OpenGL nos proporciona una pila sobre la que poder apilar y desapilar la matriz de transformación modelo-vista actual. Sobre esta pila se pueden hacer dos operaciones básicas:
glPushMatrix(); Hace una copia de la matriz actual sobre la cima de la pila.
glPopMatrix(); Extrae la cima de la pila y la copia sobre la matriz actual.
Mediante el uso de estas funciones podemos «aislar» las trasformaciones que se aplican a objetos distintos. Observa el siguiente fragamento de código:

glLoadIdentity(); /* Carga la identidad sobre la matriz actual */
glPushMatrix(); /* Copia la identidad a la cima de la pila */
glTranslate3f(x, y, z); /* Efectua una tralación */
objeto(); /* Dibujamos un objeto cualquiera */
glPopMatrix(); /* Extraemos la cima de la pila y la copiamos sobre la
                  matriz actual, de nuevo tenemos la identidad en la
                  matriz actual */
glPushMatrix(); /* Volvemos a apilar la identidad */
glRotate3f(alfa, beta gamma); /* Efectuamos una rotación */
objeto();
glPopMatrix(); /* Volvemos a recuperar la identidad */

Como ves, podemos «aislar» las trasformaciones que actúan sobre los objetos si las colocamos entre un par glPushMatrix() / glPopMatrix().

jueves, 13 de septiembre de 2012

Presentacion

transformaciones geométricas basicas en los sistemas de graficación:  Rotación, Traslación, Escalación en  2  dimensiones.


Todo cuerpo representado en un plano puede sufrir varios tipos de transformaciones en su estructura. Las transformaciones de tipo básico, como pueden ser la translación, Escalación y rotación de objetos.
Un objeto definido se construye a partir de una serie de puntos coordenados, desde los cuales se pueden aplicar diversas fórmulas para realizar un cambio de la figura.

traslación
Una traslación es el movimiento en línea recta de un objeto de una posición a otra.
Movimiento de una figura, sin rotarla ni voltearla. "Deslizar".

La figura sigue viéndose exactamente igual, solo que en un lugar diferente.
 Se aplica una transformació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.
Ejemplos

Rotación
Para rotar un objeto (en este caso bidimensional), se ha de determinar la cantidad de grados en la que ha de rotarse la figura. Para ello, y sin ningún tipo de variación sobre la figura, la cantidad de ángulo ha de ser constante sobre todos los puntos.

Otra forma de conseguir la rotación, respecto a un punto de movimiento, es fijar los diferentes puntos respecto a un punto de fijación siendo los puntos que forman la figura, relativos a este.
La fórmula a aplicar en este último supuesto, sería la siguiente:
X' = X * Cos (àngulo) - Y * Sin(ángulo)
 Y' = Y * Cos (ángulo) - X * Sin(ángulo)

Ejemplos
Escalación
Una transformación para alterar el tamaño de un objeto se denomina escalación.
Dependiendo del factor de escalación el objeto sufrirá un cambio en su tamaño pasando a ser mayor, o menor en su segmento de longitud.
Esta es la transformación del objeto especialmente interesante, pues con ella se consigue el efecto Zoom.

ejemplo.

Resumen

Transformaciones geométricas.
Habitualmente, un paquete gráfico permite al usuario especificar que parte de una imagen definida se debe visualizar y dónde esta parte se debe colocar en el dispositivo de visualización.
En el caso de las imágenes bidimensionales, una vista se selecciona especificando una región del plano x y que contiene la imagen total o cualquier parte de ella.
Las partes dentro de las zonas seleccionadas se mapean entonces sobre zonas especificadas de las coordenadas del dispositivo. Cuando se seleccionan múltiples zonas de vista, estas zonas se pueden colocar en ubicaciones de visualización independientes, o algunas zonas se podrían insertar en zonas de visualización más grandes.
Transformaciones bidimensionales
Traslación.
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. convertimos un punto bidimensional al agregar las distancias de traslación, t x y t y a la posición de coordenadas original (x , y ) para mover el punto a una nueva posición (x’ ,y’ ).
La traslación es una transformación de cuerpo rígido que mueve objetos sin deformarlos, es decir, se traslada cada punto del objeto la misma distancia. 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 (x r , y r ) 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 .


Utilizando identidades trigonométricas podemos expresar las coordenadas transformadas en término de los ángulos θ y ϕ como:
x'=rcos(φ +θ )=rcos φ cosθ −rsin φsinθ 
y'=rsin(φ +θ )=rcosφ sinθ −rsinφ cosθ
 Las coordenadas originales del punto en las coordenadas polares son2.5.
 x =r cosφ ,y=rsinθ
 Al sustituir las expresiones 2.5 en 2.6, obtenemos las ecuaciones de transformación para girar un punto en la posición (x, y) s través de un ángulo Θ al rededor de un origen:
  x'=xcosθ −ysinθ  y=xsinθ +ycosθ
Sl igual que con las traslaciones, las rotaciones son transformaciones de cuerpos
rígidos que mueven los objetos sin deformarlos. Se giran a través del mismo ángulo todos
los puntos del objeto.
Las líneas curvas se giran al cambiar la posición de los puntos de definición y se
vuelven a trazar las curvas. Por ejemplo, se puede girar una circunferencia o una elipse
alrededor de un eje no central al mover la posición del centro a través del arco que
subtiende el ángulo de rotación específico. Es posible girar una elipse sobre sus
coordenadas de centro al girar los ejes mayor y menor.
Escalación
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 (x, y) de cada vértice por los factores de escalación sx y sy para producir las coordenadas transformadas (x’, y’):
x ' = x·sx , y' = y·sy
Los objetos que se transforman  se escalan y cambian de posición. Los factores de escalación con valores menores que 1 acercan los objetos al origen de las coordenadas en tanto que los valores mayores que 1 alejan las posiciones de coordenadas del origen.se escala un polígono con respecto del punto fijo al escalar la distancia de cada vértice al punto fijo. Para un vértice con coordenadas (x, y), se calculan las coordenadas escaladas (x’, y’) como

x ' = xf + (x − xf )sx , y' = yf + (y − yf )sy
Los objetos que se transforman con las ecuaciones 2.11 se escalan y cambian de posición. Los factores de escalación con valores menores que 1 acercan los objetos al origen de las coordenadas en tanto que los valores mayores que 1 alejan las posiciones de coordenadas del origen.
Podemos controlar la localización de un objetos escalado al seleccionar una posición llamada punto fijo, que debe permanecer sin cambios después de la transformación de escalación.
Se pueden seleccionar las coordenadas para el punto fijo (xf, yf) como uno de los vértices, el centroide del objeto o cualquier otra posición.
Podemos volver a expresar estas transformaciones de escalación para separar los términos de multiplicación y de adición donde los términos aditivos xf(1 - sx) y yf(1 - sy) son constantes para todos los puntos en el objeto
x ' = x·sx + xf (1− sx )
y' = y·sy + yf (1− sy )
Incluir coordenadas para un punto fijo en las ecuaciones de escalación es similar a incluir coordenadas para un punto pivote en las ecuaciones de rotació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.
Podemos combinar los términos de multiplicación y de adición para transformaciones geométricas bidimensionales en una sola representación de matriz al ampliar las representaciones de matriz de 2 por 2 a matrices de 3 por 3.
Esto nos permite expresar todas las ecuaciones de matriz como multiplicaciones de matriz , si también ampliamos las representaciones de matriz para las posiciones de coordenadas. Para expresar cualquier transformación bidimensional como una multiplicación de matriz, representamos cada posición de coordenadas cartesianas (x, y) con las tres coordenadas homogéneas (xh, yh, h), donde
x = xh /h,y = yh/ h
Composición de transformaciones
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.
Traslaciones, rotaciones y escalaciones
Traslaciones
Se se aplican dos vectores de traslación sucesivos (tx1, ty1) y (tx2, ty2) en la posición de coordenadas P, la localización transformada final P, la localización transformada final P’ se calcula como:
P' = T (tx2 , ty2 )·{T (tx1, ty1)·P} = T (tx2 , ty2 )·T (tx1, ty1{ )}·P
Rotaciones
Dos rotaciones sucesivas que se aplican en el punto P producen la posición
transformada
2.26. P' = R(θ2 )· R(θ1{ )·P} = R(θ2 { )·R(θ1)}·P
Al multiplicar las dos matrices de rotación, podemos verificar que dos rotaciones
sucesivas son aditivas:
R(θ2 )·R(θ1) = R(θ1 +θ2 )
de modo que es posible calcular las coordenadas giradas finales con la matriz de
rotación compuesta como
2.28. P' = R(θ1 +θ2 )·P
Escalaciones
Concatenar matrices de transformación para dos operaciones de escalación sucesivas produce la siguiente matriz de escalación compuesta:
 S(sx2 , sy2 )·S(sx1, sy1) = S(sxsx2 , sysy2 )
Rotación del 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óntraslació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.
Escalación del punto fijo general
Traslade el objeto de modo que el punto fijo coincida con el origen de las
coordenadas.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.
T (xf , yf S(sx , sy T (−xf ,−yf ) = S(xf , yf , sx , sy )
Esta transformación se genera de manera automática en sistemas que ofrecen una función de escalación que acepta las coordenadas para el punto fijo.
Propiedades de concatenación
La multiplicación de matrices es asociativa. Para tres matrices cualesquiera A, B y C, el producto matricial A·B·C se puede lelvar a cabo al multiplicar primero a por B o multiplicar primero B por C:
A·B·C = (A·BC = A·(B·C)
Por otro lado, los productos de la transformación tal vez no sean conmutativos. en
general el producto matricial A·B no es igual que B·A.
Transformación ventana-área de vista
Si tenemos una ventana y un área de vista, ¿cuál es la matriz de transformación que establece la correspondencia entre las coordenadas mundiales de la ventana y las Como se puede ver, si la ventana y el área de vista no tienen la misma razón altura anchura, ocurre un escalamiento no uniforme. Si el programa de aplicación cambia la ventana o el área de vista, las nuevas primitivas de salida que se dibujen en la pantalla se verán afectadas por el cambio, no así las primitivas existentes.
El modificador 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.
Si SRGP proporcionara primitivas de salida en coordenadas de mundo, el área de vista se hallaría en el lienzo actual, que por omisión es el lienzo 0, la pantalla. El programa de aplicación podría cambiar en cualquier instante la ventana o el área de vista, en cuyo caso las primitivas de salida que se especificaran subsecuentemente estarían sujetas a una nueva transformación. Si el cambio incluyera un área de vista distinta, las nuevas primitivasde salida se colocarían en el lienzo en posiciones distintas a las anteriores.
coordenadas de pantalla del área de vista? Esta matriz se puede desarrollar corno una composición de transformación de tres pasos
Transformaciones de composición general y de
eficiencia computacional
Una transformación bidimensional general, que representa una combinación de
traslaciones, rotaciones y escalaciones. Sin concatenación, se aplicarían las transformaciones individuales una a la vez y se podría reducir en forma considerable el número de cálculos. De esta manera, una implementación eficiente de las operaciones de transformación consiste en formular matrices de transformación, concatenar cualquier secuencia de transformación y calcular las
coordenadas transformadas. La propiedad ortogonal de las matrices de rotación es útil para realizar una matriz de rotación cuando conocemos la orientación final de un objeto en lugar de la cantidad de rotación angular necesaria para colocar el objeto en esa posición. Las direcciones para la orientación deseada de un objeto se podrían determinar mediante la alineación de ciertos objetos en escena o mediante posiciones seleccionadas en la escena.
Representación matricial de transformaciones
tridimensionales
Así como las transformaciones bidimensionales se pueden representar con matrices de 3 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. Así, en lugar de representar un punto como (x, y, z), lo hacemos como (x, y, z, W), donde dos de estos cuádruplos representan el mismo punto si uno es un multiplicador distinto de cero del otro:
no se permite el cuádruplo (0, 0, 0, 0). Como sucede en el espacio bidimensional, la representación estándar de un punto (x, y, z, W) con W ≠ 0 se indica (x/W, y/W, z/W, 1). 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 subespacio tridimensional de
un espacio de cuatro dimensiones definido por la ecuación W = 1.
Composición de transformaciones
tridimensionales
En este apartado se analizará la forma de componer matrices de transformación
tridimensionales usando. Se presentan dos formas de lograr la transformación deseada. El primer método es  componer las transformaciones primitivas T, Rx, Ry y Rz. Este método, aunque es algo tedioso, es fácil de ilustrar y su comprensión nos ayudará en nuestro conocimiento de las transformaciones. El segundo método, que utiliza las propiedades de las matrices ortogonales especiales que se analiza en la sección anterior, se explica de manera mas breve pero es más abstracto.En este caso, la transformación deseada se puede llevar a cabo en cuatro pasos:
1. Traslación de P1 al origen.
2. Rotación sobre el eje y para que P1P2 esté en el plano (y, z).
3. Rotación sobre el eje x para que P1P2 esté en el eje z.
4. Rotación sobre el eje z para que P1P3 esté en el plano (y, z).

glosario unidad 2

Coordenadas homogéneas

En matemáticas, y más concretamente en geometría proyectiva, las 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 ingles) 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.

martes, 11 de septiembre de 2012

Generacion de lineas rectas


Definición de líneas

Una línea es una sucesión continua de puntos (trazado), como por ejemplo un trazo o un guion. Las líneas suelen utilizarse en la composición artística, se denomina en cambio «raya» a trazos rectos sueltos, que no forman una figura o forma en particular. En matemáticas y geometría, línea suele denotar línea recta o curva.

Algoritmo DDA para generación de rectas
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.

El Codigo es el Siguiente :

void DDA(int x_0,int y_0, int x_fin, int y_fin){

glClear ( GL_COLOR_BUFFER_BIT );
glPointSize(3.0);
glScalef(4.0, 4.0, 2.0);

glBegin(GL_POINTS);
glVertex2i(x_0,y_0);

int vx=(int)fabs(x_fin-x_0);
int vy=(int)fabs(y_fin-y_0);
int dx,dy;
int m = (int)(y_fin-y_0)/(x_fin-x_0);

if(m==1)m++;
if(m==0)m=-1;

if(m>0&&m<1){
if(x_0<x_fin){
dx=1;
dy=m;
}else{
dx=-1;
dy=-m;
}
}
else
if(m>0&&m>1){
if(m>1){
if(x_0<x_fin){
dy=1;
dx=(int)1/m;

}else{
dy=-1;
dx=(int)-1/m;

}

}else

if(m<0&&fabs(m)<1){

if(x_0>x_fin)
{
dx=-1;
dy=-m;

}else
{
dx=1;
dy=-m;
}

}

else{

if(x_0>x_fin){
dy=1;
dx=-1/m;

}
else {
dy=-1;
dx=1/m;

}

}

if(m>0&&m<1){
for(int i=1;i<=vx;i++)
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;

}
}
else
if(m>0&&m>1){
for(int i=1;i<=vy;i++){
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;}

}else

if(m<0&&fabs(m)<1){

for(int i=1;i<=vx;i++)
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;

}

}

else{

for(int i=1;i<=vy;i++){
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
}
}
}
glEnd();
glFlush();
}

Algoritmo de Bresenham para trazar líneas
Es un algoritmo preciso para la generación de líneas de rastreo que convierte mediante rastreo las líneas al utilizar solo cálculos incrementales con enteros que se pueden adaptar para desplegar circunferencias y curvas. Los ejes verticales muestran las posiciones de rastreo y los ejes horizontales identifican columnas de pixeles.

 Algoritmo

El algoritmo sería el siguiente:

Si 0<|m|<1

  *Se capturan los extremos de la línea y se almacena el extremo izquierdo en (x0,y0).

  *Se carga (x0,y0) en el bufer de estructura (se traza el primer punto)

  *Se calculan las constantes Δx,Δy, 2Δy y 2Δy-Δx y se obtiene el valor inicial para el

    parametro de decisión p0=2Δy-Δx.

  Para j=0 mientras j<Δx

  *En cada xk a lo largo de la línea, que inicia en k=0 se efectúa la prueba siguiente:

      Si pk<0

          *Trazamos (xk+1,yk).

          *Asignamos pk+1= pk+2Δy.

      Sino

          *Trazamos (xk+1,yk+1).

          *Asignamos pk+1= pk+2Δy-2Δx.

  Fin Para

Si |m|>1

   *Recorremos la dirección en pasos unitarios y calculamos los valores sucesivos   

     de x que se aproximen más a la trayectoria de la línea.

 

Implementación

Esta es la implementación del algoritmo:

 public void Bresenham(Graphics g,int x0, int y0, int x1, int y1)
{ int x, y, dx, dy, p, incE, incNE, stepx, stepy;
  dx = (x1 - x0);
  dy = (y1 - y0);
 /* determinar que punto usar para empezar, cual para terminar */
  if (dy < 0) { 
    dy = -dy; stepy = -1; 
  } 
  else
    stepy = 1;
  if (dx < 0) {  
    dx = -dx; stepx = -1; 
  } 
  else 
    stepx = 1;
  x = x0;
  y = y0;
  g.drawLine( x0, y0, x0, y0);
 /* se cicla hasta llegar al extremo de la línea */
  if(dx>dy){
    p = 2*dy - dx;
    incE = 2*dy;
    incNE = 2*(dy-dx);
    while (x != x1){
      x = x + stepx;
      if (p < 0){
        p = p + incE;
      }
      else {
        y = y + stepy;
        p = p + incNE;
      }
      g.drawLine( x, y, x, y);
    }
  }
  else{
    p = 2*dx - dy;
    incE = 2*dx;
    incNE = 2*(dx-dy);
    while (y != y1){
      y = y + stepy;
      if (p < 0){
        p = p + incE;
      }
      else {
        x = x + stepx;
        p = p + incNE;
      }
      g.drawLine( x, y, x, y);
    }
  }
 }

 Definicion de circunferencia

Se conoce como circunferencia a la linea cerrada de formato curvo y apariencia plana en la cual los puntos resultan equidistantes del punto central que se localiza en el mismo plano.

 
Algoritmo de Bresenham para trazar circunferencias

Una circunferencia se define como un conjunto de puntos que se encuentran, en su totalidad, a una distancia determinada r de una posición central.

Es posible reducir el cálculo al considerar la simetría de las circunferencias, la forma de la circunferencia es similar entre cuadrantes y simétrica entre octantes.

Para aplicar el método del punto medio, definimos una función de circunferencia como:

pk = fcircunferencia(x,y)= x2 + y2r2

fcircunferencia(x,y)<0 si (x,y) está dentro de la frontera de la circunferencia.

fcircunferencia(x,y)=0 si (x,y) está en la frontera de la circunferencia.

fcircunferencia(x,y)>0 si (x,y) está fuera de la frontera de la circunferencia.

Los parámetros de decisión sucesivos se obtienen al utilizar cálculos incrementales.

El algoritmo será el siguiente:

*Se capturan el radio r y el centro de la circunferencia (xc, yc).

*Se obtiene el primer punto de la circunferencia centrada en origen (xc, yc) como (0, r).

*Se cacula el valor incial del parametro de decisión como p0=5/4 - r.

Para k=0 hasta x>=y incrementa k

Si pk < 0

*Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk).

*pk+1=pk+2xk+1+1.

Sino

*Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk-1).

*pk+1=pk+2xk+1+1-2yk+1.

//Donde 2xk+1=2xk+2 y 2yk+1=2yk-2

 

*Se determinan los puntos de simetría para los otros siete octantes.

*Se mueve cada posición del pixel calculada (x,y) a la trayectoria circular centrada en (xc, yc)

y trazamos los valores de las coordenadas: x=x+xc y y=y+yc