Erstellen Sie eine Animation, in der Zeichen für einen Moment erscheinen, indem Sie Partikel mithilfe der molekulardynamischen Methode bewegen. Die molekulardynamische Methode berücksichtigt nicht die Wechselwirkung zwischen Partikeln.
Insbesondere werde ich eine solche Animation machen.
Ballistische Version
Diffusionsversion
Die Quelle ist unten.
https://github.com/kaityo256/stringtext
Ich werde vorerst Briefe zeichnen. Für Ruby ist es einfacher, Kairo zu verwenden. Die Methode ist dieselbe wie "So lassen Sie den Spacon fallen". Wenn Kairo nicht enthalten ist, fügen Sie es hinzu.
sudo gem install cairo
Zeichnen Sie danach Zeichen auf eine Leinwand mit einer geeigneten Größe und einer geeigneten Schriftart. Ist es so für "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')
Nachdem wir die Zeichen gerastert haben, werden wir sie als Koordinaten der Partikel extrahieren. Sie können herausfinden, ob es einen Punkt gibt, indem Sie prüfen, ob die mit "surface = Cairo :: ImageSurface.new" extrahierten "surface.data" der "surface" 0 sind.
Beachten Sie, dass surface.data`` String
ist. Sie müssen also ord
lesen, um es mit einer Ganzzahl zu vergleichen. Es ist so.
height.times do |y|
width.times do |x|
i = x + y * width
next if surface.data[i*4].ord ==0
#Zusätzliche Verarbeitung von Partikeln
end
end
Sobald Sie die Koordinaten der Partikel extrahiert haben, können Sie damit machen, was Sie wollen.
Lassen Sie uns zunächst einfach alle Partikel in einer linearen Bewegung mit konstanter Geschwindigkeit bewegen. Ich möchte eine Schleife erstellen, wenn ich ein animiertes GIF erstelle. Daher möchte ich, dass Sie nach einem geeigneten Schritt an den ursprünglichen Ort zurückkehren.
Stellen Sie sich ein Bild mit einer Höhe von 100 und einer Breite von 400 Pixel vor. Die Animation ist 200 Frames. Unter Berücksichtigung der periodischen Randbedingung beträgt die x-Koordinate in 200 Schritten 400 und die y-Koordinate ein ganzzahliges Vielfaches von 100, und die ursprüngliche Position wird wiederhergestellt.
Wählen wir also zufällig die Geschwindigkeit vx in x-Richtung aus 4 Typen aus: -4, -2, 2, 4. Zusätzlich wird die y-Koordinate zufällig aus acht Typen ausgewählt: -2, -1,5, -1,0, -0,5, 0,5, 1,0, 1,5, 2,0. Wenn beide mit 200 multipliziert werden, wird die x-Koordinate zu einem ganzzahligen Vielfachen von 400 und die y-Koordinate zu einem ganzzahligen Vielfachen von 100, sodass die ursprüngliche Position wiederhergestellt wird. Lassen Sie uns auch die Farbe zufällig ändern. Lassen Sie uns eine "Partikel" -Struktur erstellen und ein Array davon erstellen.
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
Zunächst wird das Wort "Spacon" angezeigt.
Dies wird allmählich zusammenbrechen.
Danach ist es langweilig, wenn Sie die Zeichen von Anfang an sehen können. Wenn Sie also eine Datei mit einer leichten Indexverschiebung erstellen, sind Sie fertig.
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
Übrigens ist diese Methode einfach, aber da alle Partikel eine lineare Bewegung mit konstanter Geschwindigkeit haben und es nur wenige Variationen im Geschwindigkeitsvektor gibt, treten mehrmals seltsame Muster auf. Abhängig vom Timing können Sie beispielsweise feststellen, dass "Oh, die Zeichen sind versteckt".
Um dies zu verhindern, ziehen Sie eine andere Methode in Betracht.
Ich habe früher eine lineare Bewegung mit konstanter Geschwindigkeit gemacht, aber als nächstes machen wir einen zufälligen Spaziergang. Wir möchten jedoch eine Schleife erstellen. Erstellen wir also ein Array, in dem die Summe der Elemente 0 ist, und machen Sie es zur Geschwindigkeit jedes Schritts.
Alles ist in Ordnung, aber lassen Sie uns einfach ein Array erstellen, das halb -2 und halb 2 ist, und es mischen.
steps = 200
$a = Array.new(steps) do |i|
if i < steps/2
2
else
-2
end
end
Mische und ordne dieses Array an die Arrays "vx" und "vy" jedes Partikels.
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
Alles, was Sie tun müssen, ist, bei jedem Schritt "vx [i], vy [i]" zu "x, y" hinzuzufügen. Die Summe von "vx" und "vy" ist Null, daher wird sie immer zurückkommen.
Zuerst wird das Wort "Spacon" angezeigt, und es ist dasselbe, das es allmählich zusammenbricht.
Dies wird allmählich zusammenbrechen.
Die Art und Weise, wie es zusammenfällt, ist langsamer als die lineare Bewegung mit konstanter Geschwindigkeit. Da es sich auch im am weitesten verbreiteten Zustand durch Ausbreitung ausbreitet, sind die unscharfen Zeichen weiterhin sichtbar.
Ich habe versucht, ein animiertes GIF zu erstellen, in dem Zeichen für einen Moment nach der molekulardynamischen Methode erscheinen. Es ist ein Geheimnis, warum ich mich dazu entschlossen habe, so etwas zu machen.
Wenn Sie es sich ausdenken, tauchen Charaktere nacheinander auf und werden zu einer Nachricht. Spielen Sie also bitte damit herum.
Recommended Posts