Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Um loop está interferindo no outro. Por que?

Tenho dois loops para desenhar o gráfico de barras mas ao meu ver, o 2º loop está considerando o valor final da variável "y" no 1º loop, quando ocorreto seria iniciar a variável "y" =20. O que estou errando?

<canvas id="qqNome" width="600" height="500"></canvas>

<script>

    /*
        Em 2015: 50% Chrome, 25% Firefox, 20% Safari, 5% Outros (Opera, IE, etc).
        Em 2016: 65% Chrome, 20% Firefox, 13% Safari, 2% Outros (Opera, IE, Edge, etc).
    */

    function desenhaTexto(x,y,texto){
        var tela = document.querySelector('canvas');
        var pincel = tela.getContext('2d');

        pincel.font = '15px Georgia';
        pincel.fillStyle = 'black';
        pincel.fillText(texto,x,y);
    }

    function desenhaRetangulos(x,y,largura,altura,cor){
        var tela = document.querySelector('canvas');
        var pincel = tela.getContext('2d');

        pincel.fillStyle = cor;
        pincel.fillRect(x,y,largura,altura);
        pincel.strokeStyle = 'black';
        pincel.strokeRect(x,y,largura,altura);
    }

    var serie15 = [50*2,25*2,20*2,5*2];
    var serie16 = [65*2,20*2,13*2,2*2];
    var cores = ['blue','green','yellow','red'];

    var x = 0;
    var y = 20;

    for(var i = 0; i <= 3; i++){
        desenhaRetangulos(x,y,75,serie15[i],cores[i]);    
        y = y + serie15[i];    
    }

    for(var i = 0; i <= 3; i++){
        desenhaRetangulos(x + 125,y,75,serie16[i],cores[i]);    
        y = y + serie16[i];
    }

    desenhaTexto(20,15,'2015');

    desenhaTexto(145,15,'2016');
2 respostas
solução!

Olá Marcio,

o problema é exatamente o que você mesmo comentou que no segundo loop ele considera o valor final depois que ele executa o primeiro loop. Vamos olhar este trecho de código:

   var x = 0;
    var y = 20;

    for(var i = 0; i <= 3; i++){
        desenhaRetangulos(x,y,75,serie15[i],cores[i]);    
        y = y + serie15[i];    
    }

    for(var i = 0; i <= 3; i++){
        desenhaRetangulos(x + 125,y,75,serie16[i],cores[i]);    
        y = y + serie16[i];
    }

Note que sua variável y é criada lá em cima com valor 20. Depois, esta variável sofre várias alterações de valor dentro do seu primeiro for na linha y = y + serie15[i];. Tanto que se você acrescentar um console.log(y) entre os dois fors, notará que antes de executar o segundo for o valor de y é 220.

Então para corrigir este problema, você pode antes do segundo for atribuir novamente o valor 20 em y ou então criar uma terceira variável, por exemplo z, com valor 20 e usá-la para trabalhar com o segundo for no lugar do y.

Olá Marcio,

ao meu ver é porque você cria a variável y antes do primeiro for e não "reseta" ela para 20 quando acaba de usá-la no primeiro for, quando o segundo for vai usar a variável y o valor já está diferente de 20.

Att,