steering_behaviors 1.0.5 → 1.0.6

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.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog for steering-behaviors
2
2
 
3
+ ## 1.0.6, 11 August 2013
4
+ * Refined 'separate' to employ forwardness as part of its calculation.
5
+
3
6
  ## 1.0.5, 11 August 2013
4
7
  * Added 'separate', a predictive collision-avoidance steering behavior
5
8
 
@@ -26,33 +26,35 @@ class SteeringBehaviors::Separation
26
26
  cpa_dist = (char_pos_at_cpa - other_pos_at_cpa).length
27
27
  return SteeringBehaviors::VEC_ZERO if cpa_dist > danger_radius
28
28
 
29
+ offset_vec = other_kinematic.position_vec - character_kinematic.position_vec
30
+ unit_offset = offset_vec.normalize
31
+ forwardness = unit_offset.dot(character_kinematic.heading_vec)
29
32
  parallelness = character_kinematic.heading_vec.dot(other_kinematic.heading_vec)
30
33
 
31
34
  side_vec = character_kinematic.heading_vec.perpendicular
32
- val = 0
33
35
 
34
36
  if parallelness < -0.707
35
- # anti-parallel, head-on paths
36
- # steer away from the threat's future posn
37
+ # anti-parallel, head-on paths; steer away from the threat's future pos
38
+ puts "Head-on, steering away from future pos"
37
39
  offset_vec = other_pos_at_cpa - character_kinematic.position_vec
38
40
  side_dot = offset_vec.dot(side_vec)
39
- val = (side_dot > 0 ? -1.0 : 1.0)
40
- # puts "Head-on, steering away from future pos"
41
41
  elsif parallelness > 0.707
42
42
  # parallel paths; steer away from threat
43
- offset_vec = other_kinematic.position_vec - character_kinematic.position_vec
43
+ puts "Parallel, steering away from other guy"
44
44
  side_dot = offset_vec.dot(side_vec)
45
- val = (side_dot > 0 ? -1.0 : 1.0)
46
- # puts "Parallel, steering away from other guy"
47
45
  else
48
46
  # perpendicular paths; steer behind threat
49
- if other_kinematic.speed <= character_kinematic.speed
50
- side_dot = side_vec.dot(other_kinematic.velocity_vec)
51
- val = (side_dot > 0 ? -1.0 : 1.0)
52
- # puts "Perpendicular, steering behind other guy"
47
+ side_dot = other_kinematic.velocity_vec.dot(side_vec)
48
+ if forwardness < 0.707
49
+ puts "Perpendicular, steering ahead of other guy"
50
+ side_dot *= -1
51
+ else
52
+ puts "Perpendicular, steering behind other guy"
53
53
  end
54
54
  end
55
55
 
56
+ val = (side_dot > 0 ? -1.0 : 1.0)
57
+
56
58
  return side_vec * val
57
59
 
58
60
  end
data/test/vector_test.rb CHANGED
@@ -277,6 +277,56 @@ class VectorTest < MiniTest::Unit::TestCase
277
277
  assert_equal(0.86603810567665, @v1.clamped_dot(@v2))
278
278
  end
279
279
 
280
+ def test_dot_product_commutability
281
+ @v1 = SteeringBehaviors::Vector.new(0.5, 1)
282
+ @v2 = SteeringBehaviors::Vector.new(1.0, 0.5)
283
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
284
+
285
+ @v1 = SteeringBehaviors::Vector.new(1.0, 1.0)
286
+ @v2 = SteeringBehaviors::Vector.new(1.0, 1.0)
287
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
288
+
289
+ @v1 = SteeringBehaviors::Vector.new(0.708, 0.707)
290
+ @v2 = SteeringBehaviors::Vector.new(0.707, 0.707)
291
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
292
+
293
+ @v1 = SteeringBehaviors::Vector.new(1.0, 0)
294
+ @v2 = SteeringBehaviors::Vector.new(0, 1.0)
295
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
296
+
297
+ @v1 = SteeringBehaviors::Vector.new(0, 1.0)
298
+ @v2 = SteeringBehaviors::Vector.new(-1.0, 0)
299
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
300
+
301
+ @v1 = SteeringBehaviors::Vector.new(0, 1.0)
302
+ @v2 = SteeringBehaviors::Vector.new(0.707, 0.707)
303
+ @v2.normalize!
304
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
305
+
306
+ @v1 = SteeringBehaviors::Vector.new(1.0, 0)
307
+ @v2 = SteeringBehaviors::Vector.new(-0.707, 0.707)
308
+ @v2.normalize!
309
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
310
+
311
+ @v1 = SteeringBehaviors::Vector.new(1.0, 0)
312
+ @v2 = SteeringBehaviors::Vector.new(-0.707, -0.707)
313
+ @v2.normalize!
314
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
315
+
316
+ @v1 = SteeringBehaviors::Vector.new(0.5, 0.866)
317
+ @v1.normalize!
318
+ @v2 = SteeringBehaviors::Vector.new(0.866, 0.5)
319
+ @v2.normalize!
320
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
321
+
322
+ @v1 = SteeringBehaviors::Vector.new(500, 500)
323
+ @v2 = SteeringBehaviors::Vector.new(-14, 75)
324
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
325
+
326
+ @v1 = SteeringBehaviors::Vector.new(-0.5, -0.5)
327
+ @v2 = SteeringBehaviors::Vector.new(2.2, 2.2)
328
+ assert_equal(@v2.dot(@v1), @v1.dot(@v2))
329
+ end
280
330
 
281
331
  def test_perpendicular
282
332
  @v2 = @v.perpendicular
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: steering_behaviors
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.5
5
+ version: 1.0.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Powell