/// <summary> /// Decide on action to be taken for each rod /// </summary> /// <param name="currentCoordinates">Current ball coordinates and vector</param> /// <returns>List of actions per each rod</returns> public List <RodAction> Decide(BallCoordinates currentCoordinates) { if (!IsInitialized) { Initialize(); } if (currentCoordinates == null) { throw new ArgumentException(String.Format("[{0}] Coordinates received from vector calculation unit are null", MethodBase.GetCurrentMethod().Name)); } //Convert pts and pts/sec to mm and mm/sec currentCoordinates = _surveyor.PtsToMm(currentCoordinates); //Calculate Actual Possible Action Time DateTime timeOfAction = DateTime.Now + SystemDelays; //Calculate ball future coordinates BallCoordinates bfc = _predictor.FindBallFutureCoordinates(currentCoordinates, timeOfAction); List <RodAction> actions = new List <RodAction>(); foreach (IRod rod in _controlledRods) { //Calculate dynamic sectors rod.CalculateDynamicSector(currentCoordinates); //Draw dynamic sector, better to use on one rod at a time because together is chaos on the screen Marks.DrawSector(rod.RodType, rod.DynamicSector); //Calculate intersection point rod.CalculateSectorIntersection(bfc); //Decide on action RodAction action = _decisionTree.Decide(rod, bfc); actions.Add(action); //if (rod.RodType == eRod.GoalKeeper) Log.Common.Debug(action.Linear + ": " + action.DcCoordinate); } return(actions); }
public void FindBallFutureCoordinates_BallCoordinatesVectorNull() { //arrange BallCoordinates currentCoordinates = new BallCoordinates(100, 100, DateTime.Now); DateTime actionTime = DateTime.Now + TimeSpan.FromSeconds(5); //act BallCoordinates actualCoordinates = _testAsset.FindBallFutureCoordinates(currentCoordinates, actionTime); //assert Assert.AreEqual(currentCoordinates.X, actualCoordinates.X); Assert.AreEqual(currentCoordinates.Y, actualCoordinates.Y); Assert.AreEqual(actionTime, actualCoordinates.Timestamp); Assert.IsNull(actualCoordinates.Vector); }