Sha256: 61f94d41c69a440de2b2fdea52ec508e0a26a6a5e722155e23b2212783fd3134

Contents?: true

Size: 1.53 KB

Versions: 6

Compression:

Stored size: 1.53 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

attr_reader :cells

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(PI / 9.0)
    r = ((i / n.to_f) * (width / 2) * (((n - i) / n.to_f) * 3.3)) + rand(6.0)
    cells << Cell.new((r * cos(a) + width / 2).to_i, (r * 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

##
# The cell responds to mouse movement
##

class Cell
  attr_reader :x, :y, :spin, :angle
  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 * cos(angle), y + d * sin(angle))
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ruby-processing-2.6.3 samples/contributed/empathy.rb
ruby-processing-2.6.2 samples/contributed/empathy.rb
ruby-processing-2.6.1 samples/contributed/empathy.rb
ruby-processing-2.6.0 samples/contributed/empathy.rb
ruby-processing-2.5.1 samples/contributed/empathy.rb
ruby-processing-2.5.0 samples/contributed/empathy.rb