ruby-processing 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/CHANGELOG +12 -0
  2. data/lib/ruby-processing.rb +2 -1
  3. data/lib/ruby-processing/app.rb +7 -5
  4. data/lib/ruby-processing/exporters/creator.rb +7 -4
  5. data/lib/ruby-processing/helpers/numeric.rb +11 -0
  6. data/lib/ruby-processing/helpers/string.rb +8 -0
  7. data/lib/ruby-processing/runner.rb +11 -10
  8. data/lib/ruby-processing/runners/watch.rb +33 -0
  9. data/samples/bezier_playground.rb +243 -0
  10. data/samples/flight_patterns.rb +1 -1
  11. data/samples/learning_processing/chapter_16/01_display_video.rb +1 -1
  12. data/samples/learning_processing/chapter_16/02_manipulate_video_image.rb +1 -1
  13. data/samples/processing_app/basics/arrays/array.rb +41 -0
  14. data/samples/processing_app/basics/arrays/array_2d.rb +38 -0
  15. data/samples/processing_app/basics/arrays/array_objects.rb +67 -0
  16. data/samples/processing_app/basics/color/brightness.rb +30 -0
  17. data/samples/processing_app/basics/color/color_wheel.rb +97 -0
  18. data/samples/processing_app/basics/color/creating.rb +37 -0
  19. data/samples/processing_app/basics/color/hue.rb +29 -0
  20. data/samples/processing_app/basics/color/linear_gradient.rb +47 -0
  21. data/samples/processing_app/basics/color/radial_gradient.rb +52 -0
  22. data/samples/processing_app/basics/color/reading/data/cait.jpg +0 -0
  23. data/samples/processing_app/basics/color/reading/reading.rb +43 -0
  24. data/samples/processing_app/basics/color/relativity.rb +38 -0
  25. data/samples/processing_app/basics/color/saturation.rb +35 -0
  26. data/samples/processing_app/basics/color/wave_gradient.rb +45 -0
  27. data/samples/processing_app/basics/control/conditionals1.rb +51 -0
  28. data/samples/processing_app/basics/control/conditionals2.rb +44 -0
  29. data/samples/processing_app/basics/control/embedded_iteration.rb +42 -0
  30. data/samples/processing_app/basics/control/iteration.rb +61 -0
  31. data/samples/processing_app/basics/control/logical_operators.rb +59 -0
  32. data/samples/processing_app/basics/data/characters_strings/characters_strings.rb +87 -0
  33. data/samples/processing_app/basics/data/characters_strings/data/Eureka-90.vlw +0 -0
  34. data/samples/processing_app/basics/data/characters_strings/data/rathausFrog.jpg +0 -0
  35. data/samples/processing_app/basics/data/datatype_conversion.rb +45 -0
  36. data/samples/processing_app/basics/data/integers_floats.rb +34 -0
  37. data/samples/processing_app/basics/data/true_false.rb +37 -0
  38. data/samples/processing_app/basics/data/variable_scope.rb +80 -0
  39. data/samples/processing_app/basics/data/variables.rb +40 -0
  40. data/samples/processing_app/basics/form/bezier.rb +23 -0
  41. data/samples/processing_app/basics/form/bezier_ellipse.rb +110 -0
  42. data/samples/processing_app/basics/form/pie_chart.rb +31 -0
  43. data/samples/processing_app/basics/form/points_lines.rb +37 -0
  44. data/samples/processing_app/basics/form/shape_primitives.rb +25 -0
  45. data/samples/processing_app/basics/form/triangle_strip.rb +43 -0
  46. data/samples/processing_app/basics/form/vertices.rb +51 -0
  47. data/samples/processing_app/basics/image/alphamask.rb +23 -0
  48. data/samples/processing_app/basics/image/background_image.rb +30 -0
  49. data/samples/processing_app/basics/image/create_image.rb +23 -0
  50. data/samples/processing_app/basics/image/data/construct.jpg +0 -0
  51. data/samples/processing_app/basics/image/data/eames.jpg +0 -0
  52. data/samples/processing_app/basics/image/data/jelly.jpg +0 -0
  53. data/samples/processing_app/basics/image/data/mask.jpg +0 -0
  54. data/samples/processing_app/basics/image/data/milan_rubbish.jpg +0 -0
  55. data/samples/processing_app/basics/image/data/teddy.gif +0 -0
  56. data/samples/processing_app/basics/image/data/test.jpg +0 -0
  57. data/samples/processing_app/basics/image/data/wash.jpg +0 -0
  58. data/samples/processing_app/basics/image/load_display_image.rb +25 -0
  59. data/samples/processing_app/basics/image/pointillism.rb +30 -0
  60. data/samples/processing_app/basics/image/request_image.rb +71 -0
  61. data/samples/processing_app/basics/image/sprite.rb +38 -0
  62. data/samples/processing_app/basics/image/transparency.rb +27 -0
  63. data/samples/processing_app/basics/input/clock.rb +46 -0
  64. data/samples/processing_app/basics/input/constrain.rb +39 -0
  65. data/samples/processing_app/basics/input/easing.rb +33 -0
  66. data/samples/processing_app/basics/input/keyboard.rb +36 -0
  67. data/samples/processing_app/basics/input/keyboard_2.rb +45 -0
  68. data/samples/processing_app/basics/input/keyboard_functions.rb +87 -0
  69. data/samples/processing_app/basics/input/milliseconds.rb +25 -0
  70. data/samples/processing_app/basics/input/mouse_1d.rb +34 -0
  71. data/samples/processing_app/basics/input/mouse_2d.rb +25 -0
  72. data/samples/processing_app/basics/input/mouse_functions.rb +73 -0
  73. data/samples/processing_app/basics/input/mouse_press.rb +21 -0
  74. data/samples/processing_app/basics/input/mouse_signals.rb +45 -0
  75. data/samples/processing_app/basics/input/storing_input.rb +39 -0
  76. data/samples/processing_app/basics/math/additive_wave.rb +66 -0
  77. data/samples/processing_app/basics/math/arctangent.rb +54 -0
  78. data/samples/processing_app/topics/simulate/chain.rb +82 -0
  79. data/samples/processing_app/topics/simulate/multiple_particle_systems.rb +166 -0
  80. data/samples/processing_app/topics/simulate/simple_particle_system.rb +113 -0
  81. data/samples/processing_app/topics/simulate/spring.rb +85 -0
  82. data/samples/processing_app/topics/simulate/springs.rb +125 -0
  83. metadata +93 -2
