steering_behaviors 1.0.5 → 1.0.6

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