Exemplo de geometria: aplicação de uma transformação de matriz em um objeto de exibição

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O aplicativo de exemplo DisplayObjectTransformer mostra vários recursos de uso da classe Matrix para transformar um objeto de exibição, incluindo o seguinte:

  • Girar o objeto de exibição

  • Dimensionar o objeto de exibição

  • Transpor (reposicionar) o objeto de exibição

  • Inclinar o objeto de exibição

O aplicativo fornece uma interface para ajustar os parâmetros de transformação da matriz, como a seguir:

Quando o usuário clica no botão Transform, o aplicativo aplica a transformação apropriada.

O objeto de exibição original e o objeto de exibição com um giro de - 45° e um dimensionamento de 50%

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br . Os arquivos do aplicativo DisplayObjectTransformer podem ser encontrados na pasta Samples/DisplayObjectTransformer. O aplicativo consiste nos seguintes arquivos:

Arquivo

Descrição

DisplayObjectTransformer.mxml

ou

DisplayObjectTransformer.fla

O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML)

com/example/programmingas3/geometry/MatrixTransformer.as

Uma classe que contém métodos para aplicar transformações de matriz.

img/

Um diretório contendo arquivos de imagem de exemplo usados pelo aplicativo.

Definição da classe MatrixTransformer

A classe MatrixTransformer inclui métodos estáticos que aplicam transformações geométricas de objetos Matrix.

O método transform()

O método transform() inclui parâmetros para cada um dos itens a seguir:

  • sourceMatrix — a matriz de entrada, que o método transforma

  • xScale e yScale — o fator de dimensionamento x e y

  • dx e dy — os valores de transposição x e y , em pixels

  • rotation — o valor de rotação, em graus

  • skew — o fator de inclinação, em porcentagem

  • skewType — a direção da inclinação "right" ou "left"

O valor de retorno é a matriz resultante.

O método transform() chama os seguintes métodos estáticos da classe:

  • skew()

  • scale()

  • translate()

  • rotate()

Cada um retorna a matriz de origem com a transformação aplicada.

O método skew()

O método skew() inclina a matriz, ajustando as propriedades b e c da matriz. Um parâmetro opcional, unit , determina as unidades usadas para definir o ângulo de inclinação e, se necessário, o método converte o valor angle em radianos:

if (unit == "degrees")  
{ 
    angle = Math.PI * 2 * angle / 360; 
} 
if (unit == "gradients") 
{ 
    angle = Math.PI * 2 * angle / 100; 
}

Um objeto Matrix skewMatrix é criado e ajustado para aplicar a transformação de inclinação. Inicialmente, é a matriz de identidade, como a seguir:

var skewMatrix:Matrix = new Matrix();

O parâmetro skewSide determina o lado para o qual a inclinação é aplicada. Se for definida como "right" , o seguinte código define a propriedade b da matriz:

skewMatrix.b = Math.tan(angle);

Caso contrário, o lado inferior é inclinado ajustando a propriedade c de Matrix, como a seguir:

skewMatrix.c = Math.tan(angle);

A inclinação resultante é aplicada à matriz existente, concatenando as duas matrizes, como mostra o seguinte exemplo:

sourceMatrix.concat(skewMatrix); 
return sourceMatrix;

O método scale()

Ο exemplo a seguir mostra que o método scale() primeiro ajusta o fator de dimensionamento, caso seja fornecido como uma porcentagem e, em seguida, usa o método scale() do objeto da matriz:

if (percent) 
{ 
    xScale = xScale / 100; 
    yScale = yScale / 100; 
} 
sourceMatrix.scale(xScale, yScale); 
return sourceMatrix;

O método translate()

O método translate() apenas aplica os fatores de transposição dx e dy chamando o método translate() do objeto da matriz, como a seguir:

sourceMatrix.translate(dx, dy); 
return sourceMatrix;

O método rotate()

O método rotate() converte o fator de rotação de entrada em radianos (se fornecido em graus ou gradientes) e chama o método rotate() do objeto da matriz:

if (unit == "degrees") 
{ 
    angle = Math.PI * 2 * angle / 360; 
} 
if (unit == "gradients") 
{ 
    angle = Math.PI * 2 * angle / 100; 
} 
sourceMatrix.rotate(angle); 
return sourceMatrix;

Chamada do método MatrixTransformer.transform() no aplicativo

O aplicativo contém uma interface do usuário para obter os parâmetros de transformação do usuário. Então, ele transmite esses valores, junto com a propriedade matrix da propriedade transform do objeto de exibição, ao método Matrix.transform() , da seguinte maneira:

tempMatrix = MatrixTransformer.transform(tempMatrix,  
    xScaleSlider.value,  
    yScaleSlider.value, 
    dxSlider.value,  
    dySlider.value, 
    rotationSlider.value, 
    skewSlider.value,  
    skewSide );

O aplicativo aplica o valor de retorno à propriedade matrix da propriedade transform do objeto de exibição, acionando a transformação:

img.content.transform.matrix = tempMatrix;