ruby-processing 2.4.3 → 2.4.4

Sign up to get free protection for your applications and to get access to all the features.
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