Informática Numaboa - Tutoriais e Programação
Java - Rotação de pixels
Sex 10 Abr 2009 16:14 |
- Detalhes
- Categoria: Aprenda Java fazendo applets
- Atualização: Sexta, 10 Abril 2009 16:45
- Autor: vovó Vicki
- Acessos: 9666
Para rodar uma imagem, basta rodar seus pixels... mas como? Veja neste tutorial como realizar esta proeza.
Você sabe que cada pixel possui suas coordenadas x e y (ou linhas e colunas). Você também sabe que, se quiser rodar os pixels, deve indicar quantos graus devem ser rodados, ou seja, o ângulo de rotação. Conhecendo o ângulo, para calcular as novas coordenadas dos pixels você precisa saber o que é seno e coseno de um ângulo, pois as fórmulas precisam destes valores. Veja a seguir as fórmulas definidas para as coordenadas cartesianas:
novo_x = x * cos(ângulo) - y * sen(ângulo) novo_y = y * cos(ângulo) + x * sen(ângulo)
A rotação é feita ao redor do eixo z. Isto funciona como se o pixel das coordenadas 0,0 ficasse grudado no lugar e o resto rodasse. Ângulos positivos provocam uma rotação no sentido anti-horário e ângulos negativos no sentido horário.
Seno e Coseno
Imagine o seno de um ângulo como seu reflexo na parede e o coseno como seu reflexo no chão. No exemplo abaixo, o centro do círculo tem as coordenadas 0,0 e é a origem dos eixos cartesianos. O eixo do seno é o eixo y e seus valores vão de -1 a 1. Estes valores são definidos pela intersecção entre o círculo e o eixo y. O eixo do coseno é o eixo x e seus valores, logicamente definidos pela intersecção do mesmo círculo com o eixo x, também vão de -1 a 1. Note que foi definido um ângulo de 45° neste sistema.
O tamanho da "sombra" do ângulo na "parede" y é o seno do ângulo e é menor do que 1. A "sombra" tem quase 71% da altura total da "parede" mostrando que o seno de 45° é igual a 0.7071.
O tamanho da "sombra" do ângulo no "chão" x é o coseno do ângulo e também é menor do que 1. A sombra também tem quase 71% da extensão total do "chão" mostrando que o coseno de 45° é igual a 0.7071.
Experimente: o seno de um ângulo de 30° é maior ou menor que seu coseno? Se você desenhar seu modelo, vai verificar que a "sombra na parede" (seno) é menor do que a "sombra no chão" (coseno). Na verdade, sen 30° é igual a 0.5 e cos 30° é 0.8660.
Experimente novamente: o seno de 90° é igual a 1 (a sombra ocupa totalmente a parede) e seu co-seno é igual a 0 (não faz sombra alguma no chão).
O sistema de coordenadas da Java
O sistema de coordenadas da linguagem Java tem o eixo y invertido, ou seja, apontando para o norte o valor é negativo e, apontando para o sul, o valor é positivo. E agora, como calcular a nova posição para poder rodar os pixels de uma imagem? Basta inverter as fórmulas clássicas citadas acima:
novo_x = x * cos(ângulo) + y * sen(ângulo) novo_y = y * cos(ângulo) - x * sen(ângulo)
Pronto, as fórmulas clássicas foram transformadas para atender às necessidades da Java. Além disto, a Java não possui métodos para calcular o seno e o coseno de ângulos medidos em graus, apenas para ângulos medidos em radianos. E agora? Transforme os ângulos em graus para radianos com a seguinte fórmula:
radianos = graus * PI / 180
Exemplo de cálculo de rotação
Veja a imagem ao lado: o ponto superior esquerdo tem as coordenadas 0,0 (x = 0 e y = 0) e o ponto inferior direito tem as coordenadas 42,42 (x = 42 e y = 42). Apesar de não estar indicado, sabemos que o ponto superior direito ocupa as coordenadas 42,0 (x = 42 e y = 0) e o inferior esquerdo 0,42 (x = 0 e y = 42).
Para rodar esta imagem, vamos deixar o ponto 0,0 fixo e rodar os outros pontos 45°. Primeiramente vamos deslocar o ponto 42,0 (superior direito):
novo_x = x * cos(45°) + y * sen(45°) novo_x = 42 * 0.7071 + 0 * 0.7071 novo_x = 29.69 novo_y = y * cos(45°) - x * sen(45°) novo_y = 0 * 0.7071 - 42 * 0.7071 novo_y = - 29.69
Para rodar todos os pixels da imagem é necessário calcular as novas posições x e y para cada um deles para depois reposicioná-los. Parece trabalhoso, mas com apenas um loop a tarefa dos cáculos é facilmente realizada. No desenho ao lado, todos os pixels sofreram uma rotação de 45°. Observe que o ponto 42,0 (usado no exemplo de cálculo) agora se encontra na posição 30,-30.
Além disto, observe que a imagem agora ocupa uma área muito maior, cerca de 1830 pixels a mais, e que o ponto 0,0 não corresponde mais ao canto superior esquerdo da imagem. Portanto, não se esqueça: uma imagem rodada pode ocupar uma área maior e precisa ser deslocada para cima (ou para baixo) para se posicicionar novamente em 0,0.