If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Tradução

Quando você cria um programa usando ProcessingJS, a saída é desenhada em uma tela que funciona como um pedaço de papel quadriculado. Para desenhar uma forma, você especifica as coordenadas nesse papel quadriculado.
Como exemplo, temos aqui um retângulo simples desenhado com o código rect(20, 20, 40, 40). O sistema de coordenadas (uma expressão mais chique para descrever o "papel quadriculado") é mostrado em cinza, e para manter as imagens do nosso exemplo menores, o sistema de coordenadas mostrado tem 200x200 pixels, (ao invés do tamanho padrão, 400x400). Aqui você pode ver que o retângulo está em x=20, y=20, com largura e altura 40:
Quadrado na tela
Se você quiser mover o retângulo 60 unidades para a direita e 80 unidades para baixo, você pode simplesmente alterar as coordenadas, adicionando aos valores de x e y iniciais: rect(20 + 60, 20 + 80, 40, 40) e o retângulo vai aparecer em um lugar diferente. (Colocamos a seta ali apenas como efeito de ilustração).
Quadrado na nova posição no sistema de coordenadas
Mas há uma maneira mais interessante de fazer isso: mover o papel quadriculado. Se você mover o papel quadriculado 60 unidades para a direita e 80 unidades para baixo, você vai ter exatamente o mesmo resultado visual. Moving the coordinate system is called translation.
Movendo o papel quadriculado
O importante para se notar no diagrama anterior é que, considerando a posição do retângulo no sistema, ele não se mexeu. Seu canto superior esquerdo ainda está em (20,20). Quando você usa transformações, as formas que você desenha nunca alteram de posição; o sistema de coordenadas sim.
Aqui temos um programa que desenha o retângulo original, e então o desenha em vermelho na nova posição mudando suas coordenadas, e depois o desenha em azul na nova posição, mas movendo o sistema de coordenadas (usando translate()). As cores de preenchimento são translúcidas para que você possa ver que o azul e o vermelho se sobrepõem para formar um quadrado roxo que está virtualmente no mesmo lugar. Apenas o método usado para movê-los mudou. Mexa com os números abaixo para ver com seus próprios olhos:
Vamos olhar para o código da translação de forma mais detalhada. pushMatrix() é uma função nativa que salva a posição atual do sistema de coordenadas. translate(60, 80) move o sistema de coordenadas 60 unidade para a direita e 80 unidades para baixo. rect(20, 20, 40, 40) desenha o retângulo no mesmo lugar que ele originalmente desenhava. Lembre-se, as coisas que você desenha não se movem — ao invés disso, o sistema de coordenadas se move. Por fim, popMatrix() restaura o sistema de coordenadas para o lugar que ele estava antes de você realizar a translação.
Por que usar pushMatrix() e popMatrix()? Você poderia ter feito um translate(-60, -80) para mover o sistema de volta para sua posição original. Contudo, quando você começa a fazer operações mais sofisticadas com o sistema de coordenadas, é mais fácil usar pushMatrix() e popMatrix() para salvar e restaurar os status ao invés de ter que desfazer todas as suas operações. Mais pra frente nessa seção, você vai descobrir por que essas funções parecem ter nomes tão estranhos.

Qual é a vantagem?

Você pode estar pensando que pegar o sistema de coordenadas e movê-lo dá muito mais trabalho do que simplesmente adicionar às coordenadas. Para um exemplo simples como o retângulo, você está certo. Mas vamos pegar um exemplo onde translate() pode facilitar bastante nossa vida.
Aqui temos um programa que desenha várias casas. Ele usa um laço que chama uma função chamada drawHouse(), que pega as posições de x e y do canto superior esquerdo da casa como parâmetros. Observe que a função drawHouse tem que fazer várias manipulações de parâmetro para desenhar a casa nas coordenadas dadas:
E se usássemos a função translate() ao invés de calcular as novas coordenadas? Nesse caso, o código desenha a casa no mesmo lugar toda vez, com seu canto superior esquerdo em (0, 0), e deixa que a translação faça todo o trabalho.
Isso não significa que você deve usar sempre translate() ao invés de calcular novas coordenadas. Como tantas outras coisas que ensinamos, essa é outra ferramenta em sua caixa de ferramentas, e você deve descobrir quando faz sentido usar essa nova ferramenta translate().

Esse artigo é ma adaptação de Transformações 2D, de J David Eisenberg, usado sob uma licença Creative Commons Attribution-NonCommercial-ShareAlike.

