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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG +5 -0
  4. data/README.md +4 -2
  5. data/lib/ruby-processing/exporters/application_exporter.rb +1 -0
  6. data/lib/ruby-processing/version.rb +1 -1
  7. data/library/boids/boids.rb +14 -13
  8. data/library/vecmath/lib/vec.rb +20 -4
  9. data/samples/contributed/circle_collision.rb +92 -149
  10. data/samples/contributed/drawolver.rb +13 -27
  11. data/samples/contributed/elegant_ball.rb +158 -0
  12. data/samples/contributed/fern.rb +16 -3
  13. data/samples/contributed/flight_patterns.rb +16 -4
  14. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/bumpy_surface_noise.rb +4 -9
  15. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/data/java_args.txt +0 -0
  16. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/custom_shape/custom_shape.rb +1 -1
  17. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/particle_system/particle_system.rb +7 -10
  18. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/library/surface/surface.rb +2 -2
  19. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/liquidy.rb +7 -7
  20. data/samples/external_library/java_processing/{pbox2d → box2d_processing}/polygons.rb +4 -9
  21. data/samples/external_library/java_processing/custom/README.md +15 -0
  22. data/samples/external_library/java_processing/custom/Rakefile +28 -0
  23. data/samples/external_library/java_processing/custom/landscape.rb +58 -0
  24. data/samples/external_library/java_processing/custom/src/nn/Connection.java +47 -0
  25. data/samples/external_library/java_processing/custom/src/nn/HiddenNeuron.java +20 -0
  26. data/samples/external_library/java_processing/custom/src/nn/InputNeuron.java +23 -0
  27. data/samples/external_library/java_processing/custom/src/nn/Network.java +136 -0
  28. data/samples/external_library/java_processing/custom/src/nn/Neuron.java +79 -0
  29. data/samples/external_library/java_processing/custom/src/nn/OutputNeuron.java +7 -0
  30. data/samples/external_library/java_processing/custom/xor.rb +88 -0
  31. data/samples/external_library/ruby_gem/README +1 -1
  32. data/samples/external_library/ruby_gem/data/data.json +8 -0
  33. data/samples/external_library/ruby_gem/draw_test.rb +171 -0
  34. data/samples/processing_app/basics/form/icosahedra.rb +39 -0
  35. data/samples/processing_app/basics/form/library/icosahedron/icosahedron.rb +60 -0
  36. data/samples/processing_app/basics/form/toroid.rb +78 -92
  37. data/samples/processing_app/basics/transform/birds.rb +6 -12
  38. data/samples/processing_app/basics/transform/cubes_in_cube.rb +25 -22
  39. data/samples/processing_app/basics/transform/library/cube/cube.rb +16 -16
  40. data/samples/processing_app/basics/transform/rotate_push_pop.rb +1 -1
  41. data/samples/processing_app/demos/graphics/bezier_patch.rb +18 -31
  42. data/samples/processing_app/demos/graphics/trefoil.rb +15 -15
  43. data/samples/processing_app/library/vecmath/acceleration_with_vectors.rb +3 -3
  44. data/samples/processing_app/library/vecmath/hilbert_fractal.rb +2 -2
  45. data/samples/processing_app/library/vecmath/library/flock/flock.rb +18 -21
  46. data/samples/processing_app/library/vecmath/library/hilbert/hilbert.rb +11 -8
  47. data/samples/processing_app/library/vecmath/library/wiggler/wiggler.rb +7 -15
  48. data/samples/processing_app/library/vecmath/seeking_neural.rb +172 -0
  49. data/samples/processing_app/topics/animation/animated_sprite.rb +5 -8
  50. data/samples/processing_app/topics/animation/sequential.rb +2 -3
  51. data/samples/processing_app/topics/create_shapes/library/particle/particle_system.rb +7 -7
  52. data/samples/processing_app/topics/create_shapes/particle_system_pshape.rb +2 -2
  53. data/samples/processing_app/topics/create_shapes/wiggle_pshape.rb +2 -1
  54. data/samples/processing_app/topics/lsystems/koch.rb +1 -1
  55. data/samples/processing_app/topics/lsystems/library/koch/koch_fractal.rb +24 -23
  56. data/samples/processing_app/topics/motion/circle_collision.rb +117 -160
  57. data/samples/processing_app/topics/motion/library/cube/cube.rb +1 -1
  58. data/samples/processing_app/topics/motion/morph.rb +1 -1
  59. data/samples/processing_app/topics/motion/reflection1.rb +17 -16
  60. data/samples/processing_app/topics/shaders/conway.rb +2 -2
  61. data/samples/processing_app/topics/shaders/data/conway.glsl +10 -10
  62. data/samples/processing_app/topics/shaders/glsl_heightmap_noise.rb +9 -8
  63. data/samples/processing_app/topics/shaders/landscape.rb +1 -1
  64. data/samples/processing_app/topics/simulate/flocking.rb +1 -1
  65. data/samples/processing_app/topics/simulate/library/flock/flock.rb +62 -57
  66. data/samples/processing_app/topics/simulate/multiple_particle_systems.rb +8 -28
  67. data/samples/processing_app/topics/simulate/simple_particle_system.rb +9 -7
  68. data/samples/processing_app/topics/simulate/smoke_particle_system.rb +12 -11
  69. data/vendors/Rakefile +2 -2
  70. metadata +26 -21
  71. data/samples/contributed/pong.rb +0 -177
  72. data/samples/contributed/simple_buffer.rb +0 -44
  73. data/samples/external_library/java_processing/pbox2d/contact_test.rb +0 -23
  74. data/samples/processing_app/basics/form/icosahedra/icosahedra.rb +0 -72
  75. data/samples/processing_app/basics/form/icosahedra/icosahedron.rb +0 -116
  76. data/samples/processing_app/basics/form/icosahedra/shape_3D.rb +0 -25
