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 +3 -0
- data/lib/steering_behaviors/separation.rb +14 -12
- data/test/vector_test.rb +50 -0
- metadata +1 -1
data/CHANGELOG.md
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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
|