Implementando o movimento livre de partículas no ReactJS

Saudações! Quero mostrar uma das maneiras de como realizar o livre movimento de partículas no intervalo especificado. Usarei o ReactJS para concluir esta tarefa. Mas o próprio algoritmo ainda será geral e você poderá usá-lo em qualquer lugar.

imagem

No final do artigo, criaremos uma coisa dessas com você.

Caminho errado


A primeira coisa que vem à mente para resolver esse problema é simplesmente aleatorizar X e Y. Vamos ver o que acontece.


Aqui, simplesmente randomizamos o turno a cada segundo no intervalo de -50 a 50 em X e em Y:

Math.random() * 100 - 50 

E a transição é suave usando a propriedade de transição css:

 transition: transform 1s linear; 

Como você pode ver, o resultado não é exatamente o que queríamos. Obviamente, você pode configurá-lo para que a mudança seja adicionada a uma posição existente, e será mais parecida com a verdade. Mas ainda assim, precisamos seguir um caminho um pouco diferente.

Caminho certo


O método anterior parece tão torto por vários motivos:

  1. Na realidade, uma partícula não pode mudar de direção tão abruptamente.
  2. Partículas para cada período de tempo devem passar uma certa distância

E isso sugere que precisamos aleatoriamente exatamente a direção na qual a partícula se moverá, e em um certo intervalo de graus, para que não haja curvas acentuadas. Então, vamos resolver o primeiro problema.

E para resolver o segundo problema, indicaremos antecipadamente o passo pelo qual a partícula precisa ser deslocada ao longo do intervalo de tempo.

Agora você precisa se lembrar do curso básico de trigonometria. Sabemos o comprimento l ângulo deg . Precisa encontrar X e Y

imagem

pecado é a razão do lado oposto à hipotenusa.
cos é a razão do lado para a hipotenusa.

Temos as seguintes fórmulas para calcular:

 x = cos(deg) * l y = sin(deg) * l 

Mas há uma coisa. No javaScript, Math.sin assume um ângulo em radianos (um valor de -1 a 1 ). Portanto, antes de lançar um canto, você deve primeiro convertê-lo em radianos.

 deg() = deg() * Pi / 180 

Escrevemos uma função que receberá um ângulo na entrada e a distância pela qual a partícula precisa ser deslocada. E a função { x, y } com nossos valores para o turno retornará a função.

 function getShift(deg, step) { return { x: +(Math.cos(deg * Math.PI / 180) * step).toFixed(), y: +(Math.sin(deg * Math.PI / 180) * step).toFixed(), }; }; 

Testaremos o que nossa função produzirá. Suponha que movamos a partícula 10px cada vez. Vamos ver o que o getShift retorna para diferentes ângulos.

imagem

 getShift(30, 10); // {x: 9, y: 5} getShift(90, 10); // {x: 0, y: 10} getShift(135, 10); // {x: -7, y: 7} getShift(210, 10); // {x: -9, y: -5} getShift(-30, 10); // {x: 9, y: -5} 

Bem, ao que parece, você concorda?

Agora tente consertar nosso primeiro aplicativo por escrito.


Já não é ruim! Resta perceber a estrutura além da qual a partícula não será capaz de voar. Desde agora, provavelmente depois de algum tempo, o círculo azul voará para fora da tela.

Para criar a estrutura, você precisará adicionar uma nova constante. E também adicione uma condição. É aqui que o loop while funciona para nós. Se houver uma restrição no caminho, giraremos a esquina até a curva do quadro.

Para maior clareza, adicione um quadrado amarelo, além do qual o círculo não será capaz de voar. Aqui está o que aconteceu:


Nosso algoritmo está completamente pronto para uso. O próximo passo é implementar esse algoritmo no ReactJS usando seus recursos.

Portando o algoritmo para o ReactJS


Ao portar nosso aplicativo para o ReactJS, definiremos as seguintes tarefas:

  1. Crie um MovingPart wrapper MovingPart no qual você possa lançar qualquer coisa.
  2. No estado, armazenaremos os valores de X e Y, pois somente eles são necessários para redesenhar o componente.
  3. Lá fora, um componente será lançado em um intervalo, uma borda além da qual é impossível avançar e a etapa pela qual o elemento será deslocado em um intervalo de tempo.
  4. Vamos desenhar um pouco de beleza com vários componentes do MovingPart , a fim de imaginar onde ele pode ser aplicado na vida real.

Como resultado, obtemos o seguinte exemplo:


Vamos pegar os dados iniciais da matriz de data .

Depois disso, descrevemos o componente MovingPart :

  • O intervalo (intervalo), a distância (distância) e a mudança em um passo (passo) saímos dos adereços;
  • A rotação máxima durante o movimento (maxRotate) e o ângulo de deslocamento atual (deg) são determinados dentro do elemento;
  • Os valores x e y são levados para o estado do componente;
  • O método getShift é definido como o método interno do componente.

Depois disso, usando o loop de map , renderize todos os elementos, agrupando-os com nosso componente MovingPart criado.

Obrigado pela atenção! Este foi meu primeiro artigo sobre Habré, espero que seja útil. Experimente, experimente.

Source: https://habr.com/ru/post/pt440874/


All Articles