@@ -5,34 +5,28 @@
5
5
  # pushMatrix() / popMatrix() functions.
6
6
  # Trigonometry functions handle the flapping and sinuous movement.
7
7
 
8
- load_library 'bird'
8
+ load_library :bird
9
9
 
10
10
  BIRD_COUNT = 200
11
11
 
12
- def setup
13
-
12
+ def setup
14
13
  size 640, 360, P3D
15
14
  no_stroke
16
15
  lights
17
- @birds = []
18
-
19
- 0.upto(BIRD_COUNT) { |i|
20
-
16
+ @birds = []
17
+ 0.upto(BIRD_COUNT) do |i|
21
18
  bird = Bird.new rand(-300 .. 300), rand(-300 .. 300), rand(-2500 .. -500), rand(5 .. 30), rand(5 .. 30)
22
19
  bird.set_flight rand(20 .. 340), rand(30 .. 350), rand( 1000 .. 4800 ),
23
20
  rand(-160 .. 160), rand(-55 .. 55), rand(-20 .. 20)
24
21
  bird.set_wing_speed rand(0.1 .. 3.75)
25
22
  bird.set_rot_speed rand(0.025 .. 0.15)
26
23
  @birds << bird
27
- }
28
-
24
+ end
29
25
  end
30
26
 
31
27
  def draw
32
28
  background 0
33
29
  translate width/2, height/2, -700
34
- @birds.each do |b|
35
- b.fly
36
- end
30
+ @birds.each {|b| b.fly}
37
31
  end
38
32
 
@@ -2,11 +2,12 @@
2
2
  # by Ira Greenberg.
3
3
  #
4
4
  # Collision detection against all outer cube's surfaces.
5
- # Uses the PVector and Cube classes.
5
+ # Uses the Vec3D and Cube classes.
6
6
 
7
7
  # fjenett, 2010-03-12: did some cleanups and rubyfication here
8
+ # Martin Prout went a bit further on 2014-03-26
8
9
 
9
- load_library 'cube'
10
+ load_libraries :vecmath, :cube
10
11
 
11
12
 
12
13
  def setup
@@ -18,18 +19,14 @@ def setup
18
19
  @cube_count = 20
19
20
  @cubes = []
20
21
 
