| Aprenda Java fazendo Applets ROTAÇÃO DE PIXELS |
Notice: Undefined variable: idx in /home/numaboa.com.br/public_html/informatica/java/head.php on line 19 ![]() |
| OS CÁLCULOS MATEMÁTICOS |
Para rodar uma imagem basta rodar seus pixels... mas como ? 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 co-seno 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 co-seno 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 co-seno é 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 co-seno 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 co-seno de 45° é igual a 0.7071. Experimente: o seno de um ângulo de 30° é maior ou menor que seu co-seno? Se você desenhar seu modelo, vai verificar que a "sombra na parede" (seno) é menor do que a "sombra no chão" (co-seno). 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 disso, Java não possui métodos para calcular o seno e o co-seno de ângulos medidos em graus, apenas para ângulos medidos em radianos. E agora? Transforme seus â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 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 nosso 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 disso, 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. |