ruby-processing 2.6.2 → 2.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rpextras.jar +0 -0
- data/lib/ruby-processing.rb +5 -8
- data/lib/ruby-processing/app.rb +26 -27
- data/lib/ruby-processing/config.rb +0 -2
- data/lib/ruby-processing/exporters/application_exporter.rb +1 -1
- data/lib/ruby-processing/exporters/base_exporter.rb +1 -1
- data/lib/ruby-processing/exporters/creator.rb +11 -11
- data/lib/ruby-processing/helper_methods.rb +33 -31
- data/lib/ruby-processing/helpers/numeric.rb +1 -1
- data/lib/ruby-processing/helpers/range.rb +11 -0
- data/lib/ruby-processing/library_loader.rb +11 -16
- data/lib/ruby-processing/runner.rb +22 -24
- data/lib/ruby-processing/runners/watch.rb +1 -1
- data/lib/ruby-processing/version.rb +1 -1
- data/library/boids/boids.rb +39 -70
- data/library/control_panel/control_panel.rb +3 -3
- data/samples/contributed/circle_collision.rb +3 -3
- data/samples/contributed/fern.rb +7 -10
- data/samples/contributed/fibonacci_sphere.rb +2 -2
- data/samples/contributed/full_screen.rb +23 -22
- data/samples/contributed/grapher.rb +3 -3
- data/samples/contributed/gravity.rb +1 -1
- data/samples/contributed/mandelbrot.rb +10 -13
- data/samples/external_library/java_processing/box2d_processing/bumpy_surface_noise.rb +1 -1
- data/samples/external_library/java_processing/box2d_processing/library/custom_shape/custom_shape.rb +2 -2
- data/samples/external_library/java_processing/box2d_processing/library/particle_system/particle_system.rb +1 -1
- data/samples/external_library/java_processing/box2d_processing/library/surface/surface.rb +2 -2
- data/samples/external_library/java_processing/box2d_processing/liquidy.rb +1 -1
- data/samples/external_library/java_processing/fisica/bubbles.rb +2 -2
- data/samples/external_library/java_processing/fisica/joints.rb +4 -4
- data/samples/external_library/java_processing/generative_design/node_spring_attractor.rb +2 -2
- data/samples/external_library/java_processing/geomerative/hello_world_rotate_firstletter.rb +7 -7
- data/samples/external_library/java_processing/hemesh/twin_iso.rb +3 -3
- data/samples/external_library/java_processing/pbox2d/bumpy_surface_noise.rb +1 -1
- data/samples/external_library/java_processing/pbox2d/library/custom_shape/custom_shape.rb +2 -2
- data/samples/external_library/java_processing/pbox2d/library/particle_system/particle_system.rb +1 -1
- data/samples/external_library/java_processing/pbox2d/library/surface/surface.rb +2 -2
- data/samples/external_library/java_processing/pbox2d/liquidy.rb +1 -1
- data/samples/external_library/java_processing/peasy_cam/library/hilbert/hilbert.rb +4 -4
- data/samples/external_library/ruby_gem/draw_test.rb +2 -2
- data/samples/external_library/ruby_gem/game_of_life.rb +3 -3
- data/samples/processing_app/basics/arrays/array_objects.rb +2 -2
- data/samples/processing_app/basics/color/hue.rb +1 -1
- data/samples/processing_app/basics/control/conditionals1.rb +5 -24
- data/samples/processing_app/basics/control/conditionals2.rb +1 -1
- data/samples/processing_app/basics/form/bezier_ellipse.rb +1 -1
- data/samples/processing_app/basics/form/brick_tower.rb +4 -8
- data/samples/processing_app/basics/form/regular_polygon.rb +1 -1
- data/samples/processing_app/basics/form/star.rb +1 -1
- data/samples/processing_app/basics/form/triangle_strip.rb +1 -1
- data/samples/processing_app/basics/input/storing_input.rb +1 -1
- data/samples/processing_app/basics/lights/spot.rb +1 -1
- data/samples/processing_app/basics/math/additive_wave.rb +2 -2
- data/samples/processing_app/basics/math/double_random.rb +2 -2
- data/samples/processing_app/basics/math/noise_wave.rb +1 -1
- data/samples/processing_app/basics/math/random.rb +1 -1
- data/samples/processing_app/basics/objects/module.rb +1 -1
- data/samples/processing_app/basics/objects/struct.rb +1 -1
- data/samples/processing_app/basics/structure/loop.rb +19 -14
- data/samples/processing_app/basics/structure/recursion2.rb +2 -2
- data/samples/processing_app/basics/textures/texture3.rb +13 -33
- data/samples/processing_app/basics/transform/birds.rb +5 -5
- data/samples/processing_app/basics/transform/cubes_in_cube.rb +3 -3
- data/samples/processing_app/basics/transform/rotate.rb +1 -1
- data/samples/processing_app/basics/typography/kinetic_type.rb +1 -1
- data/samples/processing_app/demos/graphics/bezier_patch.rb +34 -34
- data/samples/processing_app/demos/graphics/trefoil.rb +1 -1
- data/samples/processing_app/demos/graphics/wiggling.rb +5 -5
- data/samples/processing_app/demos/performance/esfera.rb +4 -4
- data/samples/processing_app/demos/performance/text_rendering.rb +1 -1
- data/samples/processing_app/library/dxf/simple_export.rb +3 -3
- data/samples/processing_app/library/pdf/complex_3D.rb +11 -11
- data/samples/processing_app/library/vecmath/vec2d/bouncing_ball.rb +1 -1
- data/samples/processing_app/library/vecmath/vec2d/circle_collision.rb +3 -3
- data/samples/processing_app/library/vecmath/vec2d/library/flock/flock.rb +5 -5
- data/samples/processing_app/library/vecmath/vec2d/library/particle/{particle_system.rb → particle.rb} +28 -21
- data/samples/processing_app/library/vecmath/vec2d/morph.rb +3 -3
- data/samples/processing_app/library/vecmath/vec2d/particle_system_pshape.rb +3 -3
- data/samples/processing_app/library/vecmath/vec2d/reflection1.rb +2 -2
- data/samples/processing_app/library/vecmath/vec2d/seeking_neural.rb +3 -2
- data/samples/processing_app/library/vecmath/vec2d/simple_particle_system.rb +1 -1
- data/samples/processing_app/library/vecmath/vec3d/frame_of_reference.rb +4 -4
- data/samples/processing_app/topics/advanced_data/library/word/word.rb +1 -1
- data/samples/processing_app/topics/advanced_data/load_save_XML.rb +1 -1
- data/samples/processing_app/topics/advanced_data/load_save_json.rb +1 -1
- data/samples/processing_app/topics/advanced_data/load_save_struct_yaml.rb +1 -1
- data/samples/processing_app/topics/advanced_data/load_save_yaml.rb +1 -1
- data/samples/processing_app/topics/advanced_data/threads_two.rb +1 -2
- data/samples/processing_app/topics/cellular_automata/game_of_life.rb +3 -3
- data/samples/processing_app/topics/cellular_automata/library/ca/ca.rb +2 -2
- data/samples/processing_app/topics/cellular_automata/library/cell/cell.rb +4 -4
- data/samples/processing_app/topics/cellular_automata/library/simple_cell/simple_cell.rb +1 -1
- data/samples/processing_app/topics/cellular_automata/spore1.rb +1 -1
- data/samples/processing_app/topics/cellular_automata/spore2.rb +1 -1
- data/samples/processing_app/topics/create_shapes/group_pshape.rb +2 -2
- data/samples/processing_app/topics/create_shapes/library/particle/particle_system.rb +3 -3
- data/samples/processing_app/topics/create_shapes/library/polygon/polygon.rb +2 -2
- data/samples/processing_app/topics/create_shapes/library/star/star.rb +3 -3
- data/samples/processing_app/topics/create_shapes/particle_system_pshape.rb +1 -1
- data/samples/processing_app/topics/create_shapes/path_pshape.rb +1 -1
- data/samples/processing_app/topics/drawing/scribble_plotter.rb +2 -2
- data/samples/processing_app/topics/gui/button.rb +16 -16
- data/samples/processing_app/topics/gui/rollover.rb +13 -13
- data/samples/processing_app/topics/image_processing/blur.rb +2 -2
- data/samples/processing_app/topics/image_processing/edge_detection.rb +2 -2
- data/samples/processing_app/topics/lsystems/cstest.rb +1 -1
- data/samples/processing_app/topics/lsystems/library/stochastic_grammar/stochastic_grammar.rb +1 -1
- data/samples/processing_app/topics/motion/bouncy_bubbles.rb +1 -1
- data/samples/processing_app/topics/motion/brownian.rb +2 -2
- data/samples/processing_app/topics/motion/circle_collision.rb +1 -1
- data/samples/processing_app/topics/motion/cubes_in_cube.rb +1 -1
- data/samples/processing_app/topics/motion/library/cube/cube.rb +2 -2
- data/samples/processing_app/topics/motion/morph.rb +11 -11
- data/samples/processing_app/topics/motion/moving_on_curves.rb +4 -4
- data/samples/processing_app/topics/motion/puff.rb +4 -4
- data/samples/processing_app/topics/motion/reflection1.rb +3 -3
- data/samples/processing_app/topics/motion/reflection2.rb +1 -1
- data/samples/processing_app/topics/shaders/bw_shader.rb +1 -1
- data/samples/processing_app/topics/shaders/glsl_heightmap_noise.rb +2 -2
- data/samples/processing_app/topics/simulate/flocking.rb +6 -6
- data/samples/processing_app/topics/simulate/library/flock/flock.rb +33 -41
- data/samples/processing_app/topics/simulate/multiple_particle_systems.rb +34 -60
- data/samples/processing_app/topics/simulate/simple_particle_system.rb +20 -32
- data/samples/processing_app/topics/simulate/smoke_particle_system.rb +45 -57
- data/samples/processing_app/topics/simulate/springs.rb +40 -44
- metadata +4 -5
- data/samples/processing_app/library/vecmath/vec2d/multiple_particle_systems.rb +0 -141
- data/samples/processing_app/library/vecmath/vec2d/smoke_particle_system.rb +0 -133
@@ -28,8 +28,8 @@ def draw
|
|
28
28
|
(1 ... img.height - 1).each do |y|
|
29
29
|
(1 ... img.width - 1).each do |x|
|
30
30
|
sum = 0 # Kernel sum for this pixel
|
31
|
-
(-1
|
32
|
-
(-1
|
31
|
+
(-1..1).each do |ky|
|
32
|
+
(-1..1).each do |kx|
|
33
33
|
# Calculate the adjacent pixel for this kernel point
|
34
34
|
pos = (y + ky) * img.width + (x + kx)
|
35
35
|
# Image is grayscale, red/green/blue are identical
|
@@ -25,8 +25,8 @@ def draw
|
|
25
25
|
(1 ... img.height - 1).each do |y|
|
26
26
|
(1 ... img.width - 1).each do |x|
|
27
27
|
sum = 0 # Kernel sum for this pixel
|
28
|
-
(-1
|
29
|
-
(-1
|
28
|
+
(-1..1).each do |ky|
|
29
|
+
(-1..1).each do |kx|
|
30
30
|
# Calculate the adjacent pixel for this kernel point
|
31
31
|
pos = (y + ky)*img.width + (x + kx)
|
32
32
|
# Image is grayscale, red/green/blue are identical
|
data/samples/processing_app/topics/lsystems/library/stochastic_grammar/stochastic_grammar.rb
CHANGED
@@ -17,7 +17,7 @@ class StochasticGrammar
|
|
17
17
|
#####################################################
|
18
18
|
|
19
19
|
def stochastic_rule(rules)
|
20
|
-
total = rules.
|
20
|
+
total = rules.reduce(0) do |sum, rule_and_weight|
|
21
21
|
sum + rule_and_weight[PROB]
|
22
22
|
end
|
23
23
|
srand
|
@@ -24,8 +24,8 @@ def draw
|
|
24
24
|
ay[i-1] = ay[i]
|
25
25
|
end
|
26
26
|
# Put a new value at the end of the array
|
27
|
-
ax[NUM-1] += rand(-RANGE
|
28
|
-
ay[NUM-1] += rand(-RANGE
|
27
|
+
ax[NUM-1] += rand(-RANGE..RANGE)
|
28
|
+
ay[NUM-1] += rand(-RANGE..RANGE)
|
29
29
|
|
30
30
|
# Constrain all points to the screen
|
31
31
|
ax[NUM-1] = constrain(ax[NUM-1], 0, width)
|
@@ -22,7 +22,7 @@ class Cube
|
|
22
22
|
# Random velocity vector
|
23
23
|
@velocity = Vect.random_3d
|
24
24
|
# Random rotation
|
25
|
-
@rotation = Vect.new(rand(40
|
25
|
+
@rotation = Vect.new(rand(40..100), rand(40..100), rand(40..100))
|
26
26
|
|
27
27
|
# cube composed of 6 quads
|
28
28
|
#front
|
@@ -116,7 +116,7 @@ end
|
|
116
116
|
Vect = Struct.new(:x, :y, :z) do
|
117
117
|
|
118
118
|
def self.random_3d
|
119
|
-
Vect.new(rand(-1
|
119
|
+
Vect.new(rand(-1..1.0), rand(-1..1.0), rand(-1..1.0))
|
120
120
|
end
|
121
121
|
|
122
122
|
def add v
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Morph.
|
3
|
-
# see vecmath library for a variant using Vec2D instead of PVector
|
2
|
+
# Morph.
|
3
|
+
# see vecmath library for a variant using Vec2D instead of PVector
|
4
4
|
# Changing one shape into another by interpolating
|
5
5
|
# vertices from one to another
|
6
6
|
#
|
@@ -14,10 +14,10 @@ def setup
|
|
14
14
|
@morph = []
|
15
15
|
@state = false
|
16
16
|
# Create a circle using vectors pointing from center
|
17
|
-
(0
|
17
|
+
(0..360).step(9) do |angle|
|
18
18
|
# Note we are not starting from 0 in order to match the
|
19
|
-
# path of a circle.
|
20
|
-
v = PVector.from_angle(
|
19
|
+
# path of a circle.
|
20
|
+
v = PVector.from_angle((angle - 135).radians)
|
21
21
|
v.mult(100)
|
22
22
|
circle << v
|
23
23
|
# Let's fill out morph Array with blank PVectors while we are at it
|
@@ -26,11 +26,11 @@ def setup
|
|
26
26
|
|
27
27
|
# A square is a bunch of vertices along straight lines
|
28
28
|
# Top of square
|
29
|
-
(-50
|
29
|
+
(-50..50).step(10) do |x|
|
30
30
|
square << PVector.new(x, -50)
|
31
31
|
end
|
32
32
|
# Right side
|
33
|
-
(-50
|
33
|
+
(-50..50).step(10) do |y|
|
34
34
|
square << PVector.new(50, y)
|
35
35
|
end
|
36
36
|
# Bottom, NB: can't negative step ruby so use your loaf
|
@@ -48,25 +48,25 @@ def draw
|
|
48
48
|
|
49
49
|
# We will keep how far the vertices are from their target
|
50
50
|
total_distance = 0
|
51
|
-
|
51
|
+
|
52
52
|
# Look at each vertex
|
53
53
|
circle.length.times do |i|
|
54
54
|
# Are we lerping to the circle or square?
|
55
55
|
v1 = (state)? circle[i] : square[i]
|
56
56
|
# Get the vertex we will draw
|
57
57
|
v2 = morph[i]
|
58
|
-
|
58
|
+
|
59
59
|
# Lerp to the target
|
60
60
|
v2.lerp(v1, 0.1)
|
61
61
|
# Check how far we are from target
|
62
62
|
total_distance += PVector.dist(v1, v2)
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
# If all the vertices are close, switch shape
|
66
66
|
if (total_distance < 0.1)
|
67
67
|
@state = !state
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
# Draw relative to center
|
71
71
|
translate(width/2, height/2)
|
72
72
|
stroke_weight(4)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Moving On Curves.
|
3
|
-
#
|
2
|
+
# Moving On Curves.
|
3
|
+
#
|
4
4
|
# In this example, the circles moves along the curve y = x^4.
|
5
5
|
# Click the mouse to have it move to a new position.
|
6
6
|
#
|
@@ -13,7 +13,7 @@ def setup
|
|
13
13
|
@begin_x = 20.0 # Initial x-coordinate
|
14
14
|
@begin_y = 10.0 # Initial y-coordinate
|
15
15
|
@end_x = 570.0 # Final x-coordinate
|
16
|
-
@end_y = 320.0 # Final y-coordinate
|
16
|
+
@end_y = 320.0 # Final y-coordinate
|
17
17
|
@exponent = 4 # Determines the curve
|
18
18
|
@x = 0.0 # Current x-coordinate
|
19
19
|
@y = 0.0 # Current y-coordinate
|
@@ -29,7 +29,7 @@ def draw
|
|
29
29
|
@pct += STEP
|
30
30
|
if (pct < 1.0)
|
31
31
|
@x = begin_x + (pct * dist_x)
|
32
|
-
@y = begin_y +
|
32
|
+
@y = begin_y + pct**exponent * dist_y
|
33
33
|
end
|
34
34
|
fill(255)
|
35
35
|
ellipse(x, y, 20, 20)
|
@@ -21,10 +21,10 @@ def setup
|
|
21
21
|
@speed_x = 0.7
|
22
22
|
@speed_y = 0.9
|
23
23
|
# Fill body arrays
|
24
|
-
@radii_x = Array.new(CELLS, rand(-7
|
25
|
-
@radii_y = Array.new(CELLS, rand(-7
|
26
|
-
@frequency = Array.new(CELLS, rand(-7
|
27
|
-
@cell_radius= Array.new(CELLS, rand(16
|
24
|
+
@radii_x = Array.new(CELLS, rand(-7..7))
|
25
|
+
@radii_y = Array.new(CELLS, rand(-7..7) )
|
26
|
+
@frequency = Array.new(CELLS, rand(-7..7) )
|
27
|
+
@cell_radius= Array.new(CELLS, rand(16..30) )
|
28
28
|
@angle = Array.new(CELLS, 0)
|
29
29
|
@px = Array.new(CELLS, 0)
|
30
30
|
@py = Array.new(CELLS, 0)
|
@@ -22,7 +22,7 @@ def setup
|
|
22
22
|
# start ellipse at middle top of screen
|
23
23
|
@position = Vec2D.new(width/2, 0)
|
24
24
|
# set initial random direction
|
25
|
-
@direction = Vec2D.new(rand(-1.0
|
25
|
+
@direction = Vec2D.new(rand(-1.0..1), rand(-1.0..1))
|
26
26
|
@velocity = Vec2D.new
|
27
27
|
end
|
28
28
|
|
@@ -87,8 +87,8 @@ def draw
|
|
87
87
|
@position.y = radius
|
88
88
|
@direction.y *= -1
|
89
89
|
# randomize base top
|
90
|
-
@base1.y = rand(height - 100
|
91
|
-
@base2.y = rand(height - 100
|
90
|
+
@base1.y = rand(height - 100..height)
|
91
|
+
@base2.y = rand(height - 100..height)
|
92
92
|
@coords = create_ground
|
93
93
|
end
|
94
94
|
end
|
@@ -53,10 +53,10 @@ def draw
|
|
53
53
|
rotate_z(frame_count * 0.005) # dynamic frameCount-based rotation over the Z axis
|
54
54
|
|
55
55
|
background(0) # black background
|
56
|
-
perspective(PI/3.0, width.to_f / height, 0.1,
|
56
|
+
perspective(PI/3.0, width.to_f / height, 0.1, 1_000_000) # perspective for close shapes
|
57
57
|
scale(750) # scale by 750 (the model itself is unit length
|
58
58
|
|
59
|
-
displace.set('time', millis /
|
59
|
+
displace.set('time', millis / 5_000.0) # feed time to the GLSL shader
|
60
60
|
shader(displace) # use shader
|
61
61
|
shape(height_map) # display the PShape
|
62
62
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
#
|
2
|
-
# Flocking
|
3
|
-
# by Daniel Shiffman.
|
4
|
-
#
|
2
|
+
# Flocking
|
3
|
+
# by Daniel Shiffman.
|
4
|
+
#
|
5
5
|
# An implementation of Craig Reynold's Boids program to simulate
|
6
|
-
# the flocking behavior of birds. Each boid steers itself based on
|
6
|
+
# the flocking behavior of birds. Each boid steers itself based on
|
7
7
|
# rules of avoidance, alignment, and coherence.
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# Click the mouse to add a new boid.
|
10
10
|
#
|
11
11
|
load_libraries :flock, :vecmath
|
@@ -17,7 +17,7 @@ def setup
|
|
17
17
|
@flock = Flock.new
|
18
18
|
# Add an initial set of boids into the system
|
19
19
|
150.times do
|
20
|
-
flock << Boid.new(width/2, height/2)
|
20
|
+
flock << Boid.new(width / 2, height / 2)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -1,63 +1,55 @@
|
|
1
1
|
# The Flock (a list of Boid objects)
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
class Flock
|
5
|
+
include Enumerable
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators(:@boids, :<<, :each)
|
2
8
|
|
3
|
-
class Flock
|
4
|
-
extend Enumerable
|
5
|
-
|
6
9
|
attr_reader :boids
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@boids = []
|
10
|
-
end
|
11
10
|
|
12
|
-
def
|
13
|
-
boids
|
14
|
-
end
|
15
|
-
|
16
|
-
def << obj
|
17
|
-
boids << obj
|
11
|
+
def initialize
|
12
|
+
@boids = []
|
18
13
|
end
|
19
14
|
|
20
15
|
def run
|
21
|
-
|
16
|
+
each do |bird|
|
22
17
|
bird.run(self) # Passing the entire list of boids to each boid individually
|
23
18
|
end
|
24
19
|
end
|
25
|
-
|
26
20
|
end
|
27
21
|
|
28
22
|
# The Boid class
|
29
23
|
|
30
24
|
class Boid
|
31
25
|
include Processing::Proxy
|
32
|
-
|
26
|
+
|
33
27
|
MAXSPEED = 2
|
34
28
|
MAXFORCE = 0.03
|
35
|
-
|
29
|
+
|
36
30
|
attr_reader :width, :height
|
37
|
-
attr_reader :location, :velocity, :acceleration, :sz
|
38
|
-
|
31
|
+
attr_reader :location, :velocity, :acceleration, :sz
|
32
|
+
|
39
33
|
def initialize(x, y)
|
40
34
|
@width, @height = $app.width, $app.height
|
41
35
|
@acceleration = Vec2D.new(0, 0)
|
42
|
-
@velocity = Vec2D.new(rand(-1.0
|
36
|
+
@velocity = Vec2D.new(rand(-1.0..1), rand(-1.0..1))
|
43
37
|
@location = Vec2D.new(x, y)
|
44
38
|
@sz = 4.0
|
45
|
-
@maxspeed_squared = MAXSPEED * MAXSPEED
|
46
|
-
@maxforce_squared = MAXFORCE * MAXFORCE
|
47
39
|
end
|
48
|
-
|
40
|
+
|
49
41
|
def run(boids)
|
50
42
|
flock(boids)
|
51
43
|
update
|
52
44
|
borders
|
53
45
|
render
|
54
46
|
end
|
55
|
-
|
47
|
+
|
56
48
|
def apply_force(force)
|
57
49
|
# We could add mass here if we want A = F / M
|
58
50
|
@acceleration += force
|
59
51
|
end
|
60
|
-
|
52
|
+
|
61
53
|
# We accumulate a new acceleration each time based on three rules
|
62
54
|
def flock boids
|
63
55
|
sep = separate(boids) # Separation
|
@@ -72,18 +64,18 @@ class Boid
|
|
72
64
|
apply_force(ali)
|
73
65
|
apply_force(coh)
|
74
66
|
end
|
75
|
-
|
67
|
+
|
76
68
|
# Method to update location
|
77
69
|
def update
|
78
70
|
# Update velocity
|
79
71
|
@velocity += acceleration
|
80
72
|
# Limit speed
|
81
|
-
velocity.set_mag(MAXSPEED) {velocity.
|
73
|
+
velocity.set_mag(MAXSPEED) {velocity.mag > MAXSPEED}
|
82
74
|
@location += velocity
|
83
75
|
# Reset accelertion to 0 each cycle
|
84
76
|
@acceleration *= 0
|
85
77
|
end
|
86
|
-
|
78
|
+
|
87
79
|
# A method that calculates and applies a steering force towards a target
|
88
80
|
# STEER = DESIRED MINUS VELOCITY
|
89
81
|
def seek(target)
|
@@ -93,13 +85,13 @@ class Boid
|
|
93
85
|
desired *= MAXSPEED
|
94
86
|
# Steering = Desired minus Velocity
|
95
87
|
steer = desired - velocity
|
96
|
-
steer.set_mag(MAXFORCE) {steer.
|
88
|
+
steer.set_mag(MAXFORCE) {steer.mag > MAXFORCE} # Limit to maximum steering force
|
97
89
|
steer
|
98
90
|
end
|
99
91
|
|
100
92
|
def render
|
101
93
|
# Draw a triangle rotated in the direction of velocity
|
102
|
-
theta = velocity.heading + radians
|
94
|
+
theta = velocity.heading + 90.radians
|
103
95
|
fill(200,100)
|
104
96
|
stroke(255)
|
105
97
|
push_matrix
|
@@ -115,7 +107,7 @@ class Boid
|
|
115
107
|
|
116
108
|
# Wraparound
|
117
109
|
def borders
|
118
|
-
if (location.x < -sz * 0.5)
|
110
|
+
if (location.x < -sz * 0.5)
|
119
111
|
location.x = width + sz * 0.5
|
120
112
|
end
|
121
113
|
if (location.y < -sz * 0.5)
|
@@ -128,7 +120,7 @@ class Boid
|
|
128
120
|
location.y = -sz * 0.5
|
129
121
|
end
|
130
122
|
end
|
131
|
-
|
123
|
+
|
132
124
|
# Separation
|
133
125
|
# Method checks for nearby boids and steers away
|
134
126
|
def separate boids
|
@@ -137,7 +129,7 @@ class Boid
|
|
137
129
|
count = 0
|
138
130
|
# For every boid in the system, check if it's too close
|
139
131
|
boids.each do |other|
|
140
|
-
d =
|
132
|
+
d = location.dist(other.location)
|
141
133
|
# If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
|
142
134
|
if ((d > 0) && (d < desiredseparation))
|
143
135
|
# Calculate vector pointing away from neighbor
|
@@ -152,18 +144,18 @@ class Boid
|
|
152
144
|
if (count > 0)
|
153
145
|
steer /= count.to_f
|
154
146
|
end
|
155
|
-
|
147
|
+
|
156
148
|
# As long as the vector is greater than 0
|
157
149
|
if (steer.mag > 0)
|
158
150
|
# Implement Reynolds: Steering = Desired - Velocity
|
159
151
|
steer.normalize!
|
160
152
|
steer *= MAXSPEED
|
161
153
|
steer -= velocity
|
162
|
-
steer.set_mag(MAXFORCE) {steer.
|
154
|
+
steer.set_mag(MAXFORCE) {steer.mag > MAXFORCE}
|
163
155
|
end
|
164
156
|
return steer
|
165
157
|
end
|
166
|
-
|
158
|
+
|
167
159
|
# Alignment
|
168
160
|
# For every nearby boid in the system, calculate the average velocity
|
169
161
|
def align boids
|
@@ -171,7 +163,7 @@ class Boid
|
|
171
163
|
sum = Vec2D.new(0, 0)
|
172
164
|
count = 0
|
173
165
|
boids.each do |other|
|
174
|
-
d =
|
166
|
+
d = location.dist(other.location)
|
175
167
|
if ((d > 0) && (d < neighbordist))
|
176
168
|
sum += other.velocity
|
177
169
|
count += 1
|
@@ -182,13 +174,13 @@ class Boid
|
|
182
174
|
sum.normalize!
|
183
175
|
sum *= MAXSPEED
|
184
176
|
steer = sum - velocity
|
185
|
-
steer.set_mag(MAXFORCE) {steer.
|
177
|
+
steer.set_mag(MAXFORCE) {steer.mag > MAXFORCE}
|
186
178
|
return steer
|
187
179
|
else
|
188
180
|
return Vec2D.new
|
189
181
|
end
|
190
182
|
end
|
191
|
-
|
183
|
+
|
192
184
|
# Cohesion
|
193
185
|
# For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location
|
194
186
|
def cohesion boids
|
@@ -196,14 +188,14 @@ class Boid
|
|
196
188
|
sum = Vec2D.new # Start with empty vector to accumulate all locations
|
197
189
|
count = 0
|
198
190
|
boids.each do |other|
|
199
|
-
d =
|
191
|
+
d = location.dist(other.location)
|
200
192
|
if ((d > 0) && (d < neighbordist))
|
201
193
|
sum += other.location # Add location
|
202
194
|
count += 1
|
203
195
|
end
|
204
196
|
end
|
205
197
|
sum /= count unless (count == 0) # avoid div by zero
|
206
|
-
return (count > 0)? seek(sum) : Vec2D.new
|
198
|
+
return (count > 0)? seek(sum) : Vec2D.new
|
207
199
|
end
|
208
200
|
end
|
209
201
|
|