Professional Documents
Culture Documents
ndice
1. Transformaciones Bsicas
1. 2. 3. Traslacin Rotacin Escalado
2. 3.
4. 5.
Transformaciones geomtricas
Con los algoritmos de primitivas ya podemos dibujar en pantalla El siguiente paso consiste en permitir modificar o manipular dichas primitivas Transformaciones Geomtricas
Para poder implementar aplicaciones de diseo Para poder realizar animaciones Para interactuar con la escena
Traslacin
Reposiciona un objeto desplazndolo a las nuevas coordenadas P = (x, y) P = (x, y)
x' = x + t x y' = y + t y
En forma matricial:
ty
tx
T = (t x , t y )
P = ( x, y )
el objeto no se deforma
Para trasladar lneas rectas trasladamos slo sus extremos Para trasladar polgonos, trasladamos slo sus vrtices y redibujamos
P = (x, y)
x = R cos y = R sin
En forma matricial:
x' = R cos( + ) = ... = x cos y sin y ' = R sin( + ) = ... = x sin + y cos
P = ( x, y )
cos R= sin
sin cos
Rotacin general
Cmo ser la frmula general cuando el punto sobre el que se rota no es el origen, sino un punto cualquiera (xc, yc)? P = (x, y)
(xc, yc)
P = (x, y)
el objeto no se deforma
Para rotar lneas rectas rotamos slo sus extremos Para rotar polgonos, rotamos slo sus vrtices y redibujamos
x' = sx x y' = sy y
En forma matricial:
P = (x, y)
P = ( x, y )
sx S = 0
0 sy
P' = P S
Si sx == sy
escalado uniforme
Si sx != sy
escalado diferencial
Escalado general
NOTA: si el origen de coordenadas no se encuentra en el interior del objeto, se produce un desplazamiento! Para evitarlo, se usa un punto fijo, y se escala a partir de l
x' = xc + s x ( x xc ) y ' = yc + s y ( y yc )
2x
El punto fijo podra ser el centro del objeto, o uno de sus vrtices, o tambn un punto arbitrario
el objeto no se deforma
Para escalar lneas rectas escalamos slo sus extremos Para escalar polgonos, escalamos slo sus vrtices y redibujamos
Representacin matricial
Muchas aplicaciones incluyen secuencias de transformaciones geomtricas:
Una animacin requiere que los objetos se trasladen y roten en cada fotograma Un diseo CAD requiere muchas transformaciones hasta obtener el resultado final
Debemos formular de forma muy eficiente toda la secuencia de transformaciones Cada transformacin puede representarse como
P = P M1 + M2
La matriz M1 contiene la informacin de ngulos y factores de escala La matriz M2 contiene los trminos de traslacin asociados al punto fijo y al centro de rotacin Para producir una secuencia de transformaciones hay que calcular las nuevas coordenadas en cada transformacin!
P = P M3 + M4 = = P M1 M3 + M2 M3 + M4
Buscamos una solucin ms eficiente que permita combinar las transformaciones para obtener directamente las coordenadas finales a partir de las iniciales
Coordenadas homogneas
Cmo podramos eliminar la matriz M2, y usar una nica matriz para transformacin? Solucin: pasando a matrices 3x3 en lugar de 2x2 Para ello debemos representar un punto cartesiano (x, y) en coordenadas homogneas Un punto (x, y) se representa en coordenadas homogneas de la forma
Lo habitual es tomar h=1, con lo que el punto (x, y) pasa a ser (x, y, 1)
Coordenadas homogneas
El uso de coordenadas homogneas permite tratar todas las transformaciones geomtricas como una multiplicacin de matrices
Traslacin:
0 1 ty
0 0 1
0 0 1
P ' = P T (t x , t y )
sin cos 0 0 sy 0 0 0 1
P ' = P R ( )
P ' = P S (s x , s y )
P ' = P T1 (t x1 , t y1 )
T1 P = (x, y) T T2 P = (x, y)
0 1 t y2
0 1 t y1 + t y 2
0 0 1
P = (x, y)
cos R = sin 0
sin cos 0
0 cos 0 sin 1 0
sin cos 0
s x1 S = 0 0
0 0 sx 2 s y1 0 0 0 1 0
0 sy2 0
0 s x1s x 2 0 = 0 1 0
0 s y1s y 2 0
0 0 1
P' = P T ( xc , yc ) R ( ) T ( xc , yc )
R(xc, yc, )
P' = P T ( xc , yc ) S ( s x , s y ) T ( xc , yc )
S(xc, yc, sx, sy)
Reflexin
Sobre el eje x Sobre el eje y
1 0 0 0 1 0 0 0 1
1 0 0 0 1 0 0 0 1
Sobre la recta y = x
1 0 0 0 1 0 0 0 1
0 1 0 1 0 0 0 0 1
Reflexin general
Sobre una recta arbitraria y = mx + b
Reflexin general
Cunto habr que trasladar y rotar?
T (0, -b)
R (-atan(m))
Ejemplo de reflexin
y = 3x / 4
Cmo lo resolvemos? Por lo pronto no hay que trasladar Cunto habr que rotar? Lo importante no es el ngulo en s, sino los valores del seno y el coseno
5 3
continuacin
Comenzamos con la matriz de rotacin
4 / 5 3 / 5 0 R ( ) = 3 / 5 4 / 5 0 0 0 1
Continuamos con la reflexin
1 0 0 F = 0 1 0 0 0 1
Deshacemos la rotacin
M = R ( ) F R ( ) =
4 / 5 3 / 5 0 R ( ) = 3 / 5 4 / 5 0 0 0 1
7 / 25 24 / 25 0 M = 24 / 25 7 / 25 0 0 0 1
continuacin
Para calcular los puntos transformados, simplemente los multiplicamos por la matriz final
Afilamiento
Desplaza los puntos en funcin de los valores de sus coordenadas
x' = x + ay y' = y
1 0 0 A = a 1 0 0 0 1
En la otra direccin:
x' = x y ' = y + bx
1 b 0 A = 0 1 0 0 0 1
Afilamiento general
Afilar con respecto a la recta y = mx + b
x = (y-b) / m
x ' = x ( y b) / m y' = y
0 0 1 A = 1/ m 1 0 b / m 0 1
Matriz de transformacin
Para pasar de un sistema a otro lo haremos tambin por medio de una matriz Dicha matriz la obtendremos a partir de una secuencia de transformaciones bsicas
(xmax, ymax)
(umax, vmax)
(xmin, ymin)
(umin, vmin)
coordenadas de pantalla
umax umin vmax vmin M = T ( xmin , ymin ) E x x , y y T (umin , vmin ) min max min max
Algoritmos de recorte
Despus de la transformacin, hay que recortar las partes de la escena que queden fuera de la ventana
Estos algoritmos tambin se usan para permitir mtodo de copiar y pegar en aplicaciones grficas, pero a la inversa (recortando el interior)
Recorte de puntos
Es el algoritmo ms sencillo Asumiendo una ventana rectangular, slo pintaremos los puntos que cumplas estas dos condiciones simultneamente: (umax, vmax)
(umin, vmin)
Recorte de lneas
Dado un segmento recto, hay que testear qu parte cae dentro de la ventana para dibujar slo esa parte Cmo hacemos el test? 5
1 2 3
Clculo de intersecciones
Cmo se calculan las intersecciones? En coordenadas explcitas es complicado, porque aparte de calcular el punto, debemos averiguar si pertenece al interior del segmento o no Es mucho ms simple si usamos la ecuacin paramtrica de la recta
x = x1 + t ( x2 x1 ) t [0,1] y = y1 + t ( y2 y1 )
Si la interseccin se produce para un t fuera del intervalo (0,1), el punto no pertenece al segmento Habra que aplicar este mtodo para cada borde de la ventana Este test es muy costoso hay que resolver 2 ecuaciones para cada uno de los 4 bordes Tambin hay que tener en cuenta el caso de las lneas que sean paralelas a un borde
P(t ) = P0 + t (P P0 ) 1
Lo que se hace es calcular el valor de t de interseccin con cada borde Una vez obtenidos los 4 valores, se buscan las intersecciones (x,y) correctas Cmo se calcula el valor de t interseccin?
t2
P1
t1 P0
P(t ) = P0 + t (P P0 ) 1
v(t ) = P (t ) F
Sea v(t) el vector desde F hasta un punto cualquiera del segmento Sea el producto escalar
N i v(t ) N i v(t ) = 0
N i v(t ) = N i (P (t ) F ) = ... = 0
N v(t) F
t=
N i (P0 F ) N i (P P0 ) 1
P1
P0
Mirando el signo de N i (P P0 ) 1
Si es negativo Si es positivo punto entrante punto saliente
La solucin viene dada por el tramo de lnea entre el PE ms alto y el PS ms bajo Si tE > tL la lnea no se dibuja
NL
E E
NR F NB E
S E
Una vez obtenidos los valores de t, se sustituyen en la ecuacin parmetrica para obtener las coordenadas (x,y) de los puntos
Funcion Cyrus_Beck () Para cada borde de la ventana Calcular t Si t es entrante y t > te entonces te = t Si t es saliente y t < ts entonces ts = t Fin Para Si te < ts entonces Calcular Pe = P(te) Calcular Ps = P(ts) Pintar linea (Pe, Ps) Fin Si
Ejemplo de recorte
Cyrus-Beck
1001
1000
1010
0001
0000
0010
0101
0100
0110
1000
Cada bit se calcula mediante una resta Por ejemplo, el primer bit viene dado por el signo de la resta (y-ymax) 0000
Si no es ninguno de los casos anteriores, la lnea la catalogamos como parcialmente visible, y slo en este caso nos ponemos a calcular intersecciones
F F
1001 1000
C F E B
0010 1010
Calculamos la interseccin con uno de los bordes puestos a 1 F Ahora la lnea se divide en dos: FF y EF La lnea FF es invisible se descarta La lnea EF es parcialmente visible calculamos la interseccin y obtenemos F La lnea FF es invisible se descarta se pinta La lnea EF es totalmente visible
H
0001
A
0000
G
0101
G
0100 0110
Lnea HG
parcialmente visible
G se descarta se descarta
(x2, y2) (x1, y1) (x3, y3) (xL, yB) (x4, y4)
Para un borde horizontal, la ecuacin es y = yB La ecuacin de la lnea puede ponerse como x = x3 + (y-y3) / m
Ejemplo de recorte
Funciona muy bien cuando la mayora de las lneas cae en el interior de la ventana de recorte
El algoritmo Cohen-Sutherland es mejor cuando la mayora de las lneas cae fuera de la ventana, porque se rechazan en el test inicial
Recorte de polgonos
Para recortar polgonos no basta slo con recortar sus aristas Lo que hace falta es un algoritmo que genere una o ms reas cerradas que puedan rellenarse si se desea Es decir, queremos la secuencia de vrtices que represente al polgono recortado
re ncor i
cto
corr ecto
Vamos recorriendo la lista de vrtices del polgono, y se genera una lista de salida Existen 4 casos posibles: S
P T
P Se aade P a la lista
S Se aaden T y P a la lista
Se aade T a la lista
Ejemplo
V3 B V2 C D A V1 Se hace por separado para cada borde porque si no no se sabra si estamos dentro o fuera Borde izquierdo: V1, A, B, V3 Borde derecho: V1, A, B, V3 Borde inferior: C, B, V3, D Borde superior: C, B, V3, D
Existen problemas con los polgonos cncavos en algunas orientaciones aparecen lneas falsas!
V1 A
V2
V7
V4
B C V5 D
V3
V6
Comenzaremos siempre en un punto exterior (si todos son interiores, el polgono es completamente visible)
V1 A
V2
V4
B C V5 D
V3
Continuamos a partir de B Como cruzamos de fuera hacia adentro, nos quedamos con la interseccin C Al llegar a D (de dentro hacia fuera) unimos D con C y creamos el polgono { C, V5, D } V6
Corolario
A veces se necesita un recorte externo (recortar lo que caiga dentro de la ventana). Por ejemplo, en operaciones de cortar y pegar El algoritmo es similar, pero quedndonos con la parte de fuera
Cuando la ventana no es rectangular, o el objeto es curvo, se complican un poco los clculos, pero tambin se puede conseguir
Cuando el nmero de objetos es muy grande, se suele hacer una etapa previa de Bounding
Rectangle
Figura 1: completamente invisible Figura 2: completamente visible Figura 3: hay que calcular el recorte