[RUBY] Créez une animation dans laquelle les personnages émergent un instant avec la méthode de la dynamique moléculaire

introduction

La méthode de la dynamique moléculaire est utilisée pour déplacer des particules afin de créer une animation dans laquelle des personnages émergent un instant. La méthode de la dynamique moléculaire ne tient pas compte de l'interaction entre les particules.

Plus précisément, je vais faire une telle animation.

Version balistique

b.gif

Version de diffusion

d.gif

La source est ci-dessous.

https://github.com/kaityo256/stringtext

politique

Je vais dessiner des lettres pour le moment. Pour Ruby, il est plus facile d'utiliser Cairo. La méthode est la même que "Comment supprimer le spacon". Si Cairo n'est pas inclus, ajoutez-le.

 sudo gem install cairo

Après cela, dessinez des caractères sur un canevas d'une taille appropriée avec une police appropriée. Est-ce que c'est comme ça pour "Spacon"?

require 'rubygems'
require 'cairo'
format = Cairo::FORMAT_RGB24
width = 400
height = 100
surface = Cairo::ImageSurface.new(format, width, height)
context = Cairo::Context.new(surface)
context.set_source_rgb(0, 0, 0)
context.rectangle(0, 0, width, height)
context.fill
context.set_source_rgb(1, 1, 1)
context.select_font_face('Meiryo')
context.move_to(5,90)
context.font_size = 96 
context.show_text('Spacon')

Maintenant que nous avons rastérisé les caractères, nous allons les extraire comme coordonnées des particules. Vous pouvez savoir s'il y a un point en regardant si la surface.data de la surface extraite par surface = Cairo :: ImageSurface.new est 0.

Notez que surface.data est String, donc vous devez lire ʻord` pour le comparer avec un entier. C'est comme ça.

  height.times do |y|
    width.times do |x|
      i = x + y * width
      next if surface.data[i*4].ord ==0
      #Traitement supplémentaire des particules
    end
  end

Une fois que vous avez extrait les coordonnées des particules, vous pouvez en faire ce que vous voulez.

Simulation de la dynamique moléculaire

Version balistique

Tout d'abord, faisons simplement bouger toutes les particules dans un mouvement linéaire à vitesse constante. Je veux faire une boucle lorsque je crée un GIF animé, donc je veux que vous reveniez à l'endroit d'origine après une étape appropriée.

Prenons une image d'une hauteur de 100 et d'une largeur de 400 pixels. L'animation est de 200 images. Compte tenu de la condition aux limites périodique, en 200 étapes, la coordonnée x est 400 et la coordonnée y est un multiple entier de 100, et l'emplacement d'origine est restauré.

Alors, sélectionnons au hasard la vitesse vx dans la direction x parmi 4 types: -4, -2, 2, 4. De plus, la coordonnée y sera sélectionnée au hasard parmi huit types: -2, -1,5, -1,0, -0,5, 0,5, 1,0, 1,5, 2,0. Lorsque les deux sont multipliés par 200, la coordonnée x devient un multiple entier de 400 et la coordonnée y devient un multiple entier de 100, de sorte que l'emplacement d'origine est restauré. Aussi, changeons la couleur au hasard. Créons une structure Particle et créons-en un tableau.

Particle = Struct.new(:x, :y, :vx, :vy, :r, :g, :b)
  height.times do |y|
    width.times do |x|
      i = x + y * width
      next if surface.data[i*4].ord ==0

      vx = [-1, 1, -2, 2].sample
      vy = [-1, 1, -0.5, 0.5, -0.25, 0.25, 0.75, -0.75].sample
      r = rand
      g = rand
      b = rand
      atoms.push Particle.new(x, y, vx, vy, r, g, b)
    end
  end

Au début, le mot «Spacon» s'affiche.

img107.png

Cela s'effondrera progressivement.

img109.png

img111.png

Après cela, c'est ennuyeux si vous pouvez voir les caractères depuis le début, donc si vous créez un fichier avec un léger décalage d'index, vous avez terminé.

iter = 200
iter.times do |i|
  index = (i + 108) % iter
  filename = format("img%03d.png ", index)
  puts filename
  step(atoms)
  save_png(filename, atoms)
end

À propos, cette méthode est facile, mais comme toutes les particules ont un mouvement linéaire à vitesse constante et qu'il y a peu de variations dans le vecteur de vitesse, des motifs étranges apparaîtront plusieurs fois. Par exemple, selon le timing, vous pouvez trouver que "Oh, les personnages sont cachés" comme ça.

img006.png

Pour éviter cela, envisagez une méthode différente.

Version de diffusion

J'ai fait un mouvement linéaire à vitesse constante plus tôt, mais ensuite faisons une marche aléatoire. Cependant, nous voulons faire une boucle, alors créons un tableau où la somme des éléments est 0 et en faisons la vitesse de chaque étape.

Tout va bien, mais faisons simplement un tableau qui est moitié -2 et moitié 2 et mélangeons-le.

steps = 200
$a = Array.new(steps) do |i|
  if i < steps/2
    2
  else
    -2
  end
end

Mélangez et transmettez ce tableau aux tableaux "vx" et "vy" de chaque particule.

  height.times do |y|
    width.times do |x|
      i = x + y * width
      next if surface.data[i*4].ord ==0

      vx = $a.shuffle.dup
      vy = $a.shuffle.dup
      r = rand
      g = rand
      b = rand
      atoms.push Particle.new(x, y, vx, vy, r, g, b)
    end
  end

Tout ce que vous avez à faire est d'ajouter vx [i], vy [i] à x, y à chaque étape. La somme de vx et vy est nulle, donc elle reviendra toujours.

Au début, le mot «Spacon» est affiché, et c'est pareil qu'il s'effondre progressivement.

img107.png

Cela s'effondrera progressivement.

img109.png

img111.png

La façon dont il s'effondre est plus lente que le mouvement linéaire à vitesse constante. De plus, comme il se propage en se propageant, même dans l'état le plus répandu, les caractères flous sont toujours visibles.

img006.png

Résumé

J'ai essayé de créer un GIF animé dans lequel les personnages apparaissent un instant par la méthode de la dynamique moléculaire. C'est un secret pourquoi j'ai décidé de faire quelque chose comme ça.

Si vous le concevez, les personnages apparaîtront les uns après les autres et deviendront un message, alors jouez avec.

Recommended Posts

Créez une animation dans laquelle les personnages émergent un instant avec la méthode de la dynamique moléculaire
Créer un outil pour l'identification des noms dans Salesforce
Créer un environnement pour Tomcat et Postgres sur Chromebook sans utiliser le mode développeur
J'ai essayé d'utiliser l'instruction Extended for en Java
Un mémorandum pour créer un enregistreur étendu à l'aide de org.slf4j.Logger
Créez une base pour votre projet de traitement par lots dans Eclipse.
Procédure de publication d'une application à l'aide d'AWS (4) Création d'une base de données
Créer un code QR pour Google Authenticator à l'aide de ZXing en Java