Documentos de Académico
Documentos de Profesional
Documentos de Cultura
@tema 3 - Transformaciones 2D
@tema 3 - Transformaciones 2D
Índice
1. Transformaciones Básicas
1. Traslación
2. Rotación
3. Escalado
3. Otras Transformaciones
1. Reflexión
2. Afilamiento
5. Algoritmos de Recorte
1. Recorte de Puntos
2. Recorte de Líneas
3. Recorte de Polígonos
Transformaciones geométricas
• Con los algoritmos de primitivas ya podemos dibujar en pantalla
• En forma matricial:
P' = P + T
• En forma matricial:
⎛ cosθ sin θ ⎞
P = ( x, y ) P' = ( x' , y ' ) R = ⎜⎜ ⎟⎟
⎝ − sin θ cosθ ⎠
P' = P ⋅ R
Rotación general
• ¿Cómo será la fórmula general cuando el P’ = (x’, y’)
punto sobre el que se rota no es el origen,
sino un punto cualquiera (xc, yc)?
P = (x, y)
⎧ x' = xc + ( x − xc ) cos θ − ( y − yc ) sin θ
⎨
⎩ y ' = yc + ( x − xc ) sin θ + ( y − yc ) cos θ (xc, yc)
⎧ x' = sx x P = (x, y)
⎨
⎩ y' = sy y
• En forma matricial:
⎛ sx 0⎞
P = ( x, y ) P' = ( x' , y ' ) S = ⎜⎜ ⎟ P' = P ⋅ S
⎝0 s y ⎟⎠
• 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!
x 2x
⎧ x' = xc + s x ( x − xc )
⎨
⎩ y ' = yc + s y ( y − yc )
• El punto fijo podría ser el centro del objeto, o uno de sus vértices,
o tambén un punto arbitrario
• Para producir una secuencia de transformaciones hay que calcular las nuevas
coordenadas en cada transformación!
P’’ = P’ M3 + M4 = … = P M1 M3 + M2 M3 + M4
• Buscamos una solución más eficiente que permita combinar las transformaciones para
obtener directamente las coordenadas finales a partir de las iniciales
Coordenadas homogéneas
• ¿Cómo podríamos eliminar la matriz M2, y usar una única matriz para transformación?
• Lo habitual es tomar h=1, con lo que el punto (x, y) pasa a ser (x, y, 1)
⎛1 0 0⎞
⎜ ⎟
• Traslación: ( x' , y ' ,1) = ( x, y,1)⎜ 0 1 0⎟ P ' = P ⋅ T (t x , t y )
⎜t ty 1 ⎟⎠
⎝ x
⎛ cos θ sin θ 0⎞
• Rotación ⎜ ⎟
respecto ( x' , y ' ,1) = ( x, y,1)⎜ − sin θ cos θ 0⎟ P ' = P ⋅ R (θ )
al origen ⎜ 0 1 ⎟⎠
⎝ 0
• Escalado
⎛ sx 0 0⎞
⎜ ⎟
respecto ( x' , y ' ,1) = ( x, y,1)⎜ 0 sy 0⎟ P ' = P ⋅ S (s x , s y )
al origen ⎜0 1 ⎟⎠
⎝ 0
Composición de transformaciones: traslaciones
• Para cualquier secuencia de transformaciones, podemos calcular la matriz de
transformación compuesta, calculando el producto de las transformaciones individuales!
P’ = (x’, y’)
• Traslaciones sucesivas: T1
P ' = P ⋅ T1 (t x1 , t y1 ) P = (x, y) T2
T
P ' ' = P '⋅T2 (t x 2 , t y 2 ) P’’ = (x’’, y’’)
⎛ 1 0 0⎞ ⎛ 1 0 0⎞ ⎛ 1 0 0⎞
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
T = ⎜ 0 1 0⎟ ⋅⎜ 0 1 0⎟ = ⎜ 0 1 0⎟
⎜t t 1 ⎟ ⎜t t y2 1 ⎟⎠ ⎜⎝ t x1 + t x 2 t y1 + t y 2 1 ⎟⎠
⎝ x1 y1 ⎠ ⎝ x2
Composición de transformaciones: rotaciones
P ' = P ⋅ R (θ )
P = (x, y)
P ' ' = P '⋅R (α )
• Escalados sucesivas:
P' = P ⋅ S1 (s x1 , s y1 )
⎛ s x1 0 0 ⎞ ⎛ sx 2 0 0 ⎞ ⎛ s x1s x 2 0 0⎞
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
S =⎜ 0 s y1 0 ⎟ ⋅ ⎜ 0 sy2 0⎟ = ⎜ 0 s y1s y 2 0⎟
⎜0 0 1 ⎟⎠ ⎜⎝ 0 1 ⎟⎠ ⎜⎝ 0 1 ⎟⎠
⎝ 0 0
Rotación alrededor de un punto
• Para hacer una rotación general, podemos hacerlo mediante una composición de
transformaciones básicas:
P' = P ⋅ T (− xc ,− yc ) ⋅ R (θ ) ⋅ T ( xc , yc )
R(xc, yc, θ)
Escalado alrededor de un punto
P' = P ⋅ T (− xc ,− yc ) ⋅ S ( s x , s y ) ⋅ T ( xc , yc )
⎛1 0 0⎞ ⎛ −1 0 0⎞
⎜ ⎟ ⎜ ⎟
⎜ 0 − 1 0 ⎟ ⎜ 0 1 0 ⎟
⎜0 0 1⎟ ⎜ 0 0 1⎟
⎝ ⎠ ⎝ ⎠
⎛ −1 0 0⎞ ⎛0 1 0⎞
⎜ ⎟ ⎜ ⎟
⎜ 0 −1 0⎟ ⎜ 1 0 0 ⎟
⎜ 0 0 1⎟ ⎜0 0 1⎟
⎝ ⎠ ⎝ ⎠
Reflexión general
• Sobre una recta arbitraria y = mx + b
1 2
3 4 5
Reflexión general
• ¿Cuánto habrá que trasladar y rotar?
F(m, b)
Ejemplo de reflexión
• ¿Cómo lo resolvemos?
5 cos = 4/5
3 sin = 3/5
4
…continuación…
• Comenzamos con la matriz de rotación
⎛ 4 / 5 − 3 / 5 0⎞
⎜ ⎟
R (θ ) = ⎜ 3 / 5 4 / 5 0 ⎟
⎜ 0 1 ⎟⎠
⎝ 0
⎛1 0 0⎞
⎜ ⎟ M = R (θ ) ⋅ F ⋅ R (−θ ) =
F = ⎜ 0 −1 0⎟
⎜0 0 1⎟
⎝ ⎠
⎛ 7 / 25 24 / 25 0 ⎞
• Deshacemos la rotación ⎜ ⎟
M = ⎜ 24 / 25 − 7 / 25 0 ⎟
⎛ 4 / 5 3 / 5 0⎞ ⎜ 0
⎜ ⎟ ⎝ 0 1 ⎟⎠
R (−θ ) = ⎜ − 3 / 5 4 / 5 0 ⎟
⎜ 0 0 1 ⎟⎠
⎝
…continuación
• Para calcular los puntos
transformados, simplemente los
multiplicamos por la matriz final
(4,3,1) ⋅ M = (4,3,1)
y = 3x / 4
(5,10,1) ⋅ M = (11,2,1)
(1,7,1) ⋅ M = (7,−1,1)
Afilamiento
• Desplaza los puntos en función de los valores de sus coordenadas
⎛ 1 0 0⎞
⎧ x' = x + ay ⎜ ⎟
⎨ A = ⎜ a 1 0⎟
⎩ y' = y ⎜ 0 0 1⎟
⎝ ⎠
• En la otra dirección:
⎛1 b 0⎞
⎧ x' = x ⎜ ⎟
⎨ A = ⎜0 1 0⎟
⎩ y ' = y + bx ⎜0 0 1⎟
⎝ ⎠
Afilamiento general
• Afilar con respecto a la recta y = mx + b
⎛ 1 0 0⎞
⎧ x ' = x − ( y − b) / m ⎜ ⎟
⎨ A = ⎜ −1/ m 1 0 ⎟
⎩ y' = y ⎜ b / m 0 1⎟
⎝ ⎠
Transformación a la ventana de visión
• La escena se almacenan según un sistema de coordenadas reales (metros, cm, pulgadas)
(xmin, ymin)
x x u (umin, vmin) u
• Estos algoritmos también se usan para permitir método de copiar y pegar en aplicaciones
gráficas, pero a la inversa (recortando el interior)
Recorte de puntos
• Es el algoritmo más sencillo
• Asumiendo una ventana rectangular, sólo pintaremos los puntos que cumplas estas dos
condiciones simultáneamente:
(umax, vmax)
⎧u min ≤ x ≤ u max
⎨
⎩vmin ≤ y ≤ vmax
(umin, vmin)
Recorte de líneas
• Dado un segmento recto, hay que testear qué parte cae dentro de la ventana para
dibujar sólo esa parte
1
2
⎧ 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 P1
t1
P0
Algoritmo de recorte de Cyrus-Beck
• Se elige un punto F arbitrario para cada borde
N F
• Hay que controlar que el denominador
no se haga cero:
v(t)
P1 – Siempre se cumple que Ni ≠ 0
– Siempre se cumple que (P1 − P0 ) ≠ 0
– Puede ocurrir que N i ⋅ (P1 − P0 ) = 0
– En ese caso, la línea es paralela al
P0 borde y no existe intersección
Algoritmo de recorte de Cyrus-Beck
• Aplicando la fórmula obtenemos los 4 valores de t que indican las intersecciones de la
línea con los 4 bordes.
• Cada valor de t se etiqueta como entrante (tE) o saliente (tS), según entre o salga hacia
el lado donde se encuentra la ventana
• Al acabar los cálculos con los 4 bordes, se comparan los tE y tS finales, y se decide si
dibujar o no
Cyrus-Beck
Algoritmo de recorte de Cohen-Sutherland
• Se ejecuta primero un test inicial para
reducir el número de intersecciones a 1001 1000 1010
calcular
0001 0000
B 0010 – La línea EF’ es parcialmente visible Æ
calculamos la intersección y obtenemos F’’
– La línea F’F’’ es invisible Æ se descarta
G’
G – La línea EF’’ es totalmente visible Æ se pinta
(x4, y4)
Ejemplo de recorte
Comparativa de ambos algoritmos
• El algoritmo Cyrus-Beck es más eficiente que Cohen-Sutherland porque sólo calcula las
coordenadas cartesianas (x,y) al final
• Funciona muy bien cuando la mayoría de las líneas cae en el interior de la ventana de
recorte
• Lo que hace falta es un algoritmo que genere una o más áreas cerradas que puedan
rellenarse si se desea
rre cto
inc o
corr
ecto
Algoritmo de recorte de Sutherland-Hodgeman
• En cada iteración vamos recortando el polígono frente a uno de los bordes
• Vamos recorriendo la lista de vértices del polígono, y se genera una lista de salida
S P S P
T
T
P S P S
V1
{ A, V2, V3, B }
V7 B
V4 V3
C
• Continuamos a partir de B
{ C, V5, D }
Corolario
• A veces se necesita un recorte externo (recortar lo que caiga dentro de la ventana).