2
respostas

Acerta o alvo - aumentando a precisão

Se vcs perceberem após concluir o código. Dando um zoom o programa dispara mesmo quando você erra. Basta vc imaginar um quadrado ao redor do circulo do centro e clicar nos cantos. Isso acontece pq a região delimitada pelos "Ifs" é um quadrado.

Fiz uma pesquisa breve na net de como determinar se um ponto pertence (ou não pertence) a uma circunferência. Cheguei a formula da "Equação reduzida da reta". Parece uma coisa feia mas é apenas um pitagoras basicão onde temos todos os dados.

Aplicando isso no código aumenta-se a precisão sendo que o alerta só dispara mesmo dentro do centro do alvo. Segue programa

<!DOCTYPE html>
<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);

    var raio = 10;

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

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

    desenhaCirculo(300,200, raio + 20, 'red'); // maior círculo
    desenhaCirculo(300,200, raio + 10, 'white');
    desenhaCirculo(300,200, raio, 'red'); // menor circulo

    function dispara(evento) {

        var a = evento.pageX - tela.offsetLeft;
        var b = evento.pageY - tela.offsetTop;

        var distancia=((300-a)*(300-a))+((200-b)*(200-b));
        /*Equação reduzida da reta (x-a)²+(y-b)²=r² onde x,y 
        são as coordenadas do centro do circulo e a,b são as 
        coordenadas dos pontos a serem analisados. 
        Aplicando o bom e velho pitagoras temos que a soma 
        dos quadrados das distancias devem ser menor ou igual 
        ao quadrado do raio. Então, nesse caso, se var distancia 
        é menor ou igual ao raio ao quadrado o ponto gerado 
        em evento está contido dentro do centro do alvo. 
        Dessa forma aumenta a precisão do programa e também 
        elimina os vários ifs */


        if (distancia<=(raio*raio)){
            alert('Acertou Miseravi!');
        }
    }
    desenhaCirculo(300,200, raio + 20, 'red'); // maior círculo
    desenhaCirculo(300,200, raio + 10, 'white');
    desenhaCirculo(300,200, raio, 'red'); // menor circulo

    tela.onclick = dispara;

</script>
2 respostas

Equação reduzida circunferência (leia-se)

Olá, Fernando! Tudo bem?

Parabéns pelo seu empenho, sua solução ficou excelente!

Caso tenha alguma dúvida não deixe de compartilhar com a gente.

Continue praticando, bons estudos e até mais.