Buscar en el sitio

Unidad 2

Índice

2.1 Trazo de líneas rectas

 

2.2 Representación y trazo de polígonos

 

2.3 Transformaciones bidimensionales

 

2.4 Representación matricial

 

2.5 Ventana y puerto de visión

 

 

 

 

 

 

 

 

2.1trazas de línea Recta

 

Son los puntos donde la recta se intercepta con los planos principales de proyección; se denominan:

Traza vertical: punto donde la recta se intercepta con el plano vertical de proyección. Generalmente se designa con la letra (V).

Traza horizontal: punto donde la recta se intercepta con el plano horizontal de proyección. Generalmente se designa con la letra (H).

Trazas de una recta

    

 

 

Determinación de las Trazas de una Recta

Las trazas de una recta se determinan, en doble proyección ortogonal, interceptando sus proyecciones con la línea de tierra

Determinación de las trazas de una recta

 

 

 

1.- Algoritmo de Línea DDA

 

El analizador diferenciador digital (DDA - Digital Differential Analyzer) es un algoritmo de conversión de rastreo que se basa en el cálculo ya sea de Dy o Dx por medio de las ecuaciones (4) o (5).

 

Se efectúa un muestreo de la línea en intervalos unitarios en una coordenada y se determina los valores enteros correspondientes más próximos a la trayectoria de la línea para la otra coordenada.

 

Tomemos una línea con pendiente positiva, si la pendiente | m | 1, se hace el muestreo en x en intervalos unitarios (x = 1 y y = m dado que m = y / x) y se calcula cada valor sucesivo de y como:

 

(6) yk+1 = yk+ m

 

El subíndice toma valores enteros a partir de 1 y aumenta a razón de 1 hasta alcanzar el valor final. Ya que m puede ser cualquier número real entre 0 y 1, los valores calculados de y deben redondearse al entero más cercano.

 

Para líneas con una pendiente | m | > 1, se revierten las funciones de x y y, o sea, se realiza un muestreo de y en intervalos unitarios (y = 1 y x = 1/m dado que m = y / x) y se calcula cada valor sucesivo de x como:

 

(7) xk+1 = xk+ 1/m

 

Las ecuaciones (6) y (7) se basan en la suposición de que las líneas deben procesarse del extremo izquierdo al derecho.

Si este procesamiento se revierte, entonces x o y serian -1, y yk+1 = yk - m o xk+1= xk - 1/m

 

El procedimiento completo de dibujo sería el siguiente:

 

void Line(Display* display, Window win, GC gc, int x0, int y0, int x1, int y1)

{

float x, y, xs, ys;

int dx, dy, steps;

dx = x1 - x0;

dy = y1 - y0;

/* se asigna el punto de donde se comenzara a dibujar la línea */

x = x0;

y = y0;

/* verificar si la pendiente es mayor de x o y, para luego asignarla a steps */

if (abs(dx) > abs(dy))

steps = abs(dx);

else

steps = abs(dy);

/* se divide por la pendiente mayor, para dar xs o ys igual a 1 (o -1) */

if (steps == 0) {

XDrawPoint(display,win,gc,round(x),round(y));

fprintf(stderr,”this line is a point”);

return;

}

xs = dx/steps;

ys = dy/steps;

/* se cicla uno a la vez hasta llegar al numero de steps máximo */

for (i = 0; i <= steps; i++)

{

XDrawPoint(display,win,gc,round(x),round(y)); /* round(x) -> x+0.5 */

x = x + xs;

y = y + ys;

}

}

 

El problema con este algoritmo es que se debe redondear números flotantes a enteros y hacer operaciones sobre números flotantes, lo cual toma tiempo.

Para líneas largas, la acumulación de errores de redondeo en adiciones sucesivas del incremento de punto flotante puede provocar que las posiciones del pixel calculadas se desvíen de la trayectoria real de la línea.

Se puede mejorar el desempeño del algoritmo al separar los incrementos m y 1/m en partes enteras y fraccionarias, de forma que todos los cálculos se reduzcan a operaciones de enteros.

2.- Algoritmo de Línea Bresenham Básico

 

