ruby-processing 2.4.3 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/CHANGELOG +5 -0
- data/README.md +4 -2
- data/lib/ruby-processing/exporters/application_exporter.rb +1 -0
- data/lib/ruby-processing/version.rb +1 -1
- data/library/boids/boids.rb +14 -13
- data/library/vecmath/lib/vec.rb +20 -4
- data/samples/contributed/circle_collision.rb +92 -149
- data/samples/contributed/drawolver.rb +13 -27
- data/samples/contributed/elegant_ball.rb +158 -0
- data/samples/contributed/fern.rb +16 -3
- data/samples/contributed/flight_patterns.rb +16 -4
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/bumpy_surface_noise.rb +4 -9
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/data/java_args.txt +0 -0
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/custom_shape/custom_shape.rb +1 -1
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/particle_system/particle_system.rb +7 -10
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/surface/surface.rb +2 -2
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/liquidy.rb +7 -7
- data/samples/external_library/java_processing/{pbox2d → box2d_processing}/polygons.rb +4 -9
- data/samples/external_library/java_processing/custom/README.md +15 -0
- data/samples/external_library/java_processing/custom/Rakefile +28 -0
- data/samples/external_library/java_processing/custom/landscape.rb +58 -0
- data/samples/external_library/java_processing/custom/src/nn/Connection.java +47 -0
- data/samples/external_library/java_processing/custom/src/nn/HiddenNeuron.java +20 -0
- data/samples/external_library/java_processing/custom/src/nn/InputNeuron.java +23 -0
- data/samples/external_library/java_processing/custom/src/nn/Network.java +136 -0
- data/samples/external_library/java_processing/custom/src/nn/Neuron.java +79 -0
- data/samples/external_library/java_processing/custom/src/nn/OutputNeuron.java +7 -0
- data/samples/external_library/java_processing/custom/xor.rb +88 -0
- data/samples/external_library/ruby_gem/README +1 -1
- data/samples/external_library/ruby_gem/data/data.json +8 -0
- data/samples/external_library/ruby_gem/draw_test.rb +171 -0
- data/samples/processing_app/basics/form/icosahedra.rb +39 -0
- data/samples/processing_app/basics/form/library/icosahedron/icosahedron.rb +60 -0
- data/samples/processing_app/basics/form/toroid.rb +78 -92
- data/samples/processing_app/basics/transform/birds.rb +6 -12
- data/samples/processing_app/basics/transform/cubes_in_cube.rb +25 -22
- data/samples/processing_app/basics/transform/library/cube/cube.rb +16 -16
- data/samples/processing_app/basics/transform/rotate_push_pop.rb +1 -1
- data/samples/processing_app/demos/graphics/bezier_patch.rb +18 -31
- data/samples/processing_app/demos/graphics/trefoil.rb +15 -15
- data/samples/processing_app/library/vecmath/acceleration_with_vectors.rb +3 -3
- data/samples/processing_app/library/vecmath/hilbert_fractal.rb +2 -2
- data/samples/processing_app/library/vecmath/library/flock/flock.rb +18 -21
- data/samples/processing_app/library/vecmath/library/hilbert/hilbert.rb +11 -8
- data/samples/processing_app/library/vecmath/library/wiggler/wiggler.rb +7 -15
- data/samples/processing_app/library/vecmath/seeking_neural.rb +172 -0
- data/samples/processing_app/topics/animation/animated_sprite.rb +5 -8
- data/samples/processing_app/topics/animation/sequential.rb +2 -3
- data/samples/processing_app/topics/create_shapes/library/particle/particle_system.rb +7 -7
- data/samples/processing_app/topics/create_shapes/particle_system_pshape.rb +2 -2
- data/samples/processing_app/topics/create_shapes/wiggle_pshape.rb +2 -1
- data/samples/processing_app/topics/lsystems/koch.rb +1 -1
- data/samples/processing_app/topics/lsystems/library/koch/koch_fractal.rb +24 -23
- data/samples/processing_app/topics/motion/circle_collision.rb +117 -160
- data/samples/processing_app/topics/motion/library/cube/cube.rb +1 -1
- data/samples/processing_app/topics/motion/morph.rb +1 -1
- data/samples/processing_app/topics/motion/reflection1.rb +17 -16
- data/samples/processing_app/topics/shaders/conway.rb +2 -2
- data/samples/processing_app/topics/shaders/data/conway.glsl +10 -10
- data/samples/processing_app/topics/shaders/glsl_heightmap_noise.rb +9 -8
- data/samples/processing_app/topics/shaders/landscape.rb +1 -1
- data/samples/processing_app/topics/simulate/flocking.rb +1 -1
- data/samples/processing_app/topics/simulate/library/flock/flock.rb +62 -57
- data/samples/processing_app/topics/simulate/multiple_particle_systems.rb +8 -28
- data/samples/processing_app/topics/simulate/simple_particle_system.rb +9 -7
- data/samples/processing_app/topics/simulate/smoke_particle_system.rb +12 -11
- data/vendors/Rakefile +2 -2
- metadata +26 -21
- data/samples/contributed/pong.rb +0 -177
- data/samples/contributed/simple_buffer.rb +0 -44
- data/samples/external_library/java_processing/pbox2d/contact_test.rb +0 -23
- data/samples/processing_app/basics/form/icosahedra/icosahedra.rb +0 -72
- data/samples/processing_app/basics/form/icosahedra/icosahedron.rb +0 -116
- data/samples/processing_app/basics/form/icosahedra/shape_3D.rb +0 -25
@@ -30,15 +30,20 @@ end
|
|
30
30
|
class Boid
|
31
31
|
include Processing::Proxy
|
32
32
|
|
33
|
-
|
33
|
+
MAXSPEED = 2
|
34
|
+
MAXFORCE = 0.03
|
35
|
+
|
36
|
+
attr_reader :width, :height
|
37
|
+
attr_reader :location, :velocity, :acceleration, :sz, :maxforce_squared, :maxspeed_squared
|
34
38
|
|
35
39
|
def initialize(x, y)
|
36
|
-
@
|
37
|
-
@
|
38
|
-
@
|
39
|
-
@
|
40
|
-
@
|
41
|
-
@
|
40
|
+
@width, @height = $app.width, $app.height
|
41
|
+
@acceleration = Vec2D.new(0, 0)
|
42
|
+
@velocity = Vec2D.new(rand(-1.0 .. 1), rand(-1.0 .. 1))
|
43
|
+
@location = Vec2D.new(x, y)
|
44
|
+
@sz = 4.0
|
45
|
+
@maxspeed_squared = MAXSPEED * MAXSPEED
|
46
|
+
@maxforce_squared = MAXFORCE * MAXFORCE
|
42
47
|
end
|
43
48
|
|
44
49
|
def run(boids)
|
@@ -50,7 +55,7 @@ class Boid
|
|
50
55
|
|
51
56
|
def apply_force(force)
|
52
57
|
# We could add mass here if we want A = F / M
|
53
|
-
acceleration
|
58
|
+
@acceleration += force
|
54
59
|
end
|
55
60
|
|
56
61
|
# We accumulate a new acceleration each time based on three rules
|
@@ -59,9 +64,9 @@ class Boid
|
|
59
64
|
ali = align(boids) # Alignment
|
60
65
|
coh = cohesion(boids) # Cohesion
|
61
66
|
# Arbitrarily weight these forces
|
62
|
-
sep
|
63
|
-
ali
|
64
|
-
coh
|
67
|
+
sep *= 1.5
|
68
|
+
ali *= 1.0
|
69
|
+
coh *= 1.0
|
65
70
|
# Add the force vectors to acceleration
|
66
71
|
apply_force(sep)
|
67
72
|
apply_force(ali)
|
@@ -71,25 +76,25 @@ class Boid
|
|
71
76
|
# Method to update location
|
72
77
|
def update
|
73
78
|
# Update velocity
|
74
|
-
velocity
|
79
|
+
@velocity += acceleration
|
75
80
|
# Limit speed
|
76
|
-
velocity.
|
77
|
-
location
|
81
|
+
velocity.set_mag(MAXSPEED) {velocity.mag_squared > maxspeed_squared}
|
82
|
+
@location += velocity
|
78
83
|
# Reset accelertion to 0 each cycle
|
79
|
-
acceleration
|
84
|
+
@acceleration *= 0
|
80
85
|
end
|
81
86
|
|
82
87
|
# A method that calculates and applies a steering force towards a target
|
83
88
|
# STEER = DESIRED MINUS VELOCITY
|
84
89
|
def seek(target)
|
85
|
-
desired =
|
90
|
+
desired = target - location # A vector pointing from the location to the target
|
86
91
|
# Normalize desired and scale to maximum speed
|
87
|
-
desired.normalize
|
88
|
-
desired
|
92
|
+
desired.normalize!
|
93
|
+
desired *= MAXSPEED
|
89
94
|
# Steering = Desired minus Velocity
|
90
|
-
steer =
|
91
|
-
steer.
|
92
|
-
|
95
|
+
steer = desired - velocity
|
96
|
+
steer.set_mag(MAXFORCE) {steer.mag_squared > maxforce_squared} # Limit to maximum steering force
|
97
|
+
steer
|
93
98
|
end
|
94
99
|
|
95
100
|
def render
|
@@ -101,26 +106,26 @@ class Boid
|
|
101
106
|
translate(location.x,location.y)
|
102
107
|
rotate(theta)
|
103
108
|
begin_shape(TRIANGLES)
|
104
|
-
vertex(0, -
|
105
|
-
vertex(-
|
106
|
-
vertex(
|
109
|
+
vertex(0, -sz)
|
110
|
+
vertex(-sz * 0.5, sz)
|
111
|
+
vertex(sz * 0.5, sz)
|
107
112
|
end_shape
|
108
113
|
pop_matrix
|
109
114
|
end
|
110
115
|
|
111
116
|
# Wraparound
|
112
117
|
def borders
|
113
|
-
if (location.x < -
|
114
|
-
location.x =
|
118
|
+
if (location.x < -sz * 0.5)
|
119
|
+
location.x = width + sz * 0.5
|
115
120
|
end
|
116
|
-
if (location.y < -
|
117
|
-
location.y =
|
121
|
+
if (location.y < -sz * 0.5)
|
122
|
+
location.y = height + sz * 0.5
|
118
123
|
end
|
119
|
-
if (location.x >
|
120
|
-
location.x = -
|
124
|
+
if (location.x > width + sz * 0.5)
|
125
|
+
location.x = -sz
|
121
126
|
end
|
122
|
-
if (location.y >
|
123
|
-
location.y = -
|
127
|
+
if (location.y > height + sz * 0.5)
|
128
|
+
location.y = -sz * 0.5
|
124
129
|
end
|
125
130
|
end
|
126
131
|
|
@@ -128,33 +133,33 @@ class Boid
|
|
128
133
|
# Method checks for nearby boids and steers away
|
129
134
|
def separate boids
|
130
135
|
desiredseparation = 25.0
|
131
|
-
steer =
|
136
|
+
steer = Vec2D.new
|
132
137
|
count = 0
|
133
138
|
# For every boid in the system, check if it's too close
|
134
139
|
boids.each do |other|
|
135
|
-
d =
|
140
|
+
d = Vec2D.dist(location, other.location)
|
136
141
|
# If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
|
137
142
|
if ((d > 0) && (d < desiredseparation))
|
138
143
|
# Calculate vector pointing away from neighbor
|
139
|
-
diff =
|
140
|
-
diff.normalize
|
141
|
-
diff
|
142
|
-
steer
|
144
|
+
diff = location - other.location
|
145
|
+
diff.normalize!
|
146
|
+
diff /= d # Weight by distance
|
147
|
+
steer += diff
|
143
148
|
count += 1 # Keep track of how many
|
144
149
|
end
|
145
150
|
end
|
146
151
|
# Average -- divide by how many
|
147
152
|
if (count > 0)
|
148
|
-
steer
|
153
|
+
steer /= count.to_f
|
149
154
|
end
|
150
155
|
|
151
156
|
# As long as the vector is greater than 0
|
152
157
|
if (steer.mag > 0)
|
153
158
|
# Implement Reynolds: Steering = Desired - Velocity
|
154
|
-
steer.normalize
|
155
|
-
steer
|
156
|
-
steer
|
157
|
-
steer.
|
159
|
+
steer.normalize!
|
160
|
+
steer *= MAXSPEED
|
161
|
+
steer -= velocity
|
162
|
+
steer.set_mag(MAXFORCE) {steer.mag_squared > maxforce_squared}
|
158
163
|
end
|
159
164
|
return steer
|
160
165
|
end
|
@@ -163,24 +168,24 @@ class Boid
|
|
163
168
|
# For every nearby boid in the system, calculate the average velocity
|
164
169
|
def align boids
|
165
170
|
neighbordist = 50
|
166
|
-
sum =
|
171
|
+
sum = Vec2D.new(0, 0)
|
167
172
|
count = 0
|
168
173
|
boids.each do |other|
|
169
|
-
d =
|
174
|
+
d = Vec2D.dist(location, other.location)
|
170
175
|
if ((d > 0) && (d < neighbordist))
|
171
|
-
sum
|
176
|
+
sum += other.velocity
|
172
177
|
count += 1
|
173
178
|
end
|
174
179
|
end
|
175
180
|
if (count > 0)
|
176
|
-
sum
|
177
|
-
sum.normalize
|
178
|
-
sum
|
179
|
-
steer =
|
180
|
-
steer.
|
181
|
+
sum /= (count.to_f)
|
182
|
+
sum.normalize!
|
183
|
+
sum *= MAXSPEED
|
184
|
+
steer = sum - velocity
|
185
|
+
steer.set_mag(MAXFORCE) {steer.mag_squared > maxforce_squared}
|
181
186
|
return steer
|
182
187
|
else
|
183
|
-
return
|
188
|
+
return Vec2D.new
|
184
189
|
end
|
185
190
|
end
|
186
191
|
|
@@ -188,17 +193,17 @@ class Boid
|
|
188
193
|
# For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location
|
189
194
|
def cohesion boids
|
190
195
|
neighbordist = 50
|
191
|
-
sum =
|
196
|
+
sum = Vec2D.new # Start with empty vector to accumulate all locations
|
192
197
|
count = 0
|
193
198
|
boids.each do |other|
|
194
|
-
d =
|
199
|
+
d = Vec2D.dist(location, other.location)
|
195
200
|
if ((d > 0) && (d < neighbordist))
|
196
|
-
sum
|
201
|
+
sum += other.location # Add location
|
197
202
|
count += 1
|
198
203
|
end
|
199
204
|
end
|
200
|
-
sum
|
201
|
-
return (count > 0)? seek(sum) :
|
205
|
+
sum /= count unless (count == 0) # avoid div by zero
|
206
|
+
return (count > 0)? seek(sum) : Vec2D.new
|
202
207
|
end
|
203
208
|
end
|
204
209
|
|
@@ -5,6 +5,8 @@
|
|
5
5
|
# Each burst is one instance of a particle system with Particles and
|
6
6
|
# CrazyParticles (a subclass of Particle).
|
7
7
|
|
8
|
+
load_library :vecmath
|
9
|
+
|
8
10
|
module Runnable
|
9
11
|
def run
|
10
12
|
self.reject! { |item| item.dead? }
|
@@ -12,28 +14,6 @@ module Runnable
|
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
|
-
class Vector
|
16
|
-
attr_accessor :x, :y
|
17
|
-
|
18
|
-
def initialize(x, y)
|
19
|
-
@x, @y = x, y
|
20
|
-
end
|
21
|
-
|
22
|
-
def +(other)
|
23
|
-
return Vector.new(@x + other, @y + other) if other.is_a?(Numeric)
|
24
|
-
return Vector.new(@x + other.x, @y + other.y) if other.is_a?(Vector)
|
25
|
-
self
|
26
|
-
end
|
27
|
-
|
28
|
-
def heading
|
29
|
-
-1 * Math::atan2(-@y, @x)
|
30
|
-
end
|
31
|
-
|
32
|
-
def magnitude
|
33
|
-
@x * @x + @y * @y
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
17
|
|
38
18
|
class ParticleSystem
|
39
19
|
extend Enumerable
|
@@ -70,7 +50,7 @@ def setup
|
|
70
50
|
size 640, 580
|
71
51
|
color_mode(RGB, 255, 255, 255, 100)
|
72
52
|
ellipse_mode(CENTER)
|
73
|
-
@particle_systems = ParticleSystem.new(rand(21) + 5,
|
53
|
+
@particle_systems = ParticleSystem.new(rand(21) + 5, Vec2D.new(width/2, height/2))
|
74
54
|
end
|
75
55
|
|
76
56
|
def draw
|
@@ -80,7 +60,7 @@ end
|
|
80
60
|
|
81
61
|
def mouse_pressed
|
82
62
|
origin = rand(21) + 5
|
83
|
-
vector =
|
63
|
+
vector = Vec2D.new(mouse_x, mouse_y)
|
84
64
|
@particle_systems << ParticleSystem.new(origin, vector)
|
85
65
|
end
|
86
66
|
|
@@ -88,8 +68,8 @@ end
|
|
88
68
|
class Particle
|
89
69
|
def initialize(origin)
|
90
70
|
@origin = origin
|
91
|
-
@velocity =
|
92
|
-
@acceleration =
|
71
|
+
@velocity = Vec2D.new(rand(-1.0 .. 1), rand(-2.0 .. 0))
|
72
|
+
@acceleration = Vec2D.new(0, 0.05)
|
93
73
|
@radius = 10
|
94
74
|
@lifespan = 100
|
95
75
|
end
|
@@ -129,7 +109,7 @@ class Particle
|
|
129
109
|
translate(@origin.x, @origin.y)
|
130
110
|
rotate(@velocity.heading)
|
131
111
|
|
132
|
-
length = @velocity.
|
112
|
+
length = @velocity.mag * scale
|
133
113
|
|
134
114
|
line 0, 0, length, 0
|
135
115
|
line length, 0, length - arrow_size, arrow_size / 2
|
@@ -155,7 +135,7 @@ class CrazyParticle < Particle
|
|
155
135
|
|
156
136
|
def update
|
157
137
|
super
|
158
|
-
@theta += @velocity.x * @velocity.
|
138
|
+
@theta += @velocity.x * @velocity.mag / 10
|
159
139
|
end
|
160
140
|
|
161
141
|
def grow
|
@@ -4,11 +4,13 @@
|
|
4
4
|
# time. A ParticleSystem (Array) object manages a variable size list of
|
5
5
|
# particles.
|
6
6
|
|
7
|
+
load_library :vecmath
|
8
|
+
|
7
9
|
attr_reader :ps
|
8
10
|
|
9
11
|
def setup
|
10
12
|
size(640,360)
|
11
|
-
@ps = ParticleSystem.new(
|
13
|
+
@ps = ParticleSystem.new(Vec2D.new(width/2, 50))
|
12
14
|
end
|
13
15
|
|
14
16
|
def draw
|
@@ -32,7 +34,7 @@ class ParticleSystem
|
|
32
34
|
|
33
35
|
def initialize(loc)
|
34
36
|
@particle_system = []
|
35
|
-
@origin = loc.
|
37
|
+
@origin = loc.dup
|
36
38
|
end
|
37
39
|
|
38
40
|
def each &block
|
@@ -60,9 +62,9 @@ class Particle
|
|
60
62
|
|
61
63
|
attr_reader :loc, :vel, :acc, :lifespan
|
62
64
|
def initialize(l)
|
63
|
-
@acc =
|
64
|
-
@vel =
|
65
|
-
@loc = l.
|
65
|
+
@acc = Vec2D.new(0, 0.05)
|
66
|
+
@vel = Vec2D.new(rand(-1.0 .. 1), rand(-2.0 .. 0))
|
67
|
+
@loc = l.dup
|
66
68
|
@lifespan = 255.0
|
67
69
|
end
|
68
70
|
|
@@ -73,8 +75,8 @@ class Particle
|
|
73
75
|
|
74
76
|
# Method to update loc
|
75
77
|
def update
|
76
|
-
vel
|
77
|
-
loc
|
78
|
+
@vel += acc
|
79
|
+
@loc += vel
|
78
80
|
@lifespan -= 1.0
|
79
81
|
end
|
80
82
|
|
@@ -3,20 +3,21 @@
|
|
3
3
|
#
|
4
4
|
# A ParticleSystem (Array) object manages a variable size list of
|
5
5
|
# particles.
|
6
|
+
load_library :vecmath
|
6
7
|
|
7
8
|
attr_reader :ps, :img, :wind
|
8
9
|
|
9
10
|
def setup
|
10
11
|
size(640,360)
|
11
12
|
@img = load_image("texture.png")
|
12
|
-
@ps = ParticleSystem.new(0,
|
13
|
+
@ps = ParticleSystem.new(0, Vec2D.new(width/2, height - 60), img)
|
13
14
|
end
|
14
15
|
|
15
16
|
def draw
|
16
17
|
background(0)
|
17
18
|
# Calculate a "wind" force based on mouse horizontal position
|
18
19
|
dx = map(mouse_x, 0, width, -0.2, 0.2)
|
19
|
-
@wind =
|
20
|
+
@wind = Vec2D.new(dx, 0)
|
20
21
|
ps.apply_force(wind)
|
21
22
|
ps.run
|
22
23
|
2.times do
|
@@ -24,7 +25,7 @@ def draw
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# Draw a horizontal arrow representing the wind force
|
27
|
-
draw_vector(wind,
|
28
|
+
draw_vector(wind, Vec2D.new(width / 2, 50, 0), 500)
|
28
29
|
|
29
30
|
end
|
30
31
|
|
@@ -33,7 +34,7 @@ def draw_vector(v, loc, scayl)
|
|
33
34
|
push_matrix
|
34
35
|
# Translate to location to render vector
|
35
36
|
translate(loc.x, loc.y)
|
36
|
-
rotate(v.
|
37
|
+
rotate(v.heading)
|
37
38
|
# Calculate length of vector & scale as necessary
|
38
39
|
len = v.mag * scayl
|
39
40
|
# Draw three lines to make an arrow
|
@@ -63,7 +64,7 @@ class ParticleSystem
|
|
63
64
|
|
64
65
|
def initialize(num, location, image)
|
65
66
|
@particles = []
|
66
|
-
@origin = location.
|
67
|
+
@origin = location.dup
|
67
68
|
@image = image
|
68
69
|
(0 ... num).each do
|
69
70
|
particles << Particle.new(origin, image)
|
@@ -98,11 +99,11 @@ class Particle
|
|
98
99
|
attr_reader :loc, :acc, :vel, :lifespan, :img, :generator
|
99
100
|
|
100
101
|
def initialize(l, img_)
|
101
|
-
@acc =
|
102
|
+
@acc = Vec2D.new(0, 0)
|
102
103
|
vx = random_gaussian * 0.3
|
103
104
|
vy = random_gaussian * 0.3 - 1.0
|
104
|
-
@vel =
|
105
|
-
@loc = l.
|
105
|
+
@vel = Vec2D.new(vx, vy)
|
106
|
+
@loc = l.dup()
|
106
107
|
@lifespan = 100.0
|
107
108
|
@img = img_
|
108
109
|
end
|
@@ -114,8 +115,8 @@ class Particle
|
|
114
115
|
|
115
116
|
# Method to update location
|
116
117
|
def update
|
117
|
-
vel
|
118
|
-
loc
|
118
|
+
@vel += acc
|
119
|
+
@loc += vel
|
119
120
|
@lifespan -= 1.0
|
120
121
|
end
|
121
122
|
|
@@ -128,7 +129,7 @@ class Particle
|
|
128
129
|
|
129
130
|
# Method to add a force vector to all particles currently in the system
|
130
131
|
def apply_force(f)
|
131
|
-
@acc
|
132
|
+
@acc += f
|
132
133
|
end
|
133
134
|
|
134
135
|
end
|