3

是否可以使用 gnuplot gem 在 Ruby 中创建动画 3 维散点图?

我浏览了 gem 源代码、一堆示例和 gnuplot 手册,但还没有弄清楚该怎么做。

我在想我必须分叉它并添加一些循环功能 - 但在我这样做之前,我想知道是否有一个好的方法来做到这一点。

这是我的代码的摘录,显示了我到目前为止所拥有的内容。

Gnuplot.open do |gp|
  Gnuplot::SPlot.new( gp ) do |plot|
    plot.title 'Orbital Simulation'

    N.times do | i |
      objects.each { | key, object | object.calc_tick(objects.except key) }
      objects.each { | key, object | object.apply_tick }

      x = []
      y = []
      z = []

      objects.each do | key, object |
        x << object.get_x
        y << object.get_y
        z << object.get_z
      end

      plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
        ds.with = "points"
        ds.notitle
      end
    end
  end
end
4

1 回答 1

0

方法调用Gnuplot::Splot.new(gp) {...}将给定块中定义的命令(包括 splot 命令和内联数据)发送到 IO 对象gp。因此,在循环中连续调用Gnuplot::Splot.new并在它们之后插入一些等待行为(睡眠)。

例如,以下代码生成动画 3d 散点图(实际上只包括一个点)。

require "gnuplot"

Gnuplot.open do |gp|

  1000.times do |k| ### loop
    Gnuplot::SPlot.new( gp ) do |plot|
      plot.title 'Orbital Simulation'
      plot.xrange "[-2:2]"
      plot.yrange "[-2:2]"
      plot.zrange "[-2:2]"
      x = [Math.sin(k*0.05)]
      y = [Math.cos(k*0.05)]
      z = [Math.sin(k*0.07)]
      plot.data << Gnuplot::DataSet.new( [x, y, z] ) do |ds|
        ds.with = "points ps 2 pt 7"
        ds.notitle
      end
    end
    gp << "\n" ### this is needed to separate line after inline data
    gp.flush   ### flushing popen buffer
    sleep 0.1  ### waiting 
  end
end
于 2020-11-21T15:29:34.570 回答