Transformações geométricas no plano: o que realmente funciona na prática
Todo mundo começa aprendendo que translação é "mover sem girar" e rotação é "girar em torno de um ponto". A teoria cabe numa aula de 40 minutos. O problema é que, quando você vai aplicar isso num projeto real — seja simulação, jogo, desenho técnico ou até modelagem CAD — as coisas complicam rapidão. Translação é uma transformação que desloca todos os pontos de uma figura pela mesma distância e na mesma direção. Você aplica um vetor (dx, dy) e pronto: cada ponto (x, y) vira (x+dx, y+dy). Rotação gira a figura em torno de um ponto fixo, o centro de rotação, por um ângulo determinado. A fórmula básica envolve seno e cosseno: o novo ponto (x', y') fica em x' = x·cos() - y·sen() e y' = x·sen() + y·cos(), considerando rotação em torno da origem.
Antes de falar das fórmulas, deixa eu explicar o que eu faço no dia a dia. Quando preciso aplicar rotação translação juntas, a ordem sempre importa. Aplicar translação depois de rotação dá resultado completamente diferente de fazer o oposto. Eu comecei a levar isso a sério depois que, numa simulação de mecanismo de quatro barras, o ponto final da engrenagem deveria terminar numa posição específica e eu passei dois dias inteiros rastreeando um erro que era simplesmente a ordem errada das transformações. O centro de rotação estava definido nas coordenadas globais, mas o vetor de translação estava sendo aplicado antes do giro, então toda a figura caía fora do encaixe. A solução foi transformar tudo para coordenadas relativas ao centro de rotação antes de qualquer coisa. A rotina que eu uso agora é sempre a mesma: primeiro subtrai-se o centro de rotação de todos os pontos, depois aplica-se a rotação, depois a translação global. Função simples, mas se você pular algum passo, o resultado não fecha nunca.
Como calcular rotação translação passo a passo
Se você tem um ponto P(x, y), um centro de rotação C(cx, cy), um ângulo e um vetor de translação T(tx, ty), o procedimento correto é: 1) Translate o ponto para o sistema do centro: x = x - cx, y = y - cy
👉 Clique no botão abaixo para saber mais sobre o assunto!
2) Rotacione: x = x·cos() - y·sen(), y = x·sen() + y·cos() 3) Translate de volta e aplique o vetor: x' = x + cx + tx, y' = y + cy + ty
Isso pode ser representado por uma matriz 3×3 homogênea, o que economiza linhas de código e evita erro de forgetting the center offset. A matriz composta seria T × R × T¹, aplicada na ordem inversa à que você lê. Um detalhe que poucos ensinam: ângulos em calculadoras e na maioria das linguagens de programação entram em radianos, não graus. Se você passar 90 diretamente, vai rotacionar algo em torno de 1,57° em vez de 90°. A conversão é _rad = _graus × / 180. Eu levei uma semana pra perceber isso porque o código parecia certo mas o resultado visual estava completamente errado.
Outro ponto prático: quando a figura é composta por vários vértices, aplique a transformação a cada vértice individualmente e reconstrua a geometria. Não tente aplicar a transformação diretamente na figura como um todo sem decompor nos pontos. Ferramentas gráficas fazem isso por você nos bastidores, mas se você está implementando do zero, o erro mais comum é rotacionar em torno da origem em vez do centro desejado e depois tentar corrigir com a translação — e isso simplesmente não funciona porque a translação não compensa o deslocamento angular. Uma nuance importante: rotação e translação são transformações rígidas, o que significa que preservam distâncias e ângulos. Se depois de aplicar a transformação alguma distância mudou, algo deu errado na conta. Eu uso essa propriedade como verificação rápida: calculo a distância entre dois pontos antes e depois, e se não baterem exatamente, reviso a matriz.
Para quem programa, a biblioteca mais indicada depende da linguagem. Em Python com numpy, matmul com arrays 3D funciona bem. Em JavaScript para Canvas, transform() do contexto 2D faz a matriz por você, mas note que o estado do transformador é acumulado — se você não salvar e restaurar o contexto com save() e restore(), transformações subsequentes se somam indesejadamente. Eu costumo usar uma função wrapper que aplica e reseta o estado automaticamente, senão em projetos grandes o sistema de coordenadas vira uma bagunça em poucas linhas de código. Leva uns minutos a mais pra escrever, mas economiza horas de depuração depois.