Skip to topic | Skip to bottom
www.postcogito.org
          ...sine propero notiones
Kiko
Você está aqui: Kiko > ExcelStuff > TwoDLinearXforms > TransfLineares2D Imprimível | fim do tópico


Start of topic | Skip to actions
English Version

Transformações Linares em 2D

Uma planilha que demonstra a matemática de matrizes usada para redimensionar, rotacionar e esticar cada caractere das fontes do seu editor de textos.

Animação de demonstração
Clique na figura para baixar a planilha

  • Notas: Fica melhor em 1024x768. Pode ser necessário alterá-la para ficar bom em resoluções menores.

Transformações Lineares

Cada planilha tem barras de rolagem que lhe permitem mover, girar e redimensionar o desenho no gráfico. Experimente brincar com elas.

O primeiro passo de qualquer coisa em computação gráfica é obter um modelo matemático do objeto. Você verá isso nas tabelas "Dados Originais" logo abaixo dos gráficos. Nas primeiras três planilhas, usamos um modelo de 12 pontos de uma letra "K" estilizada. As coordenadas de cada ponto são números inteiros, facilitando correlacionar cada ponto na tabela com seus respectivos pontos no gráfico -- tente mudar algum número o gráfico instantaneamente mudará, tornando visualmente óbvio o ponto que você alterou. Não se dê ao trabaho de mexer nos "w" (os que são todos 1) -- veremos mais abaixo para que eles servem.

Na última planilha, usamos um modelo de 60 pontos de uma letra "C" ornamental, mostrada em duas versões: na primeira pode-se notar que, quando a amplação é grande, ela não fica muito bonita devido ao fato dos pontos serem unidos por linhas retas. O segundo gráfico é o mesmo do primeiro, mas com o recurso de "suavização" do Excel ligado. Eu certamente poderia ter caprichado um pouco mais no modelo para torná-lo ainda mais bonito, mas acho que me falta o talento artístico para isso.

As barras de rolagem controlam parâmetros das matrizes de transformação para cada operação primitiva. Então calculamos a transformação composta -- nada mais que a multiplicação das matrizes. Então multiplicamos essa matriz combinada por cada ponto da tabela "Dados Originais", resultando no modelo transformado, que finalmente é usado para desenhar o gráfico (descartando-se o "1" final de cada ponto).

Se você é um estudante secundarista que teve álgebra matricial empurrada goela abaixo sem nunca saber para que ela servia... bem, agora você sabe. Essa é a matemática que lhe permite obter caracteres de diferentes tamanhos quando você clica na caixa "tamanho da fonte" no seu editor de texto ou que lhe permite rotacionar as letras e formas no Corel Draw.

E sim, é uma calculeira danada que pouca gente teria paciência de fazer à mão. É para isso que servem os computadores: para fazer as contas que nós, humanos, somos lerdos demais pra fazer. E pra isso servem os programadores de computadores: para transformar a matemática em coisas úteis.

A única diferença entre a primeira e a segunda planilhas é a ordem em que as matrizes foram multiplicadas. Isso ilustra visualmente o fato da multiplicação de matrizes ser não-comutativa (ou seja, a ordem dos fatores altera, sim, o produto): na primeira planilha, o modelo roda ao redor do seu "centro", independente de para onde você o mova, porque a rotação foi feita antes da translação; na segunda planilha, ele sempre roda ao redor da origem, porque a rotação foi feita após a translação.

Rotações, mudanças de escala e cisalhamentos podem ser facilmente representados por matrizes, mas translações normalmente não. Para resolver isso, empregamos um truque legal inventado por Möbius no século 18 chamado coordenadas homogêneas: para os pontos, usamos vetores de 3 colunas ao invés de duas, preenchendo a última coluna com o número 1. Adicionalmente, usamos uma matriz 3x3 ao invés de 2x2: a última coluna contém o deslocamento X, Y e o número 1. Assim, quando multiplicarmos as matrizes, os "1" finais nos vetores farão os deslocamentos das translação passarem direto, sem alterações, de forma a serem adicionados às coordenadas em questão. A última linha (0,0,1) na matriz perpetua os "uns" nos vetores resultantes.

Esse conjunto de planilhas usa um recurso obscuro mas muito útil do Excel: as fórmulas podem retornar mais de um único resultado -- todas as funções de matrizes fazem isso. Quando esse for o caso, você deve selecionar toda a faixa de células que receberá o resultado e terminar de editar a fórmula com ALT+ENTER, ao invés de apenas ENTER.

Eu poderia perfeitamente ter feito a aritmética de matrizes usando somas e multiplicações normais, sem usar as funções de manipulação de matrizes embutidas no Excel, mas achei que da forma que eu fiz ficaria mais fácil de entender.

Eu também poderia perfeitamente otimizado um pouco os cálculos, removendo as últimas linhas desnecessárias e não incluíndo as colunas "1" finais em cada ponto (e suas respectivas multiplicações redundantes), mas, novamente, deixei assim mesmo para maior clareza.

Mini-FAQ

P1. Como você faz para as barras de rolagem mudarem os valores das células? Há algum código VBA escondido?

R1. Não. Com efeito, eu acho que a beleza da coisa é que não há código VBA em absoluto.

De fato, barras de rolagem e outros controles de formulário poderem mudar os valores de algumas células é um recurso padrão (ainda que surpreendentemente desconhecido) do Excel há mais de uma década.

Eis como usá-lo: clique com o botão direito em qualquer ícone da barra de ferramentas -- um menu pop-up lhe permitirá escolher outras barras de ferramentas. Clique na opção "Formulário"; isso fará com que a barra de ferramentas de controles de formulário (normalmente desativada) passe a aparecer. Nela você pode selecionar vários controles, inclusive as barras de rolagem: clique no ícone do controle desejado e o cursor do mouse mudará para uma cruz fina. Daí, arraste-e-solte um retângulo na planilha e um controle daquele tamanho aparecerá. Clique no botão direito sobre o controle recém criado para chamar seu menu de contexto e peça a opçao "Formatar controle". Uma caixa de diálogo aparece onde você pode definir os valores máximos e mínimos do controle, os incrementes, e, mais importante, a que célula ele está associado.

Tão logo você associe um controle a uma célula, toda vez que você clicar naquele controle, fazendo com que mude de valor, ele vai disparar um recálculo (assumindo que o recálculo automático esteja globalmente habilitado, o que provavelmente está, pois é o padrão.) Se algum gráfico depender de alguma célula que em última instância dependa de alguma célula vinculada àquele controle, ele será redesenhado também.

Nas versões do Excel 2003 e superiores, é útil circundar o gráfico com células cujos valores mudam durante o recálculo, para forçar o gráfico a ficar contido no retângulo de atualização. Doutra feita, o gráfico poderá ser apenas particialmente redesenhado (ou não ser redesenhado em absoluto), fazendo as animações ficarem feiosas.

Incidentalmente, o OpenOffice tem um recurso similar que funciona quase exatamente da mesma forma, mas o redesenho leva vários segundos, tornando lerdo demais para animações. Além disso, os recursos de gráfico do OO ficam muito atrás dos do Excel -- até hoje eu não entendo por que os gráficos XY do OO ainda não suportam algo tão simples quanto valores de X fora de ordem. É por isso que eu não disponibilizo versões dessa planilha para o OO.
topo


Você está aqui: Kiko > ExcelStuff > TwoDLinearXforms > TransfLineares2D

topo

Creative Commons License   O conteúdo deste site está disponibilizado nos termos de uma Licença Creative Commons, exceto onde dito em contrário.
  The content of this site is made available under the terms of a Creative Commons License, except where otherwise noted.