A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Java - Rotação de pixels

Sex

10

Abr

2009


16:14

(2 votos, média 5.00 de 5) 


Nível Intermediário

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.

45 graus

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

Exemplo 1

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
Exemplo 2

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.

сайт казино фараонкастрюли керамическиелобановский александр досьемагазин класслобановский классвести харьковалександр лобановский

Informações adicionais