Un algoritmo preciso y efectivo para la generación de líneas de rastreo, desarrollado por Bresenham (1965), convierte mediante rastreo las líneas utilizando solo cálculos incrementales con enteros que se pueden adaptar para desplegar también curvas.

El algoritmo busca cual de dos pixeles es el que está más cerca según la trayectoria de la línea.

 

Consideremos el proceso de conversión para líneas con pendiente positiva 0 < m < 1.

Las posiciones de pixel a lo largo de la trayectoria de una línea se determinan al efectuar un muestreo de x en intervalos unitarios.

Si se inicia desde el extremo izquierdo (x0,y0) de una línea determinada, se pasa a cada columna sucesiva y se traza el pixel cuyo valor de y se aproxima más a la trayectoria de la línea de rastreo.

Si suponemos que se debe desplegar el pixel en (xk,yk), a continuación se necesita decidir que pixel se debe desplegar en la columna xk+1.

Las alternativas son los pixeles (xk+1,yk), y (xk+1,yk+1).

Al realizar el muestreo en la posición xk+1 designamos la separación de pixeles verticales de la trayectoria de la línea matemática como d1 y d2.

La coordenada de y en la línea matemática en la posición de la columna de pixelxk+1 se calcula como

(10) y = m (xk + 1) + b

 

Entonces

d1 = y - yk = m (xk + 1) + b – yk         y    d2 = (yk + 1) - y = yk + 1 - m (xk + 1) – b

void LineBres(Display* display, Window win, GC gc, int x0, int y0, int x1, int y1)

{

int x, y, dx, dy, xend, p, incE, incNE;

dx = abs(x1 - x0);

dy = abs(y1 - y0);

p = 2*dy - dx;

incE = 2*dy;

incNE = 2*(dy-dx);

/* determinar que punto usar para empezar, cual para terminar */

if (x0 > x1) {

x = x1;

y = y1;

xend = x0;

}

else {

x = x0;

y = y0;

xend = x1;

}

/* se cicla hasta llegar al extremo de la línea */

while (x <= xend)

{

XDrawPoint(display,win,gc,x,y);

x = x + 1;

if (p < 0)

p = p + incE

else {

y = y + 1;

p = p + incNE;

}

}

}

 

3.- Algoritmos de Generación de Circunferencias

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

Esta relación de distancia se expresa por medio del teorema de Pitarrosa en coordenadas cartesianas como

 

(24) (x - xc)2 + (y - yc) 2 = r2

 

 Algoritmo Básico

Se podría utilizar una ecuación para calcular la posición de los puntos de una circunferencia pasando a lo largo del eje de las x en pasos unitarios de xc - r a xc + ry calcular los valores correspondientes de y en cada posición

 

Un método para dibujar el círculo es aprovechar la simetría de los cuadrantes, dibujando solo uno y trazando los puntos simétricos en los demás cuadrantes.

Para el primer cuadrante se incrementaría x de 0 a r en pasos de 1, resolviendo para cada y positiva.

El trazo para un círculo con radio de 10, centrado en (0,0), utilizando este algoritmo básico, se muestra a continuación:

 

 

 

x                      (x,y)

0      100                   10               (0,10)

1       99                   9.95             (1,10)

2       96                   9.80             (2,10)

3       91                   9.54             (3,10)

4       84                   9.17             (4,9)

5       75                   8.66             (5,9)

6       64                   8                  (6,8)

7       51                   7.14             (7,7)

8       36                   6                  (8,6)

9      19                    4.36             (9,4)

10    0                      0                  (10,0)

Otra manera de eliminar el espacio irregular consiste en calcular los puntos a lo largo de la frontera circular utilizando las coordenadas polares r y 0.

Al expresar la ecuación de la circunferencia en forma polar paramétrica, se obtiene el par de ecuaciones

 

(26) x = xc + r cos0, y = yc + r sin0

 

/* draw symmetry points */

XDrawPoint(display,win,gc,xc + x,yc + y);

XDrawPoint(display,win,gc,xc - x,yc + y);

XDrawPoint(display,win,gc,xc + x,yc - y);

XDrawPoint(display,win,gc,xc - x,yc - y);

