< Summary

Class:MaxSpeedAssignment
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/Assignment/MaxSpeedAssignment.cs
Covered lines:14
Uncovered lines:1
Coverable lines:15
Total lines:40
Line coverage:93.3% (14 of 15)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:2
Method coverage:100% (2 of 2)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MaxSpeedAssignment(...)0%110100%
CalculateSpeedLoss(...)0%10.2410086.67%

File(s)

/github/workspace/Assets/Scripts/Assignment/MaxSpeedAssignment.cs

#LineLine coverage
 1using UnityEngine;
 2
 3// The maximum speed assignment assigns hierarchical agents to hierarchical agents by maximizing the
 4// overall intercept speed. The assignment cost is defined as the agent's fractional speed loss
 5// during the maneuver.
 6public class MaxSpeedAssignment : CostBasedAssignment {
 7  // Minimum fractional speed to prevent division by zero.
 8  private const float _minFractionalSpeed = 1e-6f;
 9
 10  public MaxSpeedAssignment(AssignDelegate assignFunction)
 311      : base(CalculateSpeedLoss, assignFunction) {}
 12
 3113  private static float CalculateSpeedLoss(IHierarchical hierarchical, IHierarchical target) {
 3114    if (hierarchical is not HierarchicalAgent hierarchicalAgent) {
 015      return 0;
 16    }
 17
 3118    IAgent agent = hierarchicalAgent.Agent;
 19    // The speed decays exponentially with the traveled distance and with the bearing change.
 3120    float distanceTimeConstant = 2 * (agent.StaticConfig.BodyConfig?.Mass ?? 0) /
 21                                 (Constants.CalculateAirDensityAtAltitude(agent.Position.y) *
 22                                  (agent.StaticConfig.LiftDragConfig?.DragCoefficient ?? 0) *
 23                                  (agent.StaticConfig.BodyConfig?.CrossSectionalArea ?? 0));
 3124    float angleTimeConstant = agent.StaticConfig.LiftDragConfig?.LiftDragRatio ?? 1;
 25    // During the turn, the minimum radius dictates the minimum distance needed to make the turn.
 3126    float minTurningRadius = agent.Velocity.sqrMagnitude / agent.MaxNormalAcceleration();
 27
 3128    Vector3 directionToTarget = target.Position - agent.Position;
 3129    float distanceToTarget = directionToTarget.magnitude;
 3130    float angleToTarget = Vector3.Angle(agent.Velocity, directionToTarget) * Mathf.Deg2Rad;
 31    // The fractional speed is the product of the fractional speed after traveling the distance and
 32    // of the fractional speed after turning.
 3133    float fractionalSpeed =
 34        Mathf.Exp(-((distanceToTarget + angleToTarget * minTurningRadius) / distanceTimeConstant +
 35                    angleToTarget / angleTimeConstant));
 36    // Prevent division by zero.
 3137    fractionalSpeed = Mathf.Max(fractionalSpeed, _minFractionalSpeed);
 3138    return agent.Speed / fractionalSpeed;
 3139  }
 40}