Capitulo 9: Representación matricial de transformaciones

Anuncio
Textos Universitarios / Serie Docencia
________________________________________________________________________
Capítulo 935
Representación matricial de transformaciones
9.1 Matrices
Una matriz m×n es un conjunto de números organizado en m filas y n columnas. En la
siguiente ilustración se muestran varias matrices.
Es posible sumar dos matrices del mismo tamaño mediante la adición de elementos
individuales. En la siguiente ilustración se muestran dos ejemplos de adición de matrices.
Una matriz m×n puede multiplicarse por una matriz n×p, y da como resultado una matriz
m×p. El número de columnas de la primera matriz debe coincidir con el número de filas
de la segunda matriz. Por ejemplo, una matriz 4×2 puede multiplicarse por una matriz
2×3 para generar una matriz 4×3.
Los puntos en el plano y las filas y columnas de una matriz pueden considerarse como
vectores. Por ejemplo, (2, 5) es un vector con dos componentes, y (3, 7, 1) es un vector
con tres componentes. El producto de puntos de dos vectores se define de esta forma:
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
35
http://msdn.microsoft.com/library/en-us/gdicpp/GDIPlus/aboutGDIPlus/
coordinatesystemsandtransformations/matrixrepresentationoftransformations.asp
Junio 3 de 2006
431
Jenaro C. Paz
________________________________________________________________________
Por ejemplo, el producto de puntos de los vectores (2, 3) y (5, 4) es (2)(5) + (3)(4) = 22.
El producto de puntos de los vectores (2, 5, 1) y (4, 3, 1) es (2)(4) + (5)(3) + (1)(1) = 24.
Observe que el producto de puntos de dos vectores es un número, no otro vector. Observe
también que sólo se puede calcular el producto de puntos de dos vectores si éstos tienen
el mismo número de componentes.
Consideremos que A(i, j) es una entrada de la matriz A, en la fila i, columna j. Por
ejemplo, A(3, 2) es una entrada de la matriz A, en la fila 3ª, columna 2ª. Supongamos que
A, B y C son matrices, y que AB = C. Las entradas de C se calculan de esta forma:
C(i, j) = (fila i de A) • (columna j de B)
En la siguiente ilustración se muestran varios ejemplos de multiplicación de matrices.
9.2 Transformaciones con Matrices
Si se considera un punto en un plano como una matriz 1×2, se puede transformar dicho
punto multiplicándolo por una matriz 2×2. En la siguiente ilustración se muestran varias
transformaciones que se han aplicado al punto (2, 1).
432
Textos Universitarios / Serie Docencia
________________________________________________________________________
Todas las transformaciones que se muestran en la ilustración anterior son
transformaciones lineales. Otros tipos de transformaciones, como la traslación, no son
lineales, y no pueden expresarse en forma de multiplicación por una matriz 2×2.
Supongamos que se desea rotar 90 grados, trasladar 3 unidades en la dirección del eje x y
trasladar 4 unidades en la dirección del eje y al punto (2, 1). Todo esto puede realizarse
mediante una multiplicación de matrices seguida de una adición de matrices.
Se denomina transformación afín a una transformación lineal (multiplicación por una
matriz 2x2) seguida de una traslación (adición de una matriz 1×2). Una alternativa al
almacenamiento de una transformación afín en un par de matrices (una para la parte
lineal y otra para la traslación) es el almacenamiento de la transformación completa en
una matriz 3×3. Para que esto funcione, hay que almacenar un punto del plano en una
matriz 1×3 con una 3ª coordenada ficticia. La técnica más habitual es hacer que todas las
3ª coordenadas sean igual a 1. Por ejemplo, el punto (2, 1) viene representado por la
matriz [2 1 1]. En la siguiente ilustración se muestra una transformación afín (rotación de
90 grados, traslación de 3 unidades en la dirección del eje x y de 4 unidades en la
dirección del eje y) que se expresa como multiplicación por una única matriz 3×3.
En el ejemplo anterior, el punto (2, 1) se asigna al punto (2, 6). Tenga en cuenta que la
tercera columna de la matriz 3×3 contiene los números 0, 0, 1. Esto siempre será así para
el caso de la matriz 3×3 de una transformación afín. Los números importantes son los seis
433
Jenaro C. Paz
________________________________________________________________________
números de las columnas 1 y 2. La parte superior izquierda 2×2 de la matriz representa la
parte lineal de la transformación, y las dos primeras entradas de la 3ª fila representan la
traslación.
En GDI+, es posible almacenar una transformación afín en un objeto Matrix. Como la
tercera columna de una matriz que representa una transformación afín siempre es (0, 0,
1), cuando se construye un objeto Matrix, sólo se especifican los seis números de las dos
primeras columnas. La instrucción Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
construye la matriz que se muestra en la ilustración anterior.
9.2.1 Transformaciones compuestas
Una transformación compuesta es una secuencia de transformaciones, una tras otra.
Observe las matrices y las transformaciones de la siguiente lista:
Si se comienza con el punto (2, 1), representado por la matriz [2 1 1], y se multiplica por
A, después por B y después por C, el punto (2, 1) experimentará las tres transformaciones
en el orden indicado.
[2 1 1]ABC = [-2 5 1]
En lugar de almacenar las tres partes de la transformación compuesta en tres matrices
independientes, se pueden multiplicar A, B y C a la vez para obtener una única matriz
3×3 que almacene toda la transformación compuesta. Supongamos que ABC = D. En este
caso, un punto multiplicado por D da el mismo resultado que un punto multiplicado por
A, después por B y después por C.
[2 1 1]D = [-2 5 1]
En la siguiente ilustración se muestran las matrices A, B, C y D.
434
Textos Universitarios / Serie Docencia
________________________________________________________________________
El hecho de que la matriz de una transformación compuesta pueda crearse multiplicando
matrices de transformación individuales significa que puede almacenarse cualquier
secuencia de transformaciones afines en un único objeto Matrix.
PRECAUCIÓN El orden en una transformación compuesta es importante. En general,
un orden de rotación, ajuste de escala y traslación no es lo mismo que un orden de ajuste
de escala, rotación y traslación. Análogamente, el orden de multiplicación de matrices es
importante. En general, ABC no es lo mismo que BAC.
La clase Matrix proporciona varios métodos para generar una transformación compuesta:
Multiply, Rotate, RotateAt, Scale, Shear y Translate. En el siguiente ejemplo se crea la
matriz de una transformación compuesta que, primero, rota 30 grados, después ajusta la
escala en un factor de 2 en la dirección del eje y, y después se traslada 5 unidades en la
dirección del eje x:
[C#]
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
En la siguiente ilustración se muestra la matriz.
9.3 Clase Matrix
Requisitos
Espacio de nombres: System.Drawing.Drawing2D.Matrix
Encapsula una matriz afín de 3 por 3 que representa una transformación geométrica. No
se puede heredar esta clase.
435
Jenaro C. Paz
________________________________________________________________________
9.3.1 Constructores públicos
Matrix (Constructor)
Sobrecargado. Inicializa una nueva instancia
de la clase Matrix.
9.3.2 Propiedades públicas
Elements
IsIdentity
IsInvertible
OffsetX
OffsetY
Obtiene una matriz de valores numéricos de
punto flotante que representa los elementos
de este objeto Matrix.
Obtiene un valor que indica si este objeto
Matrix es la matriz de identidad.
Obtiene un valor que indica si este objeto
Matrix se puede invertir.
Obtiene el valor de conversión x (el valor dx
o el elemento de la tercera fila, primera
columna) de este objeto Matrix.
Obtiene el valor de traducción y (el valor dy
o el elemento de la tercera fila, segunda
columna) de esta Matrix.
9.3.3 Métodos públicos
Clone
CreateObjRef (se hereda de
MarshalByRefObject)
Dispose
Equals
GetHashCode
GetLifetimeService (se hereda de
MarshalByRefObject)
GetType (se hereda de Object)
InitializeLifetimeService (se hereda de
MarshalByRefObject)
436
Crea una copia exacta de este objeto Matrix.
Crea un objeto que contiene toda la
información relevante necesaria para
generar un proxy utilizado para comunicarse
con un objeto remoto.
Libera todos los recursos utilizados por este
objeto Matrix.
Reemplazado. Comprueba si el objeto
especificado es un objeto Matrix y si es
idéntico a este objeto Matrix.
Reemplazado. Devuelve un código hash.
Recupera el objeto de servicio de duración
actual que controla la directiva de duración
de esta instancia.
Obtiene el objeto Type de la instancia
actual.
Obtiene un objeto de servicio de duración
para controlar la directiva de duración de
esta instancia.
Textos Universitarios / Serie Docencia
________________________________________________________________________
Invert
Multiply
Reset
Rotate
RotateAt
Scale
Shear
ToString (se hereda de Object)
TransformPoints
TransformVectors
Translate
Invierte este objeto Matrix, si se puede
invertir.
Sobrecargado. Multiplica este objeto Matrix
por el objeto Matrix especificado
anteponiéndole el objeto Matrix
especificado.
Restablece este objeto Matrix para que
tenga los elementos de la matriz de
identidad.
Sobrecargado. Aplica a este objeto Matrix
un giro del ángulo especificado y en el
sentido de las agujas del reloj en torno al
origen.
Sobrecargado. Aplica a este objeto Matrix
un giro en el sentido de las agujas del reloj
en torno al punto especificado anteponiendo
el giro.
Sobrecargado. Aplica el vector de escala
especificado a este objeto Matrix
anteponiendo el vector de escala.
Sobrecargado. Aplica el vector de recorte
especificado a este objeto Matrix
anteponiendo el vector de recorte.
Devuelve un objeto String que representa al
objeto Object actual.
Sobrecargado. Aplica la transformación
geométrica que representa este objeto
Matrix a una matriz de puntos.
Sobrecargado. Multiplica cada vector de una
matriz por la matriz. Los elementos de
conversión de esta matriz (tercera fila) se
omiten.
Sobrecargado. Aplica el vector de
conversión especificado a este objeto Matrix
anteponiendo el vector de conversión.
9.3.4 Métodos protegidos
Reemplazado. Limpia los recursos
asignados a esta Matrix. En C# y C++, los
finalizadores se expresan mediante la
sintaxis del destructor.
MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object
actual.
Finalize
437
Jenaro C. Paz
________________________________________________________________________
438
Descargar