Bounce Back pt-br Explainer

Explicação de Rebote

Objetivo deste desafio: Mudar a função de aceleração para fazer a ball fazer rebote em vez de cair.

Passo a passo da solução: Quando um atributo é alterado, fica claro como será o início e o fim, mas não fica claro como devem ser todas as etapas intermediárias.

Se você desenhasse 2 pontos em um pedaço de papel e lhe dissessem para conectá-los, como você poderia fazer isso? Uma linha reta. Mas também uma linha ondulada, ou que tal um caminho que atravessa o ponto de chegada algumas vezes até finalmente aterrissar de vez? O caminho do início ao fim de uma transição é determinado por sua função de aceleração.

Para definir a aceleração, você usa .ease() e anexa à .transition() (ou uma das outras chamadas anexadas à .transition()). O valor que fica entre parênteses é na verdade uma função, mas pode-se pensar nela como um caminho com início e fim. A biblioteca d3 tem algumas funções integradas que você pode usar, como easeQuad e easeBack. Para acessar essas funções, você usa d3.easeQuad e d3.easeBack.

Há uma chamada de função easeBounce que faz com que o caminho pareça uma bola que salta. Vai do início ao fim, depois volta até o meio caminho, depois até o fim, depois volta apenas um pouco, depois volta até o fim, e assim por diante. Para aplicar este efeito de rebote à transição de ball, você usa .ease(d3.easeBounce)

Solução do código de exemplo:
(Toque abaixo para revelar)

function bounce() {
  ball.transition().duration(1000).ease(d3.easeBounce).attr('cy', 175);
}
ball.on('click', bounce);

Conceitos de JavaScript: Bloco de código (função)

Conceitos de D3: .attr('cy',), .duration(), .ease(), .on('click',...), .transition()
Código Adicional (código oculto executado antes do código do desafio):
[detalhes]

svg.append('rect').attr('width',window.innerWidth).attr('height',window.innerHeight-225).attr('y',225).attr('fill','maroon');

let ball = svg.append('circle')
                .attr('r',50)
                .attr('cx',window.innerWidth/2)
                .attr('cy',50)
                .attr('fill',`hsl(${pickRandom(360)},100%,50%)`);
                

[/details]