Quer participar da conversa?

  • Avatar spunky sam blue style do usuário Diego Pinheiro
    O desafio a seguir pede um loop:

    for (var i=0; i<=400; i+=95){
    pushMatrix();
    translate(i+95, -11);
    drawFlower(60,60);
    popMatrix();
    }

    No lugar de 400 ele pede uma variável global de largura, para que o programa funcione em todos os dispositivos. Mas eu não sei qual é essa variável. Por favor, alguém pode me ajudar?
    (4 votos)
    Avatar Default Khan Academy avatar do usuário
  • Avatar leaf blue style do usuário Richard Henrique
    como faço para saber todas as cordenadas?
    (3 votos)
    Avatar Default Khan Academy avatar do usuário
  • Avatar leaf blue style do usuário carlosdjn27
    terminei o desafio translação mas as flores não aparecem porque?
    (2 votos)
    Avatar Default Khan Academy avatar do usuário
  • Avatar purple pi purple style do usuário João Vitor Mancio
    eu fiz tudo certo no desafio: translaçao, mas aparece a seguinte mensagem:
    It looks like you're using a number to represent the width of the screen. We recommend using the global variable width to represent the width of the screen. That way, your program will work no matter what size the screen is! eu sei oq isso significa mas oq ele quer q eu faça??
    (1 voto)
    Avatar Default Khan Academy avatar do usuário
  • Avatar blobby purple style do usuário melmorandi
    Não consigo passar dessa fase "Desafio: salvação de tradução"

    var drawLevel = function(){
    var babyWinston =getImage("creatures/BabyWinston");
    var enemybug = getImage("cute/EnemyBug");
    noStroke();
    var roomMatrix = [[1,2,1,1,1,2,1,1],
    [0,0,1,1,1,0,0,0],
    [1,0,1,1,1,0,1,1],
    [1,0,0,0,0,0,1,1],
    [1,1,0,0,0,0,1,1],
    [2,0,0,0,0,0,0,0],
    [1,0,1,1,1,0,1,0],
    [1,0,1,1,1,0,0,2]];
    for(var row=0; row<roomMatrix.length; row++) {
    for(var col=0; col<roomMatrix[row].length; col++) {
    var id = roomMatrix[row][col];
    switch(id) {
    case 0:
    fill(100, 150, 175);
    rect(col*50,row*50,50,50);
    break;
    case 1:
    fill(100,100, 100);
    rect(col*50,row*50,50,50);
    break;
    case 2:
    fill(100, 150,175);
    rect(col*50,row*50,50,50);
    pushMatrix();
    scale(0.5);
    image(enemybug,col*2*50,-55+row*2*50);
    popMatrix();
    break;
    }
    }
    }

    pushMatrix();
    scale(0.75);
    image(babyWinston,150,250);
    popMatrix();
    };

    var drawRock1 = function(){
    var rock = getImage("cute/Rock");
    var numberone = getImage("space/1");
    pushMatrix();
    scale(0.5);
    image(rock,0,40);
    popMatrix();
    pushMatrix();
    scale(0.25);
    image(numberone,60,240);
    popMatrix();
    };

    var drawRock2 = function(){
    var rock = getImage("cute/Rock");
    var numbertwo = getImage("space/2");
    pushMatrix();
    scale(0.5);
    image(rock,700,40);
    popMatrix();
    pushMatrix();
    scale(0.25);
    image(numbertwo,1460,240);
    popMatrix();
    };

    var drawRock3 = function(){
    var rock = getImage("cute/Rock");
    var numberthree = getImage("space/3");
    pushMatrix();
    scale(0.5);
    image(rock,100,640);
    popMatrix();
    pushMatrix();
    scale(0.25);
    image(numberthree,260,1440);
    popMatrix();
    };

    var drawRock4 = function(){
    var rock = getImage("cute/Rock");
    var numberfour = getImage("space/4");
    pushMatrix();
    scale(0.5);
    image(rock,400,240);
    popMatrix();
    pushMatrix();
    scale(0.25);
    image(numberfour,860,640);
    popMatrix();
    };

    // Draw Level
    drawLevel();

    // Draw Rock #1
    drawRock1();

    // Draw Rock #2
    drawRock2();

    // Draw Rock #3
    drawRock3();

    // Draw Rock #4
    drawRock4();

    COMO eu FAÇO isso?
    (1 voto)
    Avatar Default Khan Academy avatar do usuário
  • Avatar leafers seed style do usuário Michael Majid
    for( var i=0; i<=width; i+=66)
    porque ainda fala que está errado minha primeira lição ?
    (1 voto)
    Avatar Default Khan Academy avatar do usuário
  • Avatar piceratops seed style do usuário Victor Russo
    No próximo desafio, fica pedindo para eu troca i=1+_ por i+=i, mas eu já fiz isso e de nada adianta.
    (1 voto)
    Avatar Default Khan Academy avatar do usuário
  • Avatar duskpin sapling style do usuário luizamalheiros
    como eu faria para desenhar várias vezes a mesma figura?
    (1 voto)
    Avatar Default Khan Academy avatar do usuário
  • Avatar male robot donald style do usuário Luiz Fernando de Oliveira Correa
    Mesmo com o exemplo das casas, o translate() teve mais linhas do que o outro método...
    (0 votos)
    Avatar Default Khan Academy avatar do usuário
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.