Sha256: f7d6475df05e60423b87fd2dec983f1bdd97fcf74ee841993c20d65b774acd52
Contents?: true
Size: 1.47 KB
Versions: 2
Compression:
Stored size: 1.47 KB
Contents
# Empathy # original by Kyle McDonald # http://www.openprocessing.org/visuals/?visualID=1182 # This sketch takes advantage of multiple processors by running calculations # in a separate thread. CELL_COUNT = 5000 SLOW_DOWN = 0.97 ROTATION = 0.004 LINE_LENGTH = 37 MULTI_THREADED = true def setup size(500, 500, P3D) stroke(0, 0, 0, 25) initialize_cells start_cell_updates if MULTI_THREADED end def initialize_cells @cells = [] n = CELL_COUNT n.times do |i| a = i + rand * (Math::PI / 9.0) r = ((i / n.to_f) * (width / 2) * (((n - i) / n.to_f) * 3.3)) + (rand * 6) @cells[i] = Cell.new((r * Math.cos(a) + width/2).to_i, (r * Math.sin(a) + height/2).to_i) end end def start_cell_updates Thread.new { Kernel.loop { @cells.each {|cell| cell.update } } } end def draw background 255 @cells.each {|cell| cell.sense } if started? end def started? pmouse_x != 0 || pmouse_y != 0 end def mouse_pressed @cells.each {|cell| cell.reset } end class Cell def initialize(x, y) @x, @y = x, y @spin = 0 @angle = 0 end def reset @spin, @angle = 0, 0 end def update det = ((pmouse_x-@x) * (mouse_y-@y) - (mouse_x-@x) * (pmouse_y-@y)).to_f @spin += ROTATION * det / dist(@x, @y, mouse_x, mouse_y).to_f @spin *= SLOW_DOWN @angle += @spin end def sense update unless MULTI_THREADED d = LINE_LENGTH * @spin + 0.001 line(@x, @y, @x + d * Math.cos(@angle), @y + d * Math.sin(@angle)) end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
ruby-processing-1.0.11 | samples/contributed/empathy.rb |
ruby-processing-1.0.10.1 | samples/contributed/empathy.rb |