[RUBY] Erstellen Sie mit der molekulardynamischen Methode eine Animation, in der Charaktere für einen Moment auftauchen

Einführung

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

b.gif

Diffusionsversion

d.gif

Die Quelle ist unten.

https://github.com/kaityo256/stringtext

Politik

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.

Molekulardynamiksimulation

Ballistische Version

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.

img107.png

Dies wird allmählich zusammenbrechen.

img109.png

img111.png

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".

img006.png

Um dies zu verhindern, ziehen Sie eine andere Methode in Betracht.

Diffusionsversion

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.

img107.png

Dies wird allmählich zusammenbrechen.

img109.png

img111.png

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.

img006.png

Zusammenfassung

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

Erstellen Sie mit der molekulardynamischen Methode eine Animation, in der Charaktere für einen Moment auftauchen
Erstellen Sie in Salesforce ein Tool zur Namensidentifizierung
Erstellen Sie eine Umgebung für Tomcat und Postgres auf Chromebook, ohne den Entwicklermodus zu verwenden
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ein Memorandum zum Erstellen eines erweiterten Loggers mit org.slf4j.Logger
Erstellen Sie in Eclipse eine Basis für Ihr Stapelverarbeitungsprojekt.
Verfahren zum Veröffentlichen einer Anwendung mit AWS (4) Erstellen einer Datenbank
Erstellen Sie einen QR-Code für Google Authenticator mit ZXing in Java