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
Version de diffusion
La source est ci-dessous.
https://github.com/kaityo256/stringtext
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.
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.
Cela s'effondrera progressivement.
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.
Pour éviter cela, envisagez une méthode différente.
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.
Cela s'effondrera progressivement.
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.
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