Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3 - Transformaciones 2D
Tema 3 - Transformaciones 2D
ndice
1.
Transformaciones Bsicas
1.
Traslacin
2.
Rotacin
3.
Escalado
2.
3.
Otras Transformaciones
1.
Reflexin
2.
Afilamiento
4.
5.
Algoritmos de Recorte
1.
Recorte de Puntos
2.
Recorte de Lneas
3.
Recorte de Polgonos
Transformaciones geomtricas
Traslacin
x' = x + t x
y' = y + t y
P = (x, y)
tx
En forma matricial:
P = ( x, y )
ty
P = (x, y)
T = (t x , t y )
P' = P + T
P = (x, y)
P = (x, y)
x = R cos
y = R sin
En forma matricial:
P = ( x, y )
cos
R =
sin
sin
cos
Rotacin general
P = (x, y)
(xc, yc)
P = (x, y)
x' = sx x
y' = sy y
En forma matricial:
P = ( x, y )
P = (x, y)
sx
S =
0
s y
P' = P S
Si sx == sy escalado uniforme
Si sx != sy escalado diferencial
Escalado general
x' = xc + s x ( x xc )
y ' = yc + s y ( y yc )
El punto fijo podra ser el centro del objeto, o uno de sus vrtices,
o tambn un punto arbitrario
2x
Representacin matricial
Una animacin requiere que los objetos se trasladen y roten en cada fotograma
Para producir una secuencia de transformaciones hay que calcular las nuevas
coordenadas en cada transformacin!
P = P M1 + M2
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?
(4, 6, 1)
(8, 12, 2)
(2, 3, 1/2)
(8/3, 4, 2/3)
Lo habitual es tomar h=1, con lo que el punto (x, y) pasa a ser (x, y, 1)
Coordenadas homogneas
Traslacin:
Rotacin
respecto
al origen
Escalado
respecto
al origen
sx
0
1
ty
0
1
sin
cos
0
0
sy
0
0
1
P ' = P T (t x , t y )
0
0
1
P ' = P R ( )
P ' = P S (s x , s y )
Traslaciones sucesivas:
T1
P ' = P T1 (t x1 , t y1 )
P = (x, y)
T2
T
P = (x, y)
T = 0 1 0 0
t
t
1
t
x
1
y
1
x2
0
1
t y2
0 1
0 = 0
1 t x1 + t x 2
0
1
t y1 + t y 2
0
1
P = (x, y)
Rotaciones sucesivas:
P ' = P R ( )
P = (x, y)
P = (x, y)
cos
R = sin
0
sin
cos
0
0 cos
0 sin
1 0
sin
cos
0
0 cos( + ) sin ( + ) 0
0 = sin ( + ) cos( + ) 0
1
0
0
1
Escalados sucesivas:
P' = P S1 (s x1 , s y1 )
P ' ' = P'S 2 (s x 2 , s y 2 )
P ' ' = P 'S 2 = P S1 S 2 = P S
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
1
Para hacer una rotacin general, podemos hacerlo mediante una composicin de
transformaciones bsicas:
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
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
y = mx + b
Reflexin general
T (0, -b)
R (-atan(m))
Ejemplo de reflexin
y = 3x / 4
Cmo lo resolvemos?
Lo importante no es el ngulo en s,
sino los valores del seno y el coseno
cos = 4/5
5
3
sin = 3/5
continuacin
4 / 5 3 / 5 0
R ( ) = 3 / 5 4 / 5 0
0
0
1
1 0 0
F = 0 1 0
0 0 1
Deshacemos la rotacin
4 / 5 3 / 5 0
R ( ) = 3 / 5 4 / 5 0
0
0 1
M = R ( ) F R ( ) =
7 / 25 24 / 25 0
M = 24 / 25 7 / 25 0
0
0
1
continuacin
(4,3,1) M = (4,3,1)
(5,10,1) M = (11,2,1)
(1,7,1) M = (7,1,1)
y = 3x / 4
Afilamiento
x' = x + ay
y' = y
En la otra direccin:
x' = x
y ' = y + bx
1 b 0
A = 0 1 0
0 0 1
1 0 0
A = a 1 0
0 0 1
Afilamiento general
x ' = x ( y b) / m
y' = y
x = (y-b) / m
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
(xmax, ymax)
(umax, vmax)
(xmin, ymin)
(umin, vmin)
coordenadas de pantalla
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)
u min x u max
vmin y 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
1
2
3
Si slo se ve parcialmente, habr que calcular la interseccin con los bordes de la ventana
Clculo de intersecciones
x = x1 + t ( x2 x1 )
t [0,1]
y = y1 + t ( y2 y1 )
P(t ) = P0 + t (P1 P0 )
Una vez obtenidos los 4 valores, se buscan las intersecciones (x,y) correctas
t2
t1
P0
P1
P(t ) = P0 + t (P1 P0 )
N i v(t )
N i v(t ) = 0
t=
N i v(t ) = N i (P (t ) F ) = ... = 0
N
v(t)
P1
N i (P0 F )
N i (P1 P0 )
P0
v(t ) = P (t ) F
Ni 0
Siempre se cumple que (P1 P0 ) 0
Puede ocurrir que N i (P1 P0 ) = 0
Siempre se cumple que
Cada valor de t se etiqueta como entrante (tE) o saliente (tS), segn entre o salga hacia
el lado donde se encuentra la ventana
Cmo saberlo?
NT
S
S
NR
NB
NL
Al acabar los clculos con los 4 bordes, se comparan los tE y tS finales, y se decide si
dibujar o no
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
0000
A continuacin hacemos una operacin AND entre los cdigos de ambos extremos
Si el AND == 0 siendo ambos cdigos 0000 la lnea es totalmente visible y la pintamos ntegra
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
C
F
1001
1000
0101
1010
0000
0001
0010
G
0100
0110
Calculamos la interseccin G
(x2, y2)
(x1, y1)
(x3, y3)
(xL, yB)
(x4, y4)
Ejemplo de recorte
Funciona muy bien cuando la mayora de las lneas cae en el interior de la ventana de
recorte
Recorte de polgonos
Lo que hace falta es un algoritmo que genere una o ms reas cerradas que puedan
rellenarse si se desea
rre
o
c
n
i
corr
ecto
cto
Vamos recorriendo la lista de vrtices del polgono, y se genera una lista de salida
P
Se aade P
a la lista
Se aade T
a la lista
P
No se aade
ningn vrtice
Se aaden T
y P a la lista
Ejemplo
V3
B
V2
C
D
A
V1
V1
V2
A
V7
V4
B
C
V3
V5
D
V6
Comenzamos con V1
V1
Continuamos a partir de B
V2
A
V7
V4
V3
C
V5
D
V6
Corolario
Rectangle