class AngleRangeGenerator {

	public List<AngleRange> findCoveredAngleRanges()
	{
		List<AngleRange> coveredAngles = new ArrayList<>();

		ITriangle triangle = createTriangle();
		IVector2 endCenter = TriangleMath.bisector(start, endLeft, endRight);
		IVector2 startToEndCenter = endCenter.subtractNew(start);

		List<MovingRobot> robots = movingRobots.entrySet().stream()
				.filter(entry -> !excludedBots.contains(entry.getKey()))
				.map(Map.Entry::getValue)
				.collect(Collectors.toList());
		for (MovingRobot movingRobot : robots)
		{
			double distBotToStart = movingRobot.getPos().distanceTo(start);
			double timeBallToBot = ballConsultant.getTimeForKick(distBotToStart, kickSpeed) + timeToKick;
			double horizon = Math.max(0, timeBallToBot - timeForBotToReact);
			ICircle obstacleCircle = movingRobot.getMovingHorizon(horizon);
			List<IVector2> intersections = obstacleCircle.tangentialIntersections(start);
			if (triangle.isPointInShape(movingRobot.getPos())
					|| intersections.stream().anyMatch(triangle::isPointInShape))
			{
				addAngleRange(coveredAngles, startToEndCenter, intersections);
			}
		}

		return coveredAngles;
	}

}