segunda-feira, 16 de julho de 2012

Pringles - Tutorial Mathematica Parte 2

Olá pessoal,

Depois de um bom tempo parado volto a postar neste nosso espaço. Pretendo escrever um pouco mais durante essas férias.

Como prometido, retomarei o primeiro post sobre como desenhar a batata Pringles no software Mathematica. Neste último mostrei como fiz para encontrar a equação e o domínio adequado para se chegar no formato da batata. Em suma, a partir da conhecida função sela generalizada ($z=a x^2- b y^2$, da qual variei os parâmetros $a$ e $b$) cheguei numa curva parecida com a da batatinha. Em seguida, tive que ajustar o domínio, pois toda vez que desenhamos alguma coisa no Mathematica, e em geral qualquer software de manipulação matemática, ele assume o domínio como sendo quadrado, o que não é o que eu desejava. Então para encontrar o domínio ideal tive que olhar a batata "por cima" e imaginar qual a melhor curva que se ajustava ao contorno observado. Pensei numa elipse e, da mesma maneira como a função de sela, fui variando os coeficientes e os expoentes da equação da elipse generalizada para obter um contorno satisfatório. Com o domínio e a curva definida, bastou combiná-los para obter uma boa aproximação da batatinha:



Agora, vamos ver como adicionar textura ao gráfico acima para que ele se torne uma batata. A nossa sorte é que ficou muito fácil manipular imagens e integrá-las aos objetos na última versão do Mathematica (8.0).

Para modificar o estilo de um gráfico, isto é, a maneira como ele vai ser desenhado, precisamos utilizar a instrução (directive em inglês) PlotStyle. Se não estou enganado todos os gráficos gerados pelo software aceitam a instrução PlotStyle como argumento. Quando não se menciona o PlotStyle ao desenhar algum gráfico, o Mathematica assume certos valores padrões, como a cor roxa em funções de uma variável, uma determinada espessura, etc.

Abaixo um exemplo de como se escreve o comando para se ter uma ideia de como a coisa funciona e algumas de suas opções:


Veja que num único comando Plot agrupei entre chaves três funções diferentes para serem desenhadas ($y=x$, $y=x^2$ e $y=x+1$), e para cada função determinei opções diferentes dentro do PlotStyle. A sintaxe segue a seguinte lógica: PlotStyle -> { {opções da função 1},{opções da função 2},{opções da função 3} }. Para a função 1, $y=x$, escolhi as opções Thick e Orange. Thick faz a linha do gráfico ficar mais grossa e Orange faz a linha ficar laranja. Na segunda função, usei Red para a cor vermelha e Dashed para a linha ficar tracejada. Na última função usei Blue para a cor azul e Thickness[0.03] - o Thickness funciona como o Thick, mas permite que você determine um valor para a espessura da linha a ser desenhada dentro dos colchetes.

Pois bem, entendido como o PlotStyle governa as características de estilo de um gráfico, seguimos adiante para verificar como o Mathematica trabalha com texturas.

Para gráficos gerados por comandos do tipo Plot (Plot, Plot3D, ContourPlot, ParametricPlot, etc.), para inserir uma textura basta adicionar a instrução Texture[nome da textura, variável da textura, etc] como argumento do PlotStyle. No entanto, se você testar este comando para diversos tipos de gráficos e funções, você vai reparar que a textura não se encaixa muito bem ao gráfico, muitas vezes aparece distorcida, etc.
Já gráficos gerados pelos comandos primitivos de Polygon, Rectangle, etc, não aceitam somente Texture[] como instrução (do próprio comando Graphics ou Graphics3D, não do PlotStyle), é preciso de algo mais para que a textura seja aplicada (o comando Disk, por exemplo, nem mesmo admite textura).

Em ambos os casos, a questão por trás dos problemas está ligada ao software não "saber" como posicionar a textura em relação à superfície. É preciso então "dizer" para a linha de comando de que maneira aquela textura deve ser colocada sobre a superfície - e essa maneira está ligada às coordenadas do gráfico. Estudemos alguns exemplos:


Neste exemplo, a textura foi aplicada num polígono. A ordem de cada instrução não é intuitiva, e muitas vezes deve-se recorrer ao help (tecla F1) para entender os detalhes de cada comando. Mesmo assim, vemos que o argumento da instrução Texture foi uma imagem qualquer (você pode, por exemplo dar ctrl+c numa figura da internet e ctrl+v no notebook do Mathematica). O interessante está na capacidade do software aceitar como argumento uma imagem assim, sem mais nem menos. Seguido da textura, o triângulo é definido pelo comando Polygon, cujos argumentos são as coordenadas dos vértices do triângulo. Após determinado as coordenadas do objeto, vamos ter que determinar como a textura vai ser posicionada, e isso é feito, como dito acima, relacionando as próprias coordenadas do triângulo. No caso, as coordenadas utilizadas no comando VertexTextureCoordinates são as mesmas do que o do triângulo, o que indica, a grosso modo, que a sua textura foi "cortada" exatamente no formato do triângulo. Se as coordenadas de entrada do comando VertexTextureCoordinates fossem multiplicadas por 10, por exemplo, então esse triângulo de textura que vemos acima seria repetido diversas vezes dentro do triângulo original.

Utilizando mais imagens e menos texto, veremos como se aplica textura a uma superfície gerada por comandos como o Plot3D, por exemplo:



Em um gráfico 3D, há mais de uma opção para nele fixarmos a textura. A primeira dela é a mais simples, basta prosseguir mais ou menos como no caso anterior, colocando a instrução Texture dentro da PlotStyle. Note entretanto que dessa maneira você não tem controle sobre como a textura é posicionada sobre o gráfico, ou seja, o programa utiliza um padrão interno. Já com o comando TextureCoordinateFunction, é possível determinar de que maneira a textura é colocada em função das variáveis, que são expressas como: #1 = x, #2 = y, #3 = u, #4 = v, sendo que u e v são variáveis paramétricas genéricas (podem ser $r$ e $\theta$ numa parametrização polar, por exemplo). Veja as mudanças que fiz nessas variáveis nos gráficos acima. É possível até colocar valores elevados ao quadrado, também a soma ou subtração, #1+#2, por exemplo. Não entrarei em muitos detalhes pois o post já está extenso, mas se tiver interesse busque modificar os parâmetros por conta e ver os efeitos dessas mudanças - o melhor jeito de aprender é você mesmo manipulando as coisas.

Pois bem, entendido mais ou menos como se coloca textura sobre um gráfico no Mathematica, bastou então pegar uma figura na internet que representasse bem a superfície da batatinha e utilizá-la como textura para o gráfico que encontramos no post anterior.


E está ai a nossa batata Pringles desenhada via equações algébricas e um pouco de malabarismo computacional. Bacana não? Se é verdade que a natureza pode ser descrita através da matemática, imagina toda a trabalheira que isso deve ter dado para o programador universal?

Espero que tenham gostado e aprendido com este post. Com um pouco de criatividade, dá pra se fazer muitas outras coisas com as ferramentas que mostrei. Por exemplo, desenhei a bandeira do Brasil balançando ao vento utilizando texturas enquanto escrevia esta segunda parte:

anim2


No próximo post, vou falar de funções lineares entre espaços vetoriais, as chamadas transformações lineares.



Postagem em destaque

Quais os melhores livros de Cálculo 1?

Uma dúvida muito comum de quem acabou de entrar na faculdade de exatas é qual livro de cálculo seguir e adotar como referência. Consulta...