private void TimerStrategy_Elapsed(object sender, ElapsedEventArgs e) { if (isLocked == false) { lock (strategyLock) { isLocked = true; InitRobotRoleDeterminationZones(); //Le joueur détermine sa stratégie sw.Restart(); DetermineRobotRole(); //if (displayConsole) Console.WriteLine("Tps calcul détermination des rôles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); IterateStateMachines(); //if (displayConsole) Console.WriteLine("Tps calcul State machines : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); GenerateStrategyHeatMap(); //if (displayConsole) Console.WriteLine("Tps calcul Heatmap Destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); var optimalPosition = GetOptimalStrategyDestination(); //if (displayConsole) Console.WriteLine("Tps calcul Get Optimal Destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); List <LocationExtended> obstacleList = new List <LocationExtended>(); double seuilDetectionObstacle = 0.4; //Construction de la liste des obstacles en enlevant le robot lui-même lock (globalWorldMap) { if (globalWorldMap.obstacleLocationList != null) { foreach (var obstacle in globalWorldMap.obstacleLocationList) { if (Toolbox.Distance(new PointD(obstacle.X, obstacle.Y), new PointD(robotCurrentLocation.X, robotCurrentLocation.Y)) > seuilDetectionObstacle) { obstacleList.Add(obstacle); } } } if (globalWorldMap.teammateLocationList != null) { foreach (var teammate in globalWorldMap.teammateLocationList) { if (teammate.Key != robotId) { obstacleList.Add(new LocationExtended(teammate.Value.X, teammate.Value.Y, 0, 0, 0, 0, ObjectType.Robot)); } } } } // if (displayConsole) Console.WriteLine("Tps calcul Génération obstacles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); OnHeatMapStrategy(robotId, strategyHeatMap); // if (displayConsole) Console.WriteLine("Tps envoi strat Heatmap : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); ///On copie la heatmap de strategy dans la heatmap de waypoint pour la compléter sans abimer la première CopyStrategyHeatMapToWayPointHeatMap(); /// Calcul de la HeatMap WayPoint WayPointHeatMap.ExcludeMaskedZones(new PointD(robotCurrentLocation.X, robotCurrentLocation.Y), obstacleList, ObstacleAvoidanceDistance); //if (displayConsole) Console.WriteLine("Tps calcul zones exclusion obstacles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); OnHeatMapWayPoint(robotId, WayPointHeatMap); //if (displayConsole) Console.WriteLine("Tps calcul HeatMap WayPoint : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); var optimalWayPoint = GetOptimalWayPointDestination(); //if (displayConsole) Console.WriteLine("Tps calcul Get Optimal Waypoint : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart(); //Mise à jour de la destination if (optimalPosition == null) { OnDestination(robotId, new Location((float)robotCurrentLocation.X, (float)robotCurrentLocation.Y, (float)robotOrientation, 0, 0, 0)); } else { OnDestination(robotId, new Location((float)optimalPosition.X, (float)optimalPosition.Y, (float)robotOrientation, 0, 0, 0)); } if (optimalWayPoint == null) { OnWaypoint(robotId, new Location((float)robotCurrentLocation.X, (float)robotCurrentLocation.Y, (float)robotOrientation, 0, 0, 0)); } else { OnWaypoint(robotId, new Location((float)optimalWayPoint.X, (float)optimalWayPoint.Y, (float)robotOrientation, 0, 0, 0)); } //if (displayConsole) Console.WriteLine("Tps events waypoint et destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); // Affichage de la mesure //if (displayConsole) Console.WriteLine("Tps calcul Global Stratégie : " + swGlobal.Elapsed.TotalMilliseconds.ToString("N4") + " ms \n\n"); // Affichage de la mesure globale //Thread.Sleep(100); isLocked = false; } } else { Console.WriteLine("Calcul de strategie déjà en cours"); } }