21
- 0.upto( @cube_count ) { |i|
22
-
23
- cube_size = rand(5 .. 15)
24
-
25
- c = Cube.new(cube_size, cube_size, cube_size)
26
-
27
- c.position = PVector.new(0.0, 0.0, 0.0)
28
- c.speed = PVector.new(rand(-1 .. 1), rand(-1 .. 1), rand(-1 .. 1))
29
- c.rotation = PVector.new(rand(40 .. 100), rand(40 .. 100), rand(40 .. 100))
30
-
22
+ 0.upto( @cube_count ) do |i|
23
+ cube_size = rand(5 .. 15)
24
+ c = Cube.new(cube_size)
25
+ c.position = Vec3D.new(0.0, 0.0, 0.0)
26
+ c.speed = Vec3D.new(rand(-1.0 .. 1), rand(-1.0 .. 1), rand(-1.0 .. 1))
27
+ c.rotation = Vec3D.new(rand(40 .. 100), rand(40 .. 100), rand(40 .. 100))
31
28
  @cubes << c
32
- }
29
+ end
33
30
 
34
31
  @cube_colors = [
35
32
  color(0), color(51), color(102), color(153), color(204), color(255)
@@ -37,7 +34,7 @@ def setup
37
34
  @cube_colors.reverse
38
35
 
39
36
  @stage_size = 300
40
- @stage = Cube.new @stage_size, @stage_size, @stage_size
37
+ @stage = Cube.new @stage_size
41
38
 
42
39
  end
43
40
 
@@ -56,7 +53,7 @@ def draw
56
53
 
57
54
  @stage.draw
58
55
 
59
- @cubes.each_with_index { |c, i|
56
+ @cubes.each_with_index do |c, i|
60
57
 
61
58
  # draw cube
62
59
  push_matrix
@@ -75,25 +72,31 @@ def draw
75
72
  pop_matrix
76
73
 
77
74
  # move it
78
- c.position.add c.speed
75
+ c.position += c.speed
79
76
 
80
77
  # draw lines
81
78
  if i > 0
82
79
 
83
80
  stroke 0
84
- c2 = @cubes[i-1]
81
+ c2 = @cubes[i - 1]
85
82
  line c.position.x, c.position.y, c.position.z,
86
83
  c2.position.x, c2.position.y, c2.position.z
87
84
 
88
85
  end
89
86
 
90
87
  # collision
91
- s2 = @stage_size / 2
92
- c.speed.x *= -1 if (c.position.x / s2).abs > 1 # note that in Ruby abs(-12) is -12.abs
93
- c.speed.y *= -1 if (c.position.y / s2).abs > 1
94
- c.speed.z *= -1 if (c.position.z / s2).abs > 1
95
- }
88
+ boundary = Boundary.new(-@stage_size / 2, @stage_size / 2)
89
+ c.speed.x *= -1 unless boundary.include? c.position.x
90
+ c.speed.y *= -1 unless boundary.include? c.position.y
91
+ c.speed.z *= -1 unless boundary.include? c.position.z
92
+ end
96
93
 
97
94
  end
95
+
96
+ Boundary = Struct.new(:lower, :upper) do
97
+ def include? x
98
+ (lower ... upper).cover? x
99
+ end
100
+ end
98
101
 
99
102
 
@@ -4,25 +4,25 @@ class Cube
4
4
 
5
5
  attr_accessor :vertices
6
6
  attr_accessor :w, :h, :d
7
- attr_accessor :position, :speed, :rotation # PVector
7
+ attr_accessor :position, :speed, :rotation # Vec3D
8
8
 
9
- def initialize (w, h, d)
9
+ def initialize (dim)
10
10
 
11
- @w, @h, @d = w, h, d
11
+ @w, @h, @d = dim, dim, dim
12
12
 
13
- w2 = @w/2
14
- h2 = @h/2
15
- d2 = @d/2
13
+ w2 = @w / 2
14
+ h2 = @h / 2
15
+ d2 = @d / 2
16
16
 
17
- tfl = PVector.new(-w2, h2, d2) # four points making the top quad:
18
- tfr = PVector.new(w2, h2, d2) # "tfl" is "top front left", etc
19
- tbr = PVector.new(w2, h2,-d2)
20
- tbl = PVector.new(-w2, h2,-d2)
17
+ tfl = Vec3D.new(-w2, h2, d2) # four points making the top quad:
18
+ tfr = Vec3D.new(w2, h2, d2) # "tfl" is "top front left", etc
19
+ tbr = Vec3D.new(w2, h2,-d2)
20
+ tbl = Vec3D.new(-w2, h2,-d2)
21
21
 
22
- bfl = PVector.new(-w2,-h2, d2) # bottom quad points
23
- bfr = PVector.new(w2,-h2, d2)
24
- bbr = PVector.new(w2,-h2,-d2)
25
- bbl = PVector.new(-w2,-h2,-d2)
22
+ bfl = Vec3D.new(-w2,-h2, d2) # bottom quad points
23
+ bfr = Vec3D.new(w2,-h2, d2)
24
+ bbr = Vec3D.new(w2,-h2,-d2)
25
+ bbl = Vec3D.new(-w2,-h2,-d2)
26
26
 
27
27
  @vertices = [
28
28
  [tfl, tfr, tbr, tbl], # top
@@ -42,9 +42,9 @@ class Cube
42
42
 
43
43
  fill side_colors[i] if side_colors && i < side_colors.length
44
44
 
45
- quad.each { |pvec|
45
+ quad.each { |vec|
46
46
 
47
- vertex pvec.x, pvec.y, pvec.z
47
+ vertex vec.x, vec.y, vec.z
48
48
  }
49
49
 
50
50
  end_shape
@@ -12,7 +12,7 @@ attr_reader :offset, :a, :num
12
12
  def setup
13
13
  size(640, 360, P3D)
14
14
  no_stroke
15
- @offset = PI/24.0
15
+ @offset = PI / 24.0
16
16
  @num = 12
17
17
  @a = 0
18
18
  end
@@ -70,17 +70,9 @@ end
70
70
  def build_geometry
71
71
  @outp = []
72
72
  @normp = []
73
- @inp = []
74
- uitang = PVector.new
75
- ujtang = PVector.new
76
-
77
- (0 ... NI).each do |i|
78
- row = Array.new
79
- (0 ... NJ).each do |j|
80
- row << PVector.new(i, j, rand(-3.0 .. 3.0))
81
- end
82
- inp << row
83
- end
73
+ @inp = Array.new(NI){|i| Array.new(NJ){|j| Vec3D.new(i, j, rand(-3.0 .. 3))}}
74
+ uitang = Vec3D.new
75
+ ujtang = Vec3D.new
84
76
 
85
77
  (0 ... RESI).each do |i|
86
78
  mui = i.fdiv(RESI - 1)
@@ -88,34 +80,29 @@ def build_geometry
88
80
  row_n = []
89
81
  (0 ... RESJ).each do |j|
90
82
  muj = j.fdiv(RESJ - 1)
91
- vect = PVector.new
92
- uitang.set(0, 0, 0)
93
- ujtang.set(0, 0, 0)
83
+ vect = Vec3D.new
84
+ uitang.x, uitang.y, uitang.z = 0, 0, 0
85
+ ujtang.x, ujtang.y, ujtang.z = 0, 0, 0
94
86
  (0 ... NI).each do |ki|
95
87
  bi = bezier_blend(ki, mui, NI)
96
88
  dbi = d_bezier_blend(ki, mui, NI)
97
89
  (0 ... NJ).each do |kj|
98
90
  bj = bezier_blend(kj, muj, NJ)
99
91
  dbj = d_bezier_blend(kj, muj, NJ)
100
- vect.x += (inp[ki][kj].x * bi * bj)
101
- vect.y += (inp[ki][kj].y * bi * bj)
102
- vect.z += (inp[ki][kj].z * bi * bj)
103
-
104
- uitang.x += (inp[ki][kj].x * dbi * bj)
105
- uitang.y += (inp[ki][kj].y * dbi * bj)
106
- uitang.z += (inp[ki][kj].z * dbi * bj)
107
-
108
- ujtang.x += (inp[ki][kj].x * bi * dbj)
109
- ujtang.y += (inp[ki][kj].y * bi * dbj)
110
- ujtang.z += (inp[ki][kj].z * bi * dbj)
92
+
93
+ vect += inp[ki][kj] * bi * bj
94
+
95
+ uitang += inp[ki][kj] * dbi * bj
96
+
97
+ ujtang += inp[ki][kj] * bi * dbj
111
98
  end
112
99
  end
113
- vect.add(PVector.new(-NI/2,-NJ/2,0))
114
- vect.mult(100)
115
- row << vect.array()
116
- uitang.normalize
117
- ujtang.normalize
118
- row_n << uitang.cross(ujtang).array()
100
+ vect += Vec3D.new(-NI / 2, -NJ / 2, 0)
101
+ vect *= 100
102
+ row << vect.to_a
103
+ uitang.normalize!
104
+ ujtang.normalize!
105
+ row_n << uitang.cross(ujtang).to_a
119
106
  end
120
107
  @outp << row
121
108
  @normp << row_n
@@ -2,6 +2,8 @@
2
2
  # A parametric surface is textured procedurally
3
3
  # by drawing on an offscreen PGraphics surface.
4
4
 
5
+ load_library :vecmath
6
+
5
7
  attr_reader :pg, :trefoil
6
8
 
7
9
  def setup
@@ -43,7 +45,7 @@ end
43
45
  # Code to draw a trefoil knot surface, with normals and texture
44
46
  # coordinates.
45
47
  # Adapted from the parametric equations example by Philip Rideout:
46
- # http:#iphone-3d-programming.labs.oreilly.com/ch03.html
48
+ # http://iphone-3d-programming.labs.oreilly.com/ch03.html
47
49
 
48
50
  # This function draws a trefoil knot surface as a triangle mesh derived
49
51
  # from its parametric equation.
@@ -100,12 +102,11 @@ def eval_normal(u, v)
100
102
  p = eval_point(u, v)
101
103
  tangU = eval_point(u + 0.01, v)
102
104
  tangV = eval_point(u, v + 0.01)
103
- tangU.sub(p)
104
- tangV.sub(p)
105
+ tangU -= p
106
+ tangV -= p
105
107
 
106
- normUV = tangV.cross(tangU)
107
- normUV.normalize
108
- return normUV
108
+ normUV = tangV.cross(tangU)
109
+ return normUV.normalize!
109
110
  end
110
111
 
111
112
  # Evaluates the surface point corresponding to normalized
@@ -115,26 +116,25 @@ def eval_point(u, v)
115
116
  b = 0.3
116
117
  c = 0.5
117
118
  d = 0.1
118
- s = TWO_PI * u
119
- t = (TWO_PI * (1 - v)) * 2
119
+ s = TAU * u
120
+ t = (TAU * (1 - v)) * 2
120
121
 
121
122
  r = a + b * cos(1.5 * t)
122
123
  x = r * cos(t)
123
124
  y = r * sin(t)
124
125
  z = c * sin(1.5 * t)
125
126
 
126
- dv = PVector.new
127
+ dv = Vec3D.new
127
128
  dv.x = -1.5 * b * sin(1.5 * t) * cos(t) - (a + b * cos(1.5 * t)) * sin(t)
128
129
  dv.y = -1.5 * b * sin(1.5 * t) * sin(t) + (a + b * cos(1.5 * t)) * cos(t)
129
130
  dv.z = 1.5 * c * cos(1.5 * t)
130
131
 
131
- q = dv
132
- q.normalize
133
- qvn = PVector.new(q.y, -q.x, 0)
134
- qvn.normalize
135
- ww = q.cross(qvn)
132
+ dv.normalize!
133
+ qvn = Vec3D.new(dv.y, -dv.x, 0)
134
+ qvn.normalize!
135
+ ww = dv.cross(qvn)
136
136
 
137
- pt = PVector.new
137
+ pt = Vec3D.new
138
138
  pt.x = x + d * (qvn.x * cos(s) + ww.x * sin(s))
139
139
  pt.y = y + d * (qvn.y * cos(s) + ww.y * sin(s))
140
140
  pt.z = z + d * ww.z * sin(s)
@@ -57,9 +57,9 @@ class Mover
57
57
  # Velocity changes according to acceleration vector
58
58
  @velocity += acceleration
59
59
  # Limit the velocity to topspeed, PVector has a limit function
60
- if velocity.mag_squared > topspeed**2
61
- velocity.set_mag topspeed
62
- end
60
+ # here we supply a block that evaluates to a boolean to set
61
+ # the velocit conditionally
62
+ velocity.set_mag topspeed {velocity.mag_squared > topspeed**2}
63
63
  # Location changes by velocity vector
64
64
  @location += velocity
65
65
  end
@@ -7,13 +7,13 @@
7
7
  ########################################################
8
8
 
9
9
  load_libraries :hilbert, :vecmath
10
- import 'vecmath'
10
+
11
11
  attr_reader :hilbert, :arcball
12
12
 
13
13
  def setup
14
14
  size 1024, 768, P3D
15
15
  @arcball = ArcBall.new(width/2.0, height/2.0, min(width - 20, height - 20) * 0.5)
16
- @hilbert = Hilbert.new(height/2, 3)
16
+ @hilbert = Hilbert.new(size: height/2, gen: 3)
17
17
  no_stroke
18
18
  end
19
19
 
@@ -13,6 +13,10 @@ class Flock
13
13
  boids.each &block
14
14
  end
15
15
 
16
+ def reject &block
17
+ boids &block
18
+ end
19
+
16
20
  def << obj
17
21
  boids << obj
18
22
  end
@@ -72,10 +76,8 @@ class Boid
72
76
  def update
73
77
  # Update velocity
74
78
  @velocity += acceleration
75
- # Limit speed
76
- if velocity.mag_squared > maxspeed**2
77
- velocity.set_mag(maxspeed)
78
- end
79
+ # Limit speed
80
+ velocity.set_mag(maxspeed) {velocity.mag_squared > maxspeed**2}
79
81
  @location += velocity
80
82
  # Reset accelertion to 0 each cycle
81
83
  @acceleration *= 0
@@ -90,9 +92,8 @@ class Boid
90
92
  desired *= maxspeed
91
93
  # Steering = Desired minus Velocity
92
94
  steer = desired - velocity
93
- if steer.mag_squared > maxforce**2 # Limit to maximum steering force
94
- steer.set_mag(maxforce)
95
- end
95
+ # Limit to maximum steering force
96
+ steer.set_mag(maxforce) {steer.mag_squared > maxforce**2}
96
97
  return steer
97
98
  end
98
99
 
@@ -134,10 +135,10 @@ class Boid
134
135
  desiredseparation = 25.0
135
136
  steer = Vec2D.new
136
137
  count = 0
137
- # For every boid in the system, check if it's too close
138
- boids.each do |other|
138
+ # For every other bird in the system, check if it's too close
139
+ boids.reject{|bd| bd.equal? self}.each do |other|
139
140
  d = Vec2D.dist(location, other.location)
140
- # If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
141
+ # If the distance is greater than 0 and less than an arbitrary amount
141
142
  if ((d > 0) && (d < desiredseparation))
142
143
  # Calculate vector pointing away from neighbor
143
144
  diff = location - other.location
@@ -157,21 +158,19 @@ class Boid
157
158
  # Implement Reynolds: Steering = Desired - Velocity
158
159
  steer.normalize!
159
160
  steer *= maxspeed
160
- steer -= velocity
161
- if steer.mag_squared > maxforce**2
162
- steer.set_mag(maxforce)
163
- end
161
+ steer -= velocity
162
+ steer.set_mag(maxforce){steer.mag_squared > maxforce**2}
164
163
  end
165
164
  return steer
166
165
  end
167
166
 
168
167
  # Alignment
169
- # For every nearby boid in the system, calculate the average velocity
168
+ # For every other nearby boid in the system, calculate the average velocity
170
169
  def align boids
171
170
  neighbordist = 50
172
171
  sum = Vec2D.new
173
172
  count = 0
174
- boids.each do |other|
173
+ boids.reject{|bd| bd.equal? self}.each do |other|
175
174
  d = Vec2D.dist_squared(location, other.location)
176
175
  if ((d > 0) && (d < neighbordist * neighbordist))
177
176
  sum += other.velocity
@@ -183,9 +182,7 @@ class Boid
183
182
  sum.normalize!
184
183
  sum *= maxspeed
185
184
  steer = sum - velocity
186
- if steer.mag_squared > maxforce**2
187
- steer.set_mag(maxforce)
188
- end
185
+ steer.set_mag(maxforce){steer.mag_squared > maxforce**2}
189
186
  return steer
190
187
  else
191
188
  return Vec2D.new
@@ -193,12 +190,12 @@ class Boid
193
190
  end
194
191
 
195
192
  # Cohesion
196
- # For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location
193
+ # For the average location (i.e. center) of all other nearby boids, calculate steering vector towards that location
197
194
  def cohesion boids
198
195
  neighbordist = 50
199
196
  sum = Vec2D.new # Start with empty vector to accumulate all locations
200
197
  count = 0
201
- boids.each do |other|
198
+ boids.reject{|bd| bd.equal? self}.each do |other|
202
199
  d = Vec2D.dist_squared(location, other.location)
203
200
  if ((d > 0) && (d < neighbordist * neighbordist))
204
201
  sum += other.location # Add location