Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Alguma sugestão para tornar o algoritmo mais enxuto?

O algoritmo funcionou perfeitamente, mas sinto que ficou meio exaustivo e possivelmente pode ser simplificado por meio de algumas mudanças. Alguma sugestão?

<canvas width="600" height="400"></canvas>

<script>

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'lightgray';
    pincel.fillRect(0, 0, 600, 400);

    function desenhaCirculo(x, y, raio, cor) {

        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        pincel.fill();
    }

    function limpaTela() {

        pincel.clearRect(0, 0, 600, 400);
    }

    var raio = 20;
    var cresceu = false;

    function atualizaTela(){

        limpaTela()

        if(((raio >= 20) && (raio < 30)) && (cresceu == false)){

            desenhaCirculo(100, 100, raio, "blue");
            raio++;

        }else if(raio == 30){

            cresceu = true;
        }

        if(cresceu){

            desenhaCirculo(100, 100, raio, "blue");
            raio--;
        }

        if(raio < 20){

            cresceu = false;
            raio = 20;
        }
    }

    setInterval(atualizaTela, 20);

</script>
1 resposta
solução!

Oi Edson, boa noite!

Tanto dentro do primeiro if quanto dentro do if(cresceu), você escreve exatamente a mesma linha de código, chamando a função desenhaCirculo passando os mesmos parâmetros. A ideia do exercício, na verdade, é justamente toda vez que atualizar a tela, a cada 20s, redesenhar o círculo. Ou seja, podemos pensar que vamos chamar pra qualquer situação (sempre) a função desenhaCirculo() dentro da função atualizaTela().

A única coisa que vai mudar na chamada da função desenhaCirculo() é o valor do raio, que vai ser definido com base nas verificações. E, pra ter menos verificações, dá pra pensar apenas em que situação você que alterar o raio subindo em 1 e em que situação você que alterar o raio decrescendo em 1.

Pra deixar mais organizado, dá pra deixar o cálculo do novo raio no começo da função atualizaTela() e no final dessa função só fazer a chamada pra função desenhaCirculo(100, 100, raio, "blue"), com o raio já com o valor novo.

Se quiser ver um código mais enxuto e bem explicado, o instrutor já fez isso! :) Dá pra ver o código clicando no botão VER OPINIÃO DO INSTRUTOR na página do exercício. :)

Mas se quiser mais alguma dica ou tirar mais dúvidas sobre seu código, só perguntar!