XDrawPoint(display,win,gc,xc + y,yc + x);

XDrawPoint(display,win,gc,xc - y,yc + x);

XDrawPoint(display,win,gc,xc + y,yc - x);

XDrawPoint(display,win,gc,xc - y,yc - x);

}

void CircleMidPoint(int xc, int yc, int r)

{

int x, y, p;

x = 0;

y = r;

p = 1 - r;

PlotPoint(xc,yc,x,y);

/* se cicla hasta trazar todo un octante */

while (x < y)

{

x = x + 1;

if (p < 0)

p = p + 2*x + 1;

else {

y = y - 1;

p = p + 2*(x - y) + 1;

}

PlotPoint(xc,yc,x,y);

}

}

2.2REPRESENTACION Y TRAZO DE POLIGONOS

 

 

OpenGL maneja polígonos correctamente siempre y cuando sean simples y convexos. Si ese no es el caso, OpenGL dibuja cosas raras.

 

Además en algunas ocasiones se quiere especificar el vector normal del plano en el cual se encuentra el polígono. Dicho vector normal se necesita p.e. para algoritmos de visualización avanzada (``Phong shading'').

 

Cuando se escriben aplicaciones gráficas nos enfrentamos con el problema siguiente: desde alguna fuente ``vienen'' listas de puntos (o bien de otro programa, o bien de un fichero, o bien de modo interactivo) y hay que interpretar las listas como polígonos, es decir, hay que verificar si las listas cumplen la definición de especificar polígonos simples y convexos. Si ese no es el caso, a lo mejor se pueden ``corregir'' las listas. (Programas con tal propiedad se llama robustos y tolerantes.)

 

Entonces (en el caso de mera visualización con OpenGL):

 

Se puede eliminar puntos múltiples consecutivos en la lista.

 

Se puede intentar calcular el plano en el cual se encuentran más o menos los puntos del polígono (eso no es tan trivial).

 

En dicho plano, es decir, una vez corregidos los puntos hasta que se encuentren exactamente en el plano, se puede verificar si el polígono es simple y convexo (eso es algo bastante fácil).

 

Si no es así, se podría subdividir el polígono en partes simples y convexos para seguir trabajando después con las partes sin problemas (este paso no lo vamos a realizar en estas prácticas).

 

Antes de dedicarnos a los detalles, dibujamos polígonos con OpenGL asumiendo que la lista de puntos cumple la definición.

 

Siempre que se quiera dibujar un objeto de OpenGL (en este caso unos polígonos, antes vimos puntos y segmentos), hay que decírselo de antemano con la función

 

glBegin()

 

La lista de puntos se define con consecutivas llamadas a

 

glVertex*()

 

y se termina el trabajo con

 

glEnd()

 

En lugar de dibujar polígonos rellenados, OpenGL puede dibujar, o bien solo las esquinas o bien solo los segmentos del borde. Eso se realiza con la función

 

glPolygonMode()

 

a la cual hay que pasar también cuál de las dos posibles caras del polígono se quiere pintar.

 

Además se pueden llenar los polígonos con patrones que no detallamos por el momento.

 

glEnable()

 

glPolygonStipple()

 

2.3 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, tx y ty la posición de coordenadas original (x,y)

El par de distancia de traslación se llama vector de traslación o vector de cambio. Se pueden expresar las ecuaciones anteriores en una sola ecuación matricial al utilizar vectores de columna para representar las posiciones de coordenadas y el vector de traslación

Los polígonos se trasladan al sumar el vector de traslación a la posición decoordenadas 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 xy . 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.

 

Estalació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 s x y s  y para producir las coordenadas transformadas (x’, y’ )

 


 

2.2. 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.2.15.P'=M1·P+M

2.3. 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 aplican dos vectores de traslación sucesivos (tx1, t y1) y (tx2 , t  y2 ) en la posición de coordenadas P, la localización transformada final P, la localización transformada final P’ se calcula como:2.23.P'=T(t x2,t2)·T(tx1,ty1)·P}{=T(tx2, 2)·T(t x1,t y1)}{·P