@@ -0,0 +1,45 @@
1
+ require 'ruby-processing'
2
+
3
+ # Processings datatype conversion functions make no sense for Ruby as it does
4
+ # not have primitive datatypes. Try these instead:
5
+ # "to_s" (to String)
6
+ # "to_i" (to Integer, thats a Fixnum or Bignum)
7
+ # "to_f" (to Float, which would be "double" in Processing, not "float")
8
+ # "to_a" (to Array, i.e. from a Range or Hash)
9
+
10
+ class DatatypeConversion < Processing::App
11
+
12
+ def setup
13
+
14
+ # Ruby has no primitive datatypes, everything is an object!
15
+ # See:
16
+ [1, 2.0, 'a', "B", nil, false].each do |element|
17
+ puts
18
+ puts "#{element.inspect} ... is a #{element.class.name} object"
19
+ end
20
+
21
+ c = 'A' # String (!) as there is no char datatype in Ruby.
22
+ # Single quotes are parsed without substitutions (i.e. "It is #{Time.now}.")
23
+
24
+ f = c[0].to_f # Sets f = 65.0
25
+ # will become "c.ord.to_f" in Ruby 1.9+
26
+
27
+ i = (f * 1.4).to_i # Sets i to 91
28
+
29
+ b = (c[0] / 2) # Integer or FixNum as there is no byte in Ruby
30
+
31
+ background 51
32
+ no_stroke
33
+
34
+ rect f, 0, 40, 66
35
+
36
+ fill 204
37
+ rect i, 67, 40, 66
38
+
39
+ fill 255
40
+ rect b, 134, 40, 66
41
+ end
42
+
43
+ end
44
+
45
+ DatatypeConversion.new :title => "Datatype Conversion", :width => 200, :height => 200
@@ -0,0 +1,34 @@
1
+ require 'ruby-processing'
2
+
3
+ # Integers and floats are two different kinds of numerical data.
4
+ # An integer (more commonly called an int) is a number without
5
+ # a decimal point. A float is a floating-point number, which means
6
+ # it is a number that has a decimal place. Floats are used when
7
+ # more precision is needed.
8
+
9
+ class IntegersFloats < Processing::App
10
+
11
+ def setup
12
+ stroke 255
13
+ frame_rate 30
14
+
15
+ @a = 0 # Create an instance variable "a" of class Integer
16
+ @b = 0.0 # Create an instance variable "b" of class Float (because of "0.0")
17
+ end
18
+
19
+ def draw
20
+ background 51
21
+
22
+ @a += 1
23
+ @b += 0.2
24
+
25
+ line @a, 0, @a, height/2
26
+ line @b, height/2, @b, height
27
+
28
+ @a = 0 if @a > width
29
+ @b = 0 if @b > width
30
+ end
31
+
32
+ end
33
+
34
+ IntegersFloats.new :title => "Integers Floats", :width => 200, :height => 200
@@ -0,0 +1,37 @@
1
+ require 'ruby-processing'
2
+
3
+ # Boolean data is one bit of information. True or false.
4
+ # It is common to use Booleans with control statements to
5
+ # determine the flow of a program. In this example, when the
6
+ # boolean value "x" is true, vertical black lines are drawn and when
7
+ # the boolean value "x" is false, horizontal gray lines are drawn.
8
+
9
+ # In Ruby, false and nil are "falsy" ... they are the only things
10
+ # that will fail an "if" test. Absolutely everything else passes "if".
11
+
12
+ class TrueFalse < Processing::App
13
+
14
+ def setup
15
+ background 0
16
+ stroke 0
17
+
18
+ (1..width).step(2) do |i|
19
+
20
+ x = i < (width/2) # Evaluates to true or false, depending on i
21
+
22
+ if x
23
+ stroke 255
24
+ line i, 1, i, height-1
25
+ end
26
+
27
+ if !x
28
+ stroke 126
29
+ line width/2, i, width-2, i
30
+ end
31
+
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ TrueFalse.new :title => "True False", :width => 200, :height => 200
@@ -0,0 +1,80 @@
1
+ require 'ruby-processing'
2
+
3
+ # Variables may either have a global or local "scope".
4
+ # For example, variables declared within either the
5
+ # setup or draw functions may be only used in these
6
+ # functions. Global variables, variables declared outside
7
+ # of setup and draw, may be used anywhere within the program.
8
+ # If a local variable is declared with the same name as a
9
+ # global variable, the program will use the local variable to make
10
+ # its calculations within the current scope. Variables may be localized
11
+ # within classes, functions, and iterative statements.
12
+
13
+ # Please note that there are some changes on variable scope inside blocks
14
+ # between Ruby versions 1.8 and 1.9.
15
+
16
+ class VariableScope < Processing::App
17
+
18
+ def setup
19
+ background 51
20
+ stroke 255
21
+ no_loop
22
+
23
+ @a = 20 # Use "@" before the name to create an instance variable ("@a"),
24
+ # which will be available anywhere inside this instance of "VariableScope".
25
+ end
26
+
27
+ def draw
28
+ # Draw a line using the instance variable "a",
29
+ # as returned by its getter function below
30
+ line a, 0, a, height
31
+
32
+ # Create a new variable "a" local to the block (do-end)
33
+ (50..80).step(2) do |a|
34
+ line a, 0, a, height
35
+ end
36
+
37
+ # Create a new variable "a" local to the draw method
38
+ a = 100
39
+ line a, 0, a, height
40
+
41
+ # Make a call to the custom function draw_another_line
42
+ draw_another_line
43
+
44
+ # Make a call to the custom function draw_yet_another_line
45
+ draw_yet_another_line
46
+ end
47
+
48
+ def draw_another_line
49
+ # Create a new variable "a" local to this method
50
+ a = 185
51
+
52
+ # Draw a line using the local variable "a"
53
+ line a, 0, a, height
54
+ end
55
+
56
+ def draw_yet_another_line
57
+ # Because no new local variable "a" is set, this line draws using the
58
+ # instance variable "a" (returned by its getter function) which was
59
+ # set to the value 20 in setup.
60
+ line a+2, 0, a+2, height
61
+ end
62
+
63
+ # This is a "getter" function, it returns the value of the instance variable "a"
64
+ def a
65
+ @a
66
+ end
67
+
68
+ # Ruby can add that getter function for you automatically:
69
+ # attr_reader :a
70
+
71
+ # And this would create a setter which will allow you to set "a" to a value ( "a = 123" )
72
+ # without using that "@" sign all the time:
73
+ # attr_writer :a
74
+
75
+ # Or you could just have Ruby add both at once with:
76
+ # attr_accessor :a
77
+
78
+ end
79
+
80
+ VariableScope.new :title => "Variable Scope", :width => 200, :height => 200
@@ -0,0 +1,40 @@
1
+ require 'ruby-processing'
2
+
3
+ # Variables are used for storing values. In this example, changing
4
+ # the values of variables @one and @two significantly changes the composition.
5
+
6
+ class Variables < Processing::App
7
+
8
+ load_library :control_panel
9
+
10
+ def setup
11
+ stroke 153
12
+
13
+ @one = 20 # Change these with the sliders
14
+ @two = 50
15
+
16
+ control_panel do |c|
17
+ c.slider :one, -20..100
18
+ c.slider :two, -20..100
19
+ end
20
+ end
21
+
22
+
23
+ def draw
24
+ background 0
25
+
26
+ c = @one * 8
27
+ d = @one * 9
28
+ e = @two - @one
29
+ f = @two * 2
30
+ g = f + e
31
+
32
+ line @one, f, @two, g
33
+ line @two, e, @two, g
34
+ line @two, e, d, c
35
+ line @one, e, d-e, c
36
+ end
37
+
38
+ end
39
+
40
+ Variables.new :title => "Variables", :width => 200, :height => 200
@@ -0,0 +1,23 @@
1
+ require 'ruby-processing'
2
+
3
+ # The first two parameters for the bezier function specify the
4
+ # first point in the curve and the last two parameters specify
5
+ # the last point. The middle parameters set the control points
6
+ # that define the shape of the curve.
7
+
8
+ class Bezier < Processing::App
9
+
10
+ def setup
11
+ background 0
12
+ stroke 255
13
+ no_fill
14
+ smooth
15
+
16
+ (0..100).step(20) do |i|
17
+ bezier 90-(i/2.0), 20+i, 210, 10, 220, 150, 120-(i/8.0), 150+(i/4.0)
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ Bezier.new :title => "Bezier", :width => 200, :height => 200
@@ -0,0 +1,110 @@
1
+ require 'ruby-processing'
2
+
3
+ # Bezier Ellipse
4
+ # By Ira Greenberg
5
+ #
6
+ # Generates an ellipse using bezier and
7
+ # trig functions. Approximately every 1/2
8
+ # second a new ellipse is plotted using
9
+ # random values for control/anchor points.
10
+
11
+ class BezierEllipse < Processing::App
12
+
13
+ # have Ruby add getter/setter functions for these,
14
+ # so we don't have to write "@var" all the time
15
+ attr_accessor :px, :py, :cx, :cy, :cx2, :cy2
16
+
17
+ def setup
18
+ @color_controls = 0xFF222222
19
+ @color_anchors = 0xFFBBBBBB
20
+
21
+ smooth
22
+ rect_mode CENTER
23
+ set_ellipse 4, 65, 65
24
+ frame_rate 1
25
+ end
26
+
27
+ def draw
28
+ background 145
29
+ draw_ellipse
30
+ set_ellipse random(3, 12).to_i, random(-100, 150), random(-100, 150)
31
+ end
32
+
33
+ def draw_ellipse
34
+
35
+ number_of_points = px.length # all our arrays have same length
36
+
37
+ # draw shape
38
+
39
+ stroke_weight 1.125
40
+ stroke 255
41
+ no_fill
42
+
43
+ number_of_points.times do |i|
44
+ i2 = (i+1) % number_of_points # wrap around to make a loop
45
+ bezier px[i], py[i],
46
+ cx[i], cy[i],
47
+ cx2[i], cy2[i],
48
+ px[i2], py[i2]
49
+ end
50
+
51
+ # draw lines and handles
52
+
53
+ stroke_weight 0.75
54
+ stroke 0
55
+
56
+ number_of_points.times do |i|
57
+ i2 = (i+1) % number_of_points
58
+ line px[i], py[i], cx[i], cy[i] # anchor to control 1
59
+ line cx2[i], cy2[i], px[i2], py[i2] # control 2 to next anchor
60
+ end
61
+
62
+ number_of_points.times do |i|
63
+ fill @color_controls
64
+ no_stroke
65
+
66
+ ellipse cx[i], cy[i], 4, 4
67
+ ellipse cx2[i], cy2[i], 4, 4
68
+
69
+ fill @color_anchors
70
+ stroke 0
71
+
72
+ rect px[i], py[i], 5, 5
73
+ end
74
+ end
75
+
76
+ def set_ellipse( points, radius, control_radius )
77
+
78
+ # first time we come here the instance variables are created
79
+ # therefore we need to use "@" or "self.". the former will access the variable
80
+ # directly the later will use the setter function created by "attr_accessor".
81
+ @px , self.py , @cx , @cy , @cx2 , @cy2 = [], [], [], [], [], []
82
+
83
+ angle = 360.0/points
84
+ control_angle_1 = angle/3.0
85
+ control_angle_2 = control_angle_1*2.0
86
+ points.times do |i|
87
+ px[i] = width/2+cos(angle.radians)*radius
88
+
89
+ py[i] = height/2+sin(angle.radians)*radius
90
+
91
+ cx[i] = width/2+cos((angle+control_angle_1).radians)*
92
+ control_radius/cos((control_angle_1).radians)
93
+
94
+ cy[i] = height/2+sin((angle+control_angle_1).radians)*
95
+ control_radius/cos((control_angle_1).radians)
96
+
97
+ cx2[i] = width/2+cos((angle+control_angle_2).radians)*
98
+ control_radius/cos((control_angle_1).radians)
99
+
100
+ cy2[i] = height/2+sin((angle+control_angle_2).radians)*
101
+ control_radius/cos((control_angle_1).radians)
102
+
103
+ #increment angle so trig functions keep chugging along
104
+ angle += 360.0/points
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ BezierEllipse.new :title => "Bezier Ellipse", :width => 200, :height => 200
@@ -0,0 +1,31 @@
1
+ require 'ruby-processing'
2
+
3
+ # Pie Chart
4
+ # By Ira Greenberg
5
+ #
6
+ # Uses the arc() function to generate a pie chart from the data
7
+ # stored in an array.
8
+
9
+ class PieChart < Processing::App
10
+
11
+ def setup
12
+ background 100
13
+ smooth
14
+ no_stroke
15
+
16
+ diameter = 150
17
+ angles = [30, 10, 45, 35 ,60, 38, 75, 67]
18
+ last_angle = 0.0
19
+
20
+ angles.each do |angle|
21
+ fill angle * 3.0
22
+ arc width/2, height/2, # center x, y
23
+ diameter, diameter, # width, height
24
+ last_angle, last_angle + radians(angle) # angles from, to
25
+ last_angle += radians(angle)
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ PieChart.new :title => "Pie Chart", :width => 200, :height => 200
@@ -0,0 +1,37 @@
1
+ require 'ruby-processing'
2
+
3
+ # Constructing a simple dimensional form with lines and rectangles.
4
+ # Changing the value of the variable 'd' scales the image.
5
+ # The four variables set the positions based on the value of 'd'.
6
+
7
+ class PointsLines < Processing::App
8
+
9
+ def setup
10
+ d = 40
11
+ p1 = d
12
+ p2 = p1+d
13
+ p3 = p2+d
14
+ p4 = p3+d
15
+
16
+ background 0
17
+
18
+ # Draw gray box
19
+ stroke 153
20
+ line p3, p3, p2, p3
21
+ line p2, p3, p2, p2
22
+ line p2, p2, p3, p2
23
+ line p3, p2, p3, p3
24
+
25
+ # Draw white points
26
+ stroke 255
27
+ point p1, p1
28
+ point p1, p3
29
+ point p2, p4
30
+ point p3, p1
31
+ point p4, p2
32
+ point p4, p4
33
+ end
34
+
35
+ end
36
+
37
+ PointsLines.new :title => "Points Lines", :width => 200, :height => 200