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 +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
|