# Sand Traveler was a special commision, produced in Processing by # Jared Tarbell for Sonar 2004, Barcelona. # This Ruby port has been tweaked, half of the (non-running) code exorcised, # color palette broadened, and done in negative. # refactored and updated for processing-2.0 # -- omygawshkenas attr_reader :cities, :num, :slowdown, :num_travelers, :panel load_library 'control_panel' def setup size displayWidth, displayHeight, P2D control_panel do |c| c.slider :slowdown, 0.5..1.1 c.slider :num_travelers, 0..50 @panel = c end @dx, @dy = 0, 0 @num = 150 @cities = [] @slowdown = 0.954 @num_travelers = 13 reset_all end def draw panel.visible = self.visible cities.each {|city| city.move } end def mouse_pressed reset_all end def reset_all @source_colors = [[@red || rand(255), @green || rand(255), @blue || rand(255), rand(45 .. 75)], [@red_2 || rand(255), @green_2 || rand(255), @blue_2 || rand(255), rand(45 .. 75)]] background 0 vt = 4.2 vvt = 0.2 ot = rand * PI * 2 num.times do |i| tinc = ot + (1.1 - i / num) * 2 * i * (PI * 2) / num vx, vy = vt * sin(tinc), vt * cos(tinc) cities << City.new(self, width/2+vx*2, height/2+vy*2, vx, vy, i) vvt -= 0.00033 vt += vvt end cities.each { |city| city.find_friend } end def some_color choice = @source_colors.sample.dup choice.map! { |c| c + rand(-60 .. 60) } choice[3] = 0.7 * choice[3] return choice end class City include Processing::Proxy attr_reader :x, :y, :color, :app, :friend, :vx, :vy # SLOWDOWN = 0.946 def initialize(app, dx, dy, vx, vy, index) @app = app @x, @y = dx, dy @vx, @vy = vx, vy @index = index @slowdown = 0.956 @color = app.some_color end def move if (vx.abs + vy.abs) > 0.01 @vx += (friend.x - x) / 1000 @vy += (friend.y - y) / 1000 @vx *= app.slowdown; @vy *= app.slowdown @x += vx; @y += vy draw_travelers end end def find_friend @friend = app.cities[(@index + rand(app.num/5) + 1) % app.num] end def draw_travelers stroke *friend.color app.num_travelers.to_i.times do |i| t = rand * PI * 2 dx = sin(t) * (x - friend.x) / 2 + (x + friend.x) / 2 dy = sin(t) * (y - friend.y) / 2 + (y + friend.y) / 2 if rand < 0.01 dx += rand(-3.0 .. 3) dy += rand(-3.0 .. 3) end point dx, dy end end end
Monday, 4 February 2013
Sand Traveler Refactored and Updated
Just checking that this classic ruby processing example will run with my updated ruby-processing. The main change is that the sketch is now a bare sketch. Other changes I've made include the use of the Processing::Proxy mixin and avoiding bare calls to global $app, and using the ruby 1.9 feature rand range. I've also made use of displayWidth and displayHeight variables (NB: these must be camel case currently) to display full size on screen. I would recommend letting the sketch "grow" a bit before messing with controls to get best effect, see those travellers move....
No comments:
Post a Comment