Implémentation du mouvement des particules libres sur ReactJS

Salutations! Je veux vous montrer une des façons de réaliser la libre circulation des particules dans la plage spécifiée. J'utiliserai ReactJS pour terminer cette tâche. Mais l'algorithme lui-même sera toujours général, et vous pouvez l'utiliser n'importe où.

image

À la fin de l'article, nous créerons une telle chose avec vous.

Mauvaise façon


La première chose qui vient à l'esprit pour résoudre ce problème est simplement de randomiser X et Y. Voyons ce qui se passe.


Ici, nous randomisons simplement le décalage chaque seconde dans la plage de -50 à 50 en X et en Y:

Math.random() * 100 - 50 

Et la transition est fluide en utilisant la propriété de transition css:

 transition: transform 1s linear; 

Comme vous pouvez le voir, le résultat n'est pas tout à fait ce que nous voulions. Bien sûr, vous pouvez le configurer pour que le décalage soit ajouté à une position existante, alors ce sera plus comme la vérité. Mais encore, nous devons aller un peu différemment.

Bon chemin


La méthode précédente semble si tordue pour plusieurs raisons:

  1. En réalité, une particule ne peut pas changer sa direction si brusquement.
  2. Les particules pour chaque période doivent passer une certaine distance

Et cela suggère que vous devez randomiser exactement la direction dans laquelle la particule se déplacera, et dans une certaine plage de degrés, afin qu'il n'y ait pas de virages serrés. Nous allons donc résoudre le premier problème.

Et pour résoudre le deuxième problème, nous indiquerons à l'avance l'étape par laquelle la particule doit être décalée dans l'intervalle de temps.

Maintenant, vous devez vous rappeler le cours de base de la trigonométrie. On connaît la longueur l et l'angle deg . Besoin de trouver X et Y

image

le péché est le rapport du côté opposé à l'hypoténuse.
cos est le rapport du côté à l'hypoténuse.

Nous obtenons les formules suivantes pour le calcul:

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

Mais il y a une chose. En javaScript, Math.sin prend un angle en radians (une valeur de -1 à 1 ). Par conséquent, avant de lancer un coin, vous devez d'abord le convertir en radians.

 deg() = deg() * Pi / 180 

Nous écrivons une fonction qui recevra un angle à l'entrée et la distance sur laquelle la particule doit être décalée. Et la fonction { x, y } avec nos valeurs pour le décalage renverra la fonction.

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

Nous testerons la sortie de notre fonction. Supposons que nous déplaçons la particule de 10 10px chaque fois. Voyons ce que getShift renvoie pour différents angles.

image

 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} 

Eh bien, il semble que tu sois d'accord?

Essayez maintenant de corriger notre première application écrite.


Déjà pas mal! Reste à réaliser le cadre au-delà duquel la particule ne pourra pas s'envoler. Depuis maintenant, très probablement après un certain temps, le cercle bleu s'envolera de l'écran.

Afin de créer le cadre, vous devrez ajouter une nouvelle constante. Et ajoutez également une condition. C'est là que la boucle while fonctionne pour nous. S'il y a une restriction sur le chemin, alors nous tournerons le coin jusqu'au virage du cadre.

Pour plus de clarté, ajoutez un carré jaune, au-delà duquel le cercle ne pourra pas voler. Voici ce qui s'est passé:


Notre algorithme est complètement prêt à l'emploi. L'étape suivante consiste à implémenter cet algorithme sur ReactJS en utilisant ses capacités.

Portage de l'algorithme sur ReactJS


Lors du portage de notre application vers ReactJS, nous nous fixerons les tâches suivantes:

  1. Créez un MovingPart wrapper MovingPart dans lequel vous pouvez lancer n'importe quoi.
  2. En l'état, nous allons stocker les valeurs de X et Y, car seules elles sont nécessaires pour redessiner le composant.
  3. À l'extérieur, un composant sera jeté dans un intervalle, une limite au-delà de laquelle il est impossible de passer, et une étape par laquelle l'élément sera déplacé dans un intervalle de temps.
  4. MovingPart un peu de joliesse avec plusieurs composants de MovingPart , afin d'imaginer approximativement où il peut être appliqué dans la vie réelle

Par conséquent, nous obtenons l'exemple suivant:


Nous prendrons les données initiales du tableau de data .

Après cela, nous décrivons le composant MovingPart :

  • L'intervalle (intervalle), la distance (distance) et le décalage en une seule étape (étape) nous sortons des accessoires;
  • La rotation maximale pendant le mouvement (maxRotate) et l'angle de décalage actuel (deg) sont déterminés à l'intérieur de l'élément;
  • Les valeurs de x et y sont prises à l'état du composant;
  • La méthode getShift est définie comme la méthode interne du composant.

Après cela, en utilisant la boucle de map , rendez tous les éléments, en les enveloppant avec notre composant MovingPart créé.

Merci de votre attention! C'était mon premier article sur Habré, j'espère qu'il vous sera utile. Essayez-le, expérimentez.

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


All Articles