Donde se representan P y P’ como vectores de columna de coordenadas homogéneas. Podemos verificar este resultado al calcular el producto de la matriz para las dos agrupaciones asociativas. Asimismo, la matriz de transformación compuesta para esta secuencia de transformaciones.

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){· (θ1)}·P

Al multiplicar las dos matrices de rotación, podemos verificar que dos rotaciones sucesivas son aditivas

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ó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.       Escalación del punto fijo general

La siguiente figura ilustra una secuencia de transformación para producir escalación con respecto de una posición fija seleccionada (xf,f) al utilizar una función de escalación que sólo puede escalar en relación con el origen de las coordenadas

 



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 llevar a cabo al multiplicar primero a por B o multiplicar primero B por C:2.35.A · BC=( A· B)·C =A·( B·C)

Por tanto, podemos evaluar los productos matriciales al utilizar una agrupación asociativa ya sea de izquierda a derecha o de derecha a izquierda. 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. Esto significa queremos trasladar y girar un objeto, debemos tener cuidado sobre el sentido en que se evalúa la matriz compuesta.

 




2.4. Transformación ventana-área 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.

 




2.6. Representación 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. 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.

2.7. Composición de transformaciones tridimensionales

En este apartado se analizará la forma de componer matrices de transformación tridimensionales usando un ejemplo. El objetivo es transformar los segmentos de línea dirigida

 P1P2yP1P3 en la figura 2.18 de su posición inicial en la parte (a) a su posición final en la parte (b). De esta manera, el punto P1 se trasladará al origen P1P2 quedará en el eje positivo y P1P3

 Quedará en la mitad del eje positivo del plano (x, ). Las longitudes de las líneas no se verán afectadas por la transformación.

 

Las transformaciones entre sistemas de coordenadas cartesianos se llevan a cabo con una secuencia de transformaciones traslación. Rotación que hacen que los dos sistemas coincidan. Especificamos el origen de coordenadas y vectores de eje para un marco de referencia respecto al marco de referencia original. En un sistema bidimensional, un vector define completamente las direcciones del eje de coordenadas; pero en un sistema tridimensional, hay que especificar dos de las tres direcciones de los ejes. Las transformaciones geométricas son transformaciones afines. Esto es, pueden expresarse como una función lineal de posiciones de coordenadas. Traslación, rotación y escalación son transformaciones afines. Transforman líneas paralelas en líneas paralelas y posiciones de coordenadas finitas en posiciones finitas.

2.4Coordenadas 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.

 

En coordenadas homogéneas, todo punto bidimensional está definido por tres coordenadas. De tal modo que un punto de dimensiones x, y, se lo representa por la terna: x / w, y / w, w.

Matemáticamente, las coordenadas x y y se hallan dividiendo los dos primeros números entre el tercero, respectivamente.

En dos dimensiones, su valor se puede encontrar más fácilmente si w = 1, por simplificación. En tres dimensiones, suele ocurrir lo mismo w = 1.

Básicamente, se trata de ampliar el plano euclídeo (en el caso bidimensional) al plano proyectivo, es decir, incluirle los puntos impropios o del infinito.

Así, un punto impropio es aquel donde w = 0.

Una consecuencia de esta escritura es que un punto propio tiene infinitas formas de escribirlo, todo dependerá de los cocientes x / w y y / w (con w distinto de 0). pila o stack( en programación)

 

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 Stacken 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 retirara retirarlo.

 CONCLISION

ESTA UNIDAD ESTA CONFORMADA POR LOS PUNTOS MAS BASICOS DE ESTA MATERIA PARA UN PUNTO TAN COMPLEJO COMO LO ES LAGRAFICACION, YO NO SABIA QUE EL DIBUJO NORMAL TENIA UNA DIMECION QUE ES LA 2 PUESTO QUE LAS IMÁGENES SON PLANAS Y SIN EFECTO.

BIBLIOGRAFIA

https://fernandez-torres-jose.blogspot.mx/2012/09/21-transformaciones-bidimensionales.html

https://grafi-ricardo.blogspot.mx/2012/02/unidad-ii-graficacion-2d.html


Crea una página web gratis Webnode