1
resposta

Uma boa solução, merece repetição! Um salve para o colega Lucas Ihara Alves (18.4k xp, 2 posts)

O colega Lucas me atentou para o cálculo preciso para a definição do alvo. Basicamente o instrutor apresentou uma solução aproximada para o problema (quadrado). O erro da pseudo-solução apresentada, vai ficando crítico, à medida em que o raio aumenta. Mais informações, podem ser encontradas no post original.

Fiz alguns melhoramentos no código original, colocando variáveis para tornar o código mais "automático" e aumentando os "anéis". Compartilho os trechos principais com vocês.

    var raio = 40;
    var Cx = 300;
    var Cy = 200;

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

        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        pincel.fill();
    }
//desenhando o alvo com círculos concentricos
    desenhaCirculo(Cx,Cy, 5*raio, 'red');
    desenhaCirculo(Cx,Cy, 4*raio, 'white');
    desenhaCirculo(Cx,Cy, 3*raio, 'red'); 
    desenhaCirculo(Cx,Cy, 2*raio, 'white');
    desenhaCirculo(Cx,Cy, raio, 'red');

    function dispara(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        console.log(x + ',' + y);
/* esta pseudo solução é só uma aproximação, que fica pior à medida que o raio aumenta. vide prefácio ao fim do código
        if ((x >= Cx - raio)  && (x <= Cx + raio) && (y >= Cy - raio) && (y <= Cy + raio)){
            alert("Parabéns, acertou o alvo!'");
        }
exemplos de cliques aceitos indevidamente no alvo central de raio 40: alvo.html:33 331,166; 267,165; 260,223; 334,226
*/
//solução precisa

        if (Math.sqrt((Cx - x)*(Cx - x) + (Cy - y)*(Cy - y)) <= raio) {
            alert('Acertou o alvo!');
        }
    }

Seria mais honesto ter apresentado a pseudo-solução como uma aproximação e comentar brevemente que existe um cálculo preciso, não precisaria nem implementá-la. Ainda bem que temos colegas atentos.

1 resposta

Fala, Raphael! Tudo bom contigo?

Bacana demais!!!

Além das aulas, os conteúdos do fórum com suas discussões enriquecem demais!!!

Muito obrigado por compartilhar sua lógica conosco! O toque do Lucas também é perfeito!

Obrigado por compartilhar conhecimento conosco!

Um abraço e bons estudos