Académique Documents
Professionnel Documents
Culture Documents
Í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 = (x, y ) P' = ( x' , y' ) T = (t x , t y )
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)
P = (x, y)
⎧ x' = s x x
⎨ y' = s y
⎩ y
• En forma matricial:
⎛s 0⎞
x
P = ( x, y ) P' = S = ⎜⎜ ⎟ ⎟ P' = P ⋅ S
( x' , y' ) ⎝ 0 y⎠
s
• Según el valor del factor de escala s: • Si sx == sy Æ escalado uniforme
– Si s > 1 Æ aumento de tamaño
– Si s==1 Æ no cambia de tamaño
– Si s < 1 Æ disminución de tamaño
• 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!
• 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⎞
⎜ ⎟ P' =
• Traslación: ( x' , y' ,1) = ( x, y,1)⎜ 0 1 0⎟ P ⋅ T (tx , t y )
⎜ ⎟
⎝ tx ty 1⎠
⎛ cos θ sin θ 0 ⎞
• Rotación ⎜ ⎟
⎝ 0 0 1⎠ x
• Escalado
⎛ sx 0 0⎞
⎜ ⎟
respecto ( x' , y' ,1) = ( x, y,1)⎜⎜ 0 ⎟ sy P' =
al origen ⎝10 0⎟ 0 ⎠
P ⋅ S (s , sy )
Coordenadas homogéneas
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 = (x, y)
P' = P ⋅ T1 (tx1 , t y1 ) T2
T
⎛1 0 0⎞ ⎛ 1 0 0⎞ ⎛ 1 0 0⎞
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
T =⎜ 0 1 0⎟ ⋅ ⎜ 0 1 0⎟ = ⎜ ⎜ 0 1 10 ⎟
⎜
Composición
⎝t t de
x11 ⎠ ⎝ ttransformaciones:
y1
x2t 1 ⎠ ⎝ t +t
y2 x1 t + t traslaciones
x2 y1 ⎠
y2
Composición de transformaciones: rotaciones
⎜ 0 0 ⎟⎠ ⎜⎝ 1 0 0 0 0
⎝ ⎠ ⎝ ⎠
Composición de transformaciones: escalados
• Escalados sucesivas:
P' = P ⋅ S1(s x1 , s y1 )
⎛s 0 0 ⎞ ⎛ sx 2 0 0⎞ ⎛ s x1s x 2 0 0⎞
⎜ x1 ⎟ ⎜ ⎟ ⎜ ⎟
S =⎜ 0 s y1 0⎟ ⋅ ⎜ 0 sy2 01 ⎟ = ⎜ ⎜ 0 s y1s y 2 10 ⎟
Composición
⎜ 0
⎝ 0 ⎟⎠ de
⎜1 transformaciones:
⎝ 0 0 ⎠ ⎝ 0 0 escalados
⎠
Rotación alrededor de un punto
• Para hacer una rotación general, podemos hacerlo mediante una composición de
transformaciones básicas:
R(xc, yc, θ)
Escalado alrededor de un punto
P' = P ⋅ T (−xc ,− yc ) ⋅ S (s x , s y ) ⋅ T ( xc yc )
,
⎜ 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?
• Por lo pronto no hay que trasladar
y = 3x / 4
• ¿Cuánto habrá que rotar?
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 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
x + ay ⎛ 1 0 0⎞
⎧ x' = ⎜ ⎟
⎨ A = ⎜ a 1 0⎟
⎜ 1⎠
⎩ y'= y ⎟
⎝0 0
• En la otra dirección:
⎛ 1 b 0⎞
⎧ x'= x ⎜ ⎟
⎨ y + bx A =⎜0 1 0⎟
⎩ y' = ⎜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)
y (xmax, ymax) y v v (u ,v )
max max
(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 = x 1+ t x( −2 x ⎫1 )
⎨ ⎬ ∀ 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
Algoritmo de recorte de– Cyrus-Beck
Siempre se cumple que ( P − P ) ≠ 0 1 0
• 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
• ¿Cómo saberlo? • Mirando el signo de N ⋅ (P − P )
i 1 0
• 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
(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
• 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).