Capítulo 32
Matrizes e transformações 2D
2 min de leitura 372 palavras 1 gravura
Rotação + escala aplicados a um quadrado. Controles de ângulo e escala.
Trabalhe sobre uma cópia da pasta inicio do exemplo correspondente. Leia, digite, mude uma coisa, preveja, recarregue e confira. A referência completa fica na raiz da pasta do exemplo, no pacote anexo.
O que você pratica
- cos/sin no apply?
- Escala uniforme?
- translate 240,150?

Girar o quadrado
Sliders mudam ângulo e escala.
Erro comum: aplicar rotação sem transladar ao centro — o quadrado orbitaria a origem 0,0 do canvas.
apply
No início apply devolve x,y crus. Implemente rotação×escala.
return { x: scale * (c * x - s * y), y: scale * (s * x + c * y) };
Pare e experimente. O contorno teal deve responder.
Matriz 2×2
Por baixo, é multiplicar vetor coluna por matriz.
Não publique exercícios com dados reais. Conteúdo fictício de Recife.
Como o exemplo desta etapa funciona
A referência desta etapa reúne app.js, index.html, styles.css. Abra o resultado pronto, localize o trecho que produz matrizes e transformacoes 2d e só então compare com inicio. Os dois diretórios são independentes: você pode errar, restaurar e repetir sem buscar arquivos de outro capítulo.
Leitura do resultado
Observe primeiro o que permanece parado e o que responde a uma ação. Depois altere um único número, cor, coordenada ou condição. Antes de recarregar, escreva o efeito esperado. Essa previsão separa uma mudança compreendida de uma tentativa ao acaso.
Diagnóstico guiado
Se a cena sumir, confira a primeira mensagem do Console e o caminho dos arquivos. Em SVG, revise viewBox, atributos e ordem das formas. Em p5.js, confirme a biblioteca local e se setup e draw foram escritos corretamente. Em Canvas ou WebGL, verifique o contexto e os limites numéricos antes de mudar outra coisa.
Critério de avanço
Avance quando conseguir descrever a cena, modificar um parâmetro com previsão e restaurar a referência sem copiar arquivos de uma etapa posterior.
Atividades
- c e s são?
- Escala 2 dobra?
- stroke vs fill?
Respostas comentadas
Só abra depois de tentar.
Atividade 1. cos e sin do ângulo.
Atividade 2. Sim, linearmente.
Atividade 3. Aqui só contorno.
Exemplo deste capítulo: pacote de exemplos/32-matrizes/.
O arquivo completo
Referência do exemplo 32-matrizes, reproduzida aqui para que você possa conferir sem sair da página.
index.html
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Matrizes — Laboratório da Luz</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a class="skip" href="#conteudo">Ir ao conteúdo</a>
<header>
<p class="tag">Laboratório da Luz · Recife</p>
<h1>Matrizes</h1>
</header>
<main id="conteudo">
<p class="dica">Matrizes</p>
<div class="stage"><canvas id="g" width="480" height="300"></canvas></div>
<p id="out" class="dica"></p>
<div class="controles">
<label>Ângulo <input id="ang" type="range" min="0" max="6.28" step="0.01" value="0.4"></label>
<label>Escala <input id="esc" type="range" min="0.4" max="2" step="0.05" value="1.2"></label>
</div>
</main>
<footer>
<p>Conteúdo fictício para estudo local. Não publique dados reais.</p>
</footer>
<script src="app.js"></script>
</body>
</html>
app.js
const canvas=document.getElementById("g"); const ctx=canvas.getContext("2d");
let angle=0.4, scale=1.2;
function apply(x,y){
const c=Math.cos(angle), s=Math.sin(angle);
return {x: scale*(c*x - s*y), y: scale*(s*x + c*y)};
}
function render(){
ctx.fillStyle="#0f1a22"; ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.save(); ctx.translate(240,150);
ctx.strokeStyle="#6ec6c9"; ctx.beginPath();
const pts=[[-40,-40],[40,-40],[40,40],[-40,40]];
pts.forEach((p,i)=>{ const q=apply(p[0],p[1]); if(i===0) ctx.moveTo(q.x,q.y); else ctx.lineTo(q.x,q.y); });
ctx.closePath(); ctx.stroke();
ctx.restore();
}
document.getElementById("ang").oninput=(e)=>{ angle=Number(e.target.value); render(); };
document.getElementById("esc").oninput=(e)=>{ scale=Number(e.target.value); render